现在我正在阅读 Robert Love 的《Linux Kernel Development 3d Edition》一书。在那里,他写了包含指向 task_struct 结构的指针的 thread_info 结构,据我所知,它位于进程内核堆栈的底部或顶部(取决于架构)。直到最近我才熟悉 Linux 内核 API,也不知道 current() 方法的存在。书中有一段摘录与 current() 方法的实际工作原理有关:
在 x86 上,通过屏蔽堆栈指针的 13 个最低有效位来计算 current 以获得 thread_info 结构。这是由 current_thread_info() 函数完成的。这里显示了程序集:movl $-8192, %eax andl % esp, %eax 这里假设栈大小为 8KB。当 4KB 栈被启用时,4096 被用来代替 8192。
我的问题是:
- 据我所知,如果我们将十进制值表示为一组位,那么该组中只有一个最低有效位,不是吗?
- 神奇的数字13是什么?
对于那些将阅读本主题的人来说,我提出的问题可能会导致作者没有正确理解内存分配和管理过程的结论。好的,这可能是正确的,因为在我看来,我可以将分配给堆栈的内存表示为充满位(或字节)的功能区。所有这些字节都可以由一个特定的内存地址访问,表示为一些十进制值。栈的起点是最低内存地址,栈尾是内存地址的最高值。但是如何,我们如何才能获得指向位于堆栈末尾的 thread_info 结构的指针,仅通过屏蔽位于任意位置的堆栈指针的 13 个最低有效位(如果我理解正确,我们屏蔽了堆栈的位指针 ADDRESS 表示为十进制值)。