我使用内核堆栈的esp
值来计算进程描述符指针值。
根据ULK的书,我只需要掩盖esp
的13个最低有效位来获得thread_info
结构的基址。
我的测试是:
*((unsigned int*) esp & 0xffffe000)
我认为step3的值应该与步骤4的值相同。
但我的实验结果显示:有时它们是相同的,有时它们是不同的。可以解释为什么吗?或者我错过了什么?
答案 0 :(得分:1)
这是因为在内核堆栈的基础上,您会发现struct thread_info
实例(取决于平台)和不 a struct task_struct
。 current()
宏提供指向当前task_struct
的指针。
尝试以下方法:
struct thread_info *info = (struct thread_info*)(esp & 0xfffe000);
struct task_struct *my_current = info->task;
现在,您可以将my_current
与current()
进行比较。
答案 1 :(得分:0)
最后,我解决了这个问题。对于内核堆栈的大小,一切都是正确的。我的内核使用4KB堆栈而不是8KB堆栈。所以我只需要掩盖ESP的低12位。 感谢所有的建议和答案!