Linux内核开发

10

我正在阅读Robert Love的《Linux内核开发》一书,但不理解这段汇编代码的作用。

在每个进程内核栈中,都有一个位于栈末的struct thread_info结构体。在x86架构上,我们可以通过以下汇编语言获取它(假设栈大小为8KB):

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

基本上是将堆栈指针与0xffffe000进行AND运算。我不明白这里到底发生了什么?我不明白为什么屏蔽%esp的最低有效的13位就可以让我们访问结构体。我知道一旦解释清楚,我会感到很愚蠢的,但它一直在困扰着我。

谢谢。


我目前正在阅读这本书,我有一个更基础的问题:你怎么知道“-8192”是“0xffffe000”?负数是如何存储在CPU寄存器中的? - patryk.beza
@patryk.beza 负数以1的补码和2的补码形式存储在此处阅读更多 - Chaitanya Tetali
1个回答

5

栈向下增长,因此栈的末尾是栈中最低地址,也是结构体的起始地址。而且栈以8KB的倍数存储。因此,清除13个最低有效位可以得到栈的最低地址,从而得到结构体的起始位置。这样讲明白了吗?


但是我以为%esp指向栈的底部?当结构体被推入栈时,%esp会递减。 - tbh
栈从高内存地址开始(当元素被压入时,栈指针会减少)。%esp指向栈底,它指向“当前”底部,而不是栈允许增长的空间底部。 - lijie
啊,我以为结构体只是在所有东西的最后被推入而不是在进程初始化时就被塞到栈的深处并分配自己的栈。好的,谢谢理解。 - tbh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接