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

来源:互联网 发布:ubuntu安装数据库 编辑:程序博客网 时间:2024/06/05 09:15

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


 

原创粉丝点击