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个最低有效位,就可以获得
线程信息
结构的基址。 我的测试是:

  • 编写一个内核模块,因为我需要获取内核堆栈的值
  • 在内核初始化函数中,获取内核堆栈的值
  • 使用以下公式获取在CPU上运行的进程的进程描述符指针:
    *((unsigned int*)esp&0xffffe000)
  • 使用当前宏,打印其值 我认为步骤3的值应该与步骤4的值相同


    但我的实验结果表明:有时它们是相同的,有时它们是不同的。能解释一下原因吗?还是我遗漏了什么?

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