linux内核开发

tbh*_*tbh 9 linux assembly kernel

我目前正在阅读Robert Love的"Linux内核开发",我不明白这个程序集正在做什么.

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

movl $-8192, %eax
andl %esp, %eax
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

lij*_*jie 5

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