启动进程流程

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值