进程描述符指针与Linux内核中的当前宏不匹配

时间:2011-10-05 01:47:19

标签: linux-kernel

我使用内核堆栈的esp值来计算进程描述符指针值。 根据ULK的书,我只需要掩盖esp的13个最低有效位来获得thread_info结构的基址。 我的测试是:

  1. 编写内核模块,因为我需要获取内核堆栈的值
  2. 在内核init函数中,获取内核堆栈的值
  3. 使用以下公式获取在CPU上运行的进程的进程描述符指针:*((unsigned int*) esp & 0xffffe000)
  4. 使用当前宏,打印出其值。
  5. 我认为step3的值应该与步骤4的值相同。

    但我的实验结果显示:有时它们是相同的,有时它们是不同的。可以解释为什么吗?或者我错过了什么?

2 个答案:

答案 0 :(得分: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;

现在,您可以将my_currentcurrent()进行比较。

答案 1 :(得分:0)

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