您的位置:首页 > 运维架构 > Linux

linux进程启动时段寄存器的初始化 及意义

2007-07-06 14:20 316 查看
#define start_thread(regs,new_rip,new_rsp) do { /
asm volatile("movl %0,%%fs" :: "r" (0)); /
asm volatile("movl %0,%%es; movl %0,%%ds": :"r" (__USER32_DS)); /
load_gs_index(0); /
(regs)->rip = (new_rip); /
(regs)->rsp = (new_rsp); /
(regs)->eflags = 0x200; /
(regs)->cs = __USER32_CS; /
(regs)->ss = __USER32_DS; /
set_fs(USER_DS); /
} while(0)

下面是关于段描述符的定义及解释

#define __USER32_CS 0x23 /* 4*8+3 */ //NO. of GDT is 0x20/8=4 ti=0(GDT) RPL = 3 //USER
#define __USER_DS 0x2b /* 5*8+3 */ //NO. of GDT is 0x28/8=5 ti=0(GDT) RPL = 3 //USER

下面分别是GDT的第4、5个描述符项的内容(4、5代表当前进程的代码段、数据段)

.quad 0x0000000000000000 /* 0x00 reserved */
.quad 0x0000000000000000 /* 0x08 reserved */

.quad 0x00cf9a000000ffff /* 0x10 kernel 4GB code at 0x00000000 */
.quad 0x00cf92000000ffff /* 0x18 kernel 4GB data at 0x00000000 */
.quad 0x00cffa000000ffff /* 0x23 user 4GB code at 0x00000000 */
.quad 0x00cff2000000ffff /* 0x2b user 4GB data at 0x00000000 */

BO-BIS 、B16-B31 都是0 基地址为0;LO-LlS 、Ll6- Ll 9都是l段的上限全是Oxftfff;

G 位都足1 段长单位均为4KB;D 位都是1 四个段的访问都是 3 2 位指令:P 位都是1 四个段都在内存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: