【问题标题】:process descriptor pointer doesn't match current macro in Linux Kernel进程描述符指针与 Linux 内核中的当前宏不匹配
【发布时间】:2011-10-05 01:47:19
【问题描述】:

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

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

我觉得 step3 的值应该和 step 4 的值一样。

但我的实验结果表明:有时它们相同,有时它们不同。有谁能解释为什么?还是我错过了什么?

【问题讨论】:

标签: linux-kernel


【解决方案1】:

这是因为在内核堆栈的底部,您会找到一个struct thread_info 实例(取决于平台),而不是一个struct task_structcurrent() 宏提供指向当前task_struct 的指针。

尝试以下方法:

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

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

【讨论】:

  • 你的代码和:*((unsigned int*) esp & 0xffffe000)是一样的,因为thread_info的第一个字段是task。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多