gpt4 book ai didi

linux - 如何解释 %gs :0x14?

转载 作者:太空狗 更新时间:2023-10-29 12:17:45 28 4
gpt4 key购买 nike

我对 x86 汇编中冒号的使用有点困惑。我知道在实模式下 %gs:0x14 将是 %gs 的地址左移 4 位并加上 0x14。但是在保护模式下是一样的吗?例如在保护模式下,

movl %gs:0x14 %eax 

以什么方式访问%gs:0x14?它类似于 0x14(%gs) 还是与实模式相同?

更新: 为了让我的问题更清楚,假设 %gs = 0x1234 在指令 movl %gs:0x14 %eax 之后 %eax 的值是多少。

更多信息:

刚刚发现这个文档对gs和fs在不同系统中的功能有用 http://www.akkadia.org/drepper/tls.pdf

此链接提供有关段:偏移地址的信息。

http://thestarman.pcministry.com/asm/debug/Segments.html

最佳答案

首先,让我们来了解一下条款。似乎您通常使用“保护模式”,而不是实模式。但是,至少在 Intel 手册中,该术语仅适用于 32 位模式。对于 64 位模式,他们使用了一个糟糕的营销术语“IA-32e 模式”,与 AMD 的“长模式”相比,这太可怕了,但两者仍然隐藏了一个事实,即 64 位模式也是 protected 模式。

这个区别很重要,因为 %gs 的处理对于 32 位和 64 位保护模式是不同的。对于 32 位,它是另一个段寄存器。线程切换代码用同一虚拟空间中当前线程的段基数填充它,因此,与 {CS,DS,ES,SS} 不同,它的基数在平面模式下不为零。对于 64 位,它只是一个保存在处理器 MSR 中的偏移量,并且还被调度程序更改为当前线程 TLS 地址。 (Linux/*BSD/Windows/etc 之间的细节可能不同。%fs 和 %gs 中的哪一个用于什么角色。)但是,作为一个常见的结果,当看到像 %gs:0x14 这样的访问时,你应该意识到

  • 获取 GS 基地址(如上所述,使用 32 位的通用方法和 64 位环境的基于 MSR 的特殊处理)
  • 0x14 添加到这个地址

这就是你需要知道的全部,除非你开发内核或其他深度系统的东西,例如 Wine 。

关于linux - 如何解释 %gs :0x14?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20717890/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com