【问题标题】:linux kernel developmentlinux内核开发
【发布时间】:2023-03-29 11:20:01
【问题描述】:

我目前正在阅读 Robert Love 的“Linux Kernel Development”,但我不明白这部分汇编在做什么。

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

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

所以基本上是通过 0xffffe000 对堆栈指针进行与运算。我很困惑这里发生了什么?我不明白为什么屏蔽 %esp 的最低有效 13 位会将我们带到结构。我知道一旦被解释我会觉得很愚蠢,但这让我很烦。

谢谢。

【问题讨论】:

  • 我正在读这本书,我还有一个更基本的问题:你怎么知道-81920xffffe000?负数如何存储在 CPU 的寄存器中?
  • @patryk.beza 负数存储在1和2的补码Read more here

标签: linux assembly kernel


【解决方案1】:

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

【讨论】:

  • 但我以为 %esp 指向了栈底?当结构体最后被压入堆栈时,%esp 递减。
  • 堆栈从一个高内存地址开始(当东西被压入时,堆栈指针减少)。 %esp 指向堆栈的底部,因为它指向“当前”底部,而不是允许堆栈增长的空间的底部。
  • 啊,我以为结构只是在所有事情结束时才被推入,而不是在进程初始化并给定它自己的堆栈时直接推入堆栈的坑中。好的,谢谢李杰
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 2014-11-27
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
相关资源
最近更新 更多