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

发布于 2024-12-08 09:09:06 字数 383 浏览 0 评论 0原文

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

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

我认为步骤3的值应该与步骤4的值相同。

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

I am using the esp value of kernel stack to calculate the process descriptor pointer value.
According to ULK book, I just need to mask 13 least significant bits of esp to obtain the base address of the thread_info structure.
My test is:

  1. write a kernel module because I need to get value of kernel stack
  2. In the kernel init function, get the value of kernel stack
  3. use following formula to get the process descriptor pointer of the process running on the CPU: *((unsigned int*) esp & 0xffffe000)
  4. use the current macro, print out its value.

I think the value of step3 should be same as the value of step 4.

But my experiment results shows: sometimes they are same, and sometimes they are different. Could any explain why? Or am I missing anything?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

人间不值得 2024-12-15 09:09:06

这是因为在内核堆栈的底部,您将找到一个 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() 进行比较。

This is because at the base of the kernel stack you will find a struct thread_info instance (platform dependent) and not a struct task_struct. The current() macro provides a pointer to the current task_struct.

Try the following:

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

Now you can compare my_current with current().

装迷糊 2024-12-15 09:09:06

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

Finally, I solved this problem. Everything is correct expect for the size of kernel stack. My kernel use 4KB stack instead of 8KB stack. So I just need to mask low 12 bits of the ESP.
Thanks for all the suggestions and answer!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文