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

#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 四个段都在内存。


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值