现在我正在阅读Robert Love编写的“Linux Kernel Development 3d Edition”一书。在那里,他写了关于thread_info结构,其中包含指向task_struct结构的指针,据我所知,它位于进程内核堆栈的底部或顶部(取决于体系结构)。直到最近我还不熟悉Linux内核API,并且我不知道current()方法的存在。有从与所述书的摘录如何电流()方法的实际工作:了解从进程内核堆栈获取task_struct指针
在x86上,电流是通过掩蔽出栈 指针的13至少-显著比特以获得所述的thread_info structure.This计算是由 current_thread_info()函数完成的。此程序集显示如下: movl $ -8192,%eax andl%esp,%eax 这假定堆栈大小为8KB。启用4KB堆栈时,使用4096在 代替8192.
我的问题是:
- 据我所知,如果我们有一个十进制值表示为一组位,那么在该集中只有一个最低有效位,不是吗?
- 什么是神奇的13号?
对于谁会阅读本主题,我所提出的问题可能会导致作者不能正确理解内存分配和管理过程的结论。好吧,这可能是正确的,因为在我看来,我可以表示为堆栈分配的内存作为完整的位(或字节)。所有这些字节都可以通过一个特定的内存地址来访问,这个地址表示为一些十进制值堆栈的起源是最低的内存地址,堆栈的最高位是内存地址的最高值。但是,怎样才能得到指向位于堆栈末端的thread_info结构的指针,只需通过掩盖位于堆栈指针的ARBITRARY的13个最低有效位(如果我理解正确的话,我们可以屏蔽掉堆栈指针ADDRESS以十进制值表示)。
提示:2为13 = 8192的幂(即栈的大小),十进制值-8192为十六进制0xFFFFE000(如2补足平台上的32位所表示的那样)。 – nos 2012-08-14 22:18:03
你几次说“十进制值” - 你可能会更好地考虑二进制值,特别是试图了解掩蔽如何工作。 – mpe 2012-08-15 13:32:48