x86-64中的fs相对地址

问题描述 投票:1回答:1

我正在裸露的Rust中使用线程本地存储。我最初将FsBase MSR设置为目标值。也可以通过再次读取FsBase寄存器并在gdb中运行info registers fs_base来确认。

当我尝试读取线程局部变量时,rust生成以下asm代码(从gdb进行反汇编)

mov    %fs:0x0,%rax
mov    -0x2000(%rax),%cl
mov    %cl,-0x189(%rbp)

[当我尝试单步执行这些指令时,我发现在指令1之后,%rax的值保持为0x0,而不是使用FsBase中的值。这不是预期的行为。

在我的情况下,FsBase设置为0xffffc00000002000。遇到指令3后,CPU会引发页面错误异常,目标位置为0xffffffffffffe000,这意味着该指令正在尝试从0x0 - 0x2000加载数据,而不是从0xffffc00000002000的偏移量加载数据。这不是预期的行为。

实例化fs寄存器是否需要更多步骤?

assembly x86-64 abi bare-metal thread-local-storage
1个回答
3
投票

这里的代码生成是根据系统V ABI的,如Ross在评论中提到的。ABI要求将%fs:0设置为%fs itself的值。

因此,在这里,将地址0xffffc00000002000的值设置为0xffffc00000002000即可满足ABI并按预期使用FsBase。

换句话说,mov %fs:0x0, %rax试图访问FsBase处的值,而不是0x0处的值。 FsBase的值恰好是0。

© www.soinside.com 2019 - 2024. All rights reserved.