现在的位置: 首页 > 综合 > 正文

启动进程流程

2014年10月31日 ⁄ 综合 ⁄ 共 767字 ⁄ 字号 评论关闭

LINUX启动进程时设置了CS,ESP等各个寄存器的值,这是相应的宏:

void
start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
{
 loadsegment(fs, 0);
 loadsegment(es, 0);
 loadsegment(ds, 0);
 load_gs_index(0);
 regs->ip  = new_ip;
 regs->sp  = new_sp;
 percpu_write(old_rsp, new_sp);
 regs->cs  = __USER_CS;
 regs->ss  = __USER_DS;
 regs->flags  = 0x200;
 set_fs(USER_DS);
 /*
  * Free the old FP and other extended state
  */
 free_thread_xstate(current);
}
EXPORT_SYMBOL_GPL(start_thread);

 

这是__USER_CS在X386架构的定义:

#define GDT_ENTRY_DEFAULT_USER_CS 6

#define __USER_CS     (GDT_ENTRY_DEFAULT_USER_CS* 8 + 3)

 

现在看一下保护模式下的段寄存器的具体定义:

 

15                         32      1           0   

            index              T        RPL

 

RPL:Request Privilege Level

T:0=GDT 1=LDT

 

这里__USER_CS等于:

__USER_CS = 6 * 8 + 3 = 48 + 3 = 51

 

00110011 RPL= 11 T = 0 (GDT) INDEX=110(6)

抱歉!评论已关闭.