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

zjd358 2009-04-29 08:10:28

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

#define move_to_user_mode() \
__asm__ ("movl %%esp,%%eax\n\t" \
"pushl $0x17\n\t" \ //“首先将堆栈段选择符(SS)入栈”, 这里入栈的为什么是个直接数 0x17
"pushl %%eax\n\t" \
"pushfl\n\t" \
"pushl $0x0f\n\t" \ //“将Task0代码段选择符(cs)入栈”, 这里入栈的是直接数0x0f怎么代表了Task0代码段选择cs?
"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")
...全文
406 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
biyeqingfeng 2011-12-13
  • 打赏
  • 举报
回复
$0x17是指选择符,展开的话就是000..010 111右起前两位是优先级,第三位为1表示在ldt中,所以是任务段而不是内核段,右起第4位开始为ldt中的偏移量,因为ldt中的第一项为null,第二项为代码段,第三段为数据堆栈段,因此偏移量为0000..10。下面的0x0f也是这个道理。

另外,我有个问题求教:movl %%esp,%%eax这一句,后文直接将内核态的eax压栈了,也就是说将内核态的eax放到用户态继续使用,难道需要保证内核态的esp与用户态的esp始终一致,否则再切换回去的话会不会堆栈出错?
josling 2009-05-03
  • 打赏
  • 举报
回复
楼上已经说得很清楚了,就是 堆栈段和代码段的描述符
yasky1001 2009-05-03
  • 打赏
  • 举报
回复
这个你看一下16位段选择子的构成就明白了.看看SS段和CS段在段描述符表中的入口位置.
liliangbao 2009-04-29
  • 打赏
  • 举报
回复
帮顶~
morris88 2009-04-29
  • 打赏
  • 举报
回复
核心只值 20 分,好复杂哦...

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧