2011-10-05 45 views
3

我正在使用内核堆栈的esp值来计算进程描述符指针值。 根据ULK书,我只需要屏蔽esp的13个最低有效位,以获得thread_info结构的基地址。 我的测试是:进程描述符指针与Linux内核中的当前宏不匹配

  1. 编写内核模块,因为我需要的内核堆栈
  2. 的值在内核初始化函数,得到的内核堆栈
  3. 使用的值下面的公式来获取进程描述符运行在CPU上的进程的指针:*((unsigned int*) esp & 0xffffe000)
  4. 使用当前宏,打印出其值。

我认为第3步的价值应该是同步骤4

的价值,但我的实验结果表明:有时他们是相同的,有时它们是不同的。有没有解释为什么?或者我错过了什么?

+1

[Kernelnewbies描述了current()是如何工作的](http://kernelnewbies.org/FAQ/current),可能会有所帮助。 – sarnold

回答

0

最后,我解决了这个问题。对于内核堆栈的大小,一切都是正确的。我的内核使用4KB堆栈而不是8KB堆栈。所以我只需要屏蔽ESP的低12位。 感谢您的所有建议和答案!

1

这是因为在内核堆栈的基础上,您会发现一个struct thread_info实例(依赖于平台)和而不是 a struct task_structcurrent()宏提供了一个指向当前的task_struct的指针。

尝试以下操作:

struct thread_info *info = (struct thread_info*)(esp & 0xfffe000); 
struct task_struct *my_current = info->task; 

现在你可以用current()比较my_current

+0

您的代码与*((unsigned int *)esp&0xffffe000)相同,因为thread_info的第一个字段是task。 –