linux中的一个问题,请大侠们帮忙解释一下,谢谢!

Aaron_Jerry 2010-12-04 10:30:20
linux内核源代码情景分析的进程与进程调度一章中有如下一段代码:

获取当前进程的task_struct结构
static inline struct task_struct * get_current(void)
{
struct task_struct *current;
__asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL));
return current;
}

书中说这行汇编代码是将当前的堆栈指针寄存器ESP的内容与8191UL相“与”而得到当前进程task_struct结构的起始地址。

进程的task_struct结构与进程系统空间堆栈的关系如下:

------------------ --
| | |
| | |
| | |
| | |
| |
| | 7K 系统空间堆栈
两个连续的物理页面 8K ------------------
| | |
| | |
| | |
| | |
------------------ --
| | 1K task_struct结构
------------------

我的理解是:
将当前的堆栈指针寄存器ESP的内容 + 8191 就得到当前进程task_struct结构的起始地址。

请帮忙解释下,谢谢!
...全文
94 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hrx1989 2010-12-05
  • 打赏
  • 举报
回复
厉害呀。。。
我还没有开始看内核呢!!
loverong13 2010-12-04
  • 打赏
  • 举报
回复
功力不错啊,看2.4的内核了,你只截取片段没看过这个书的真的是不好理解。
应该这样理解,将ESP的内容和8191UL的反码按位进行和操作,之后再把结果赋值给current,其中8191UL=8192-1=2^13-1,计算过程如下:

8192UL=2^13 0000 0000 0000 0000 0010 0000 0000 0000
8191UL 0000 0000 0000 0000 0001 1111 1111 1111
~8191UL(反码) 1111 1111 1111 1111 1110 0000 0000 0000
0xc2343ffe 1100 0010 0011 0100 0011 1111 1111 1110
andl结果: 1100 0010 0011 0100 0010 0000 0000 0000
|| (对照着看)
0x c 2 3 4 2 0 0 0

所以按位和操作之后的结果位0xc2342000,正好是struct task_struct结构的地址指针.通过观察可知,只要符合0xc2342xxx 、0xc2343xxx的地址指针经过相同的计算,都能得到内核进程任务结构的指针。
希望对你有所帮助,加油!
Aaron_Jerry 2010-12-04
  • 打赏
  • 举报
回复
晕倒,这图怎么变成这样的了。
那我就用文字大致描述下吧:
7K 系统空间堆栈

1K task_struct结构

这8k空间位于两个连续的物理页面中。

70,021

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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