【发布时间】: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