【问题标题】:Using GS register from user level in X64 Linux在 X64 Linux 中从用户级别使用 GS 寄存器
【发布时间】:2019-10-06 08:13:42
【问题描述】:

我正在尝试使用%gs 寄存器在我的程序中保存一个临时值。我正在使用 LLVM pass 来插入写入和读取寄存器的汇编代码。当我使用%fs 时,一切正常。但是%fs 被少数程序/库使用,而%gs 不是。

当我将%fs 替换为%gs 时,即使是像mov %eax, %gs:0x0 这样的简单指令也会失败。

 mov    %rbx,%fs:0x0 //Works
 mov    %rbx,%gs:0x0 //Segmentation Fault. 

(另一方面,只要 %eax 中的值小于 4,mov %rbx, %gs 就可以工作。任何大于 4 的值都会导致分段错误)

如何在%gs 中创建段并使用它的段选择器,以便在程序中进一步使用。

机器描述:64 位 Ubuntu 16.04。 llvm-7.0.1

【问题讨论】:

  • 您正在寻找记录在案的、普遍可用的、方便的、未使用的存储。对不起。哪有这回事。一点额外的存储空间可以帮助提高性能,几十年来人们一直在努力提高性能。恐怕您唯一的选择是alloca,这不太方便。

标签: c++ llvm x86-64 cpu-registers memory-segmentation


【解决方案1】:

您使用的是什么 ABI?检查一下https://www.codemachine.com/article_x64deepdive.html“...但是在 X64 上,在用户模式下指向 TEB 的是 GS 寄存器...”

我会说这对于 X64 ABI 是不可能的。

【讨论】:

  • 感谢您的链接和回复。我正在使用 c++ 来编写 LLVM 通行证。此时,我只需要一个寄存器来在我的程序执行期间保存一些信息。我查看了应用程序和 lib 二进制文件,没有使用 %gs 寄存器。那么是否有任何其他寄存器可以用于此目的。此外, %gs 似乎总是有 0 值。即使我写信给它,也没有崩溃。覆盖 TEB 会使我的程序崩溃。我理解对了吗?
  • ABI 文档说,从内存中,在 linux 中,在内核模式下,这是 100% 使用的。在用户态有一些情况下不使用线程环境。
猜你喜欢
  • 2011-09-30
  • 2022-01-15
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 2013-03-14
  • 1970-01-01
  • 2019-10-02
相关资源
最近更新 更多