进程描述符指针与 Linux 内核中的当前宏不匹配
我使用内核堆栈的 esp 值来计算进程描述符指针值。 根据ULK书,我只需要屏蔽esp
的13个最低有效位即可获得thread_info
结构的基地址。 我的测试是:
- 编写一个内核模块,因为我需要获取内核堆栈的值
- 在内核init函数中,获取内核堆栈的值
- 使用以下公式获取CPU上运行的进程的进程描述符指针:
* ((unsigned int*) esp & 0xffffe000)
- 使用当前宏,打印出它的值。
我认为步骤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:
- write a kernel module because I need to get value of kernel stack
- In the kernel init function, get the value of kernel stack
- use following formula to get the process descriptor pointer of the process running on the CPU:
*((unsigned int*) esp & 0xffffe000)
- 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是因为在内核堆栈的底部,您将找到一个
struct thread_info
实例(取决于平台),而不是一个struct task_struct
。current()
宏提供指向当前task_struct
的指针。请尝试以下操作:
现在您可以将
my_current
与current()
进行比较。This is because at the base of the kernel stack you will find a
struct thread_info
instance (platform dependent) and not astruct task_struct
. Thecurrent()
macro provides a pointer to the currenttask_struct
.Try the following:
Now you can compare
my_current
withcurrent()
.最后,我解决了这个问题。除了内核堆栈的大小之外,一切都是正确的。我的内核使用 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!