其实一个进程应该放到一个ldt中
先创建我们的ldt表
//ldt表 struct desc_struct ldt[3]; #define lldt() \ __asm__ ("movw $0x48,%%ax\n\t" \ "lldt %%ax\n\t" \ :::"ax") #define DA_LDT 0x82
下面的工作就是在gdt中设置ldt,然后在ldt中填充正确的值,最后加载ldt
//在gdt中设置ldt _set_gdt_desc(&gdt[9],&ldt[0],&ldt[0]+3*sizeof(struct desc_struct),DA_LDT); //ldt中的代码段,选择子0xf _set_gdt_desc(&ldt[1],0,0xffffffff,DA_C+DA_32+DA_DPL3); //ldt中的ring3堆栈段,选择子0x17 _set_gdt_desc(&ldt[2],0,0xffffffff,DA_DRWA + DA_32 + DA_DPL3); //加载lgtr lldt();
相应的move_to_user_mode中应该换成ldt中的描述符
#define move_to_user_mode() \ __asm__ ("movl %%esp,%%eax\n\t" \ "pushl $0x17\n\t" \ "pushl %%eax\n\t" \ "pushfl\n\t"\ "pushl $0xf\n\t" \ "pushl $testA\n\t" \ "iret\n" \ :::"ax")
同时set_registers稍作调整
#define set_registers() \ __asm__ ("movl $0x17,%%eax\n\t" \ "movw %%ax,%%ds\n\t" \ "movw %%ax,%%es\n\t" \ "movw %%ax,%%fs\n\t" \ "movw $0x10,%%ax\n\t" \ "movw %%ax,%%gs" \ :::"ax")