日期:2014-05-16  浏览次数:20789 次

内核新学求助:move_to_user_mode 宏没有看懂

赵博士在书中做了注释,我还是没有看懂。请高手指点一下。谢谢!

#define move_to_user_mode() \
__asm__ ("movl %%esp,%%eax\n\t" \
  "pushl $0x17\n\t" \ //“首先将堆栈段选择符(SS)入栈”, 这里入栈的为什么是个直接数 0x17[i][/i]?
  "pushl %%eax\n\t" \
  "pushfl\n\t" \
  "pushl $0x0f\n\t" \ //“将Task0代码段选择符(cs)入栈”, 这里入栈的是直接数0x0f怎么代表了Task0代码段选择cs?[i][/i]
  "pushl $1f\n\t" \
  "iret\n" \
  "1:\tmovl $0x17,%%eax\n\t" \
  "movw %%ax,%%ds\n\t" \
  "movw %%ax,%%es\n\t" \
  "movw %%ax,%%fs\n\t" \
  "movw %%ax,%%gs" \
  :::"ax")


------解决方案--------------------
这个你看一下16位段选择子的构成就明白了.看看SS段和CS段在段描述符表中的入口位置.