linux内核开发

时间:2010-11-28 15:58:07

标签: linux assembly kernel

我目前正在阅读罗伯特·洛夫的“Linux内核开发”,我不明白这个程序集正在做什么。

基本上,在每个进程内核堆栈中,都​​有一个struct thread_info,它位于堆栈的末尾。现在,在x86架构上,通过使用以下程序集,我们显然可以抓住这个(假设8KB堆栈大小)

movl $-8192, %eax
andl %esp, %eax

所以基本上将堆栈指针与0xffffe000进行AND运算。我很困惑这里发生了什么?我不明白为什么掩盖%esp的最不重要的13位将我们带到结构。我知道一旦得到解释我就会感到愚蠢,但这让我烦恼。

感谢。

1 个答案:

答案 0 :(得分:5)

堆栈向下增长,因此堆栈的末尾是堆栈中的最低地址,以及结构的起始地址。堆栈以8KB的倍数存储。因此,擦除13个最低有效位得到堆栈的最低地址,因此得到结构的开始。这有意义吗?