在X64 Linux中从用户级别使用GS注册

时间:2019-05-19 23:18:50

标签: c++ 64-bit llvm cpu-registers

我正在尝试使用%gs寄存器在程序中保存一个临时值。我正在使用LLVM pass插入写入和读取寄存器的汇编代码。当我使用%fs时,一切正常。但是%fs由少数程序/库使用,而%gs没有。 当我用%gs替换%fs时,即使是简单的指令,例如mov%eax,%gs:0x0也会失败。

mov%rbx,%fs:0x0 //工作

mov%rbx,%gs:0x0 //分段错误。

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

如何在%gs中创建细分并使用其细分选择器,以便在程序中进一步使用

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

1 个答案:

答案 0 :(得分:0)

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

我想说X64 ABI不可能做到这一点。