我目前正在阅读罗伯特·洛夫的“Linux内核开发”,我不明白这个程序集正在做什么。
基本上,在每个进程内核堆栈中,都有一个struct thread_info
,它位于堆栈的末尾。现在,在x86架构上,通过使用以下程序集,我们显然可以抓住这个(假设8KB堆栈大小)
movl $-8192, %eax
andl %esp, %eax
所以基本上将堆栈指针与0xffffe000进行AND运算。我很困惑这里发生了什么?我不明白为什么掩盖%esp
的最不重要的13位将我们带到结构。我知道一旦得到解释我就会感到愚蠢,但这让我烦恼。
感谢。
答案 0 :(得分:5)
堆栈向下增长,因此堆栈的末尾是堆栈中的最低地址,以及结构的起始地址。堆栈以8KB的倍数存储。因此,擦除13个最低有效位得到堆栈的最低地址,因此得到结构的开始。这有意义吗?