Linux kernel 进程描述符指针不存在';与Linux内核中的当前宏不匹配
我使用内核堆栈的Linux kernel 进程描述符指针不存在';与Linux内核中的当前宏不匹配,linux-kernel,Linux Kernel,我使用内核堆栈的esp值来计算进程描述符指针值。 根据ULK book,我只需要屏蔽esp的13个最低有效位,就可以获得线程信息结构的基址。 我的测试是: 编写一个内核模块,因为我需要获取内核堆栈的值 在内核初始化函数中,获取内核堆栈的值 使用以下公式获取在CPU上运行的进程的进程描述符指针:*((unsigned int*)esp&0xffffe000) 使用当前宏,打印其值 我认为步骤3的值应该与步骤4的值相同 但我的实验结果表明:有时它们是相同的,有时它们是不同的。能解释一下原因吗?还是我
esp
值来计算进程描述符指针值。
根据ULK book,我只需要屏蔽esp
的13个最低有效位,就可以获得线程信息
结构的基址。
我的测试是:
*((unsigned int*)esp&0xffffe000)
但我的实验结果表明:有时它们是相同的,有时它们是不同的。能解释一下原因吗?还是我遗漏了什么?这是因为在内核堆栈的底部,您将找到一个
struct-thread\u-info
实例(依赖于平台),而不是struct-task\u-struct
。current()
宏提供指向当前任务结构的指针
请尝试以下操作:
struct thread_info *info = (struct thread_info*)(esp & 0xfffe000);
struct task_struct *my_current = info->task;
现在,您可以将
myu\u current
与current()
进行比较。最后,我解决了这个问题。除了内核堆栈的大小之外,一切都是正确的。我的内核使用4KB堆栈而不是8KB堆栈。所以我只需要屏蔽ESP的低12位。
谢谢你的建议和回答 这可能会有帮助。您的代码与:*((unsigned int*)esp&0xffffe000相同,因为线程信息的第一个字段是task。