【问题标题】:linux g++ x64 access memory via FS segment registerlinux g++ x64通过FS段寄存器访问内存
【发布时间】:2015-01-16 11:57:08
【问题描述】:

在 linux,amd64 上使用 g++,我知道线程本地存储是通过段寄存器 GS 访问的。 我想有一种方法来指示编译器通过 FS 寄存器访问其他一些内存。 该内存是一个垃圾收集区,我想与其他银行随意切换。 有可能吗? (我想应该是因为线程本地存储是可能的)。

【问题讨论】:

  • 实际上,gs 是 i386,TLS fs 是 x86_64 (gcc.gnu.org/onlinedocs/gcc-4.5.3/gcc/…),但我认为问题仍然是一样的,但是对于 gs。如果可能的话,我假设会有一些 FAR 属性附加到这个变量上。但我一直没能找到它。它存在于 djgpp 中,用于访问 opengl 帧缓冲区和 dos 空间。
  • 这是一个提示,我会调查 far 属性。
  • 如果我错了,请纠正我,但我认为您不允许从用户模式加载 FS 或 GS​​。还是您不打算这样做?
  • @JonathonReinhart 是的,我想这样做。为什么你说我不应该被允许从用户模式加载 FS 或 GS​​(我不知道 - 这是一个特权指令吗?)
  • @JonathonReinhart 我检查了 LFS LGS 指令,这些指令正常运行(在保护模式下)将选择器加载到寄存器 FS 或 GS​​ 并自动从 LDT(本地描述符表)加载相关的段描述符在段寄存器的隐藏部分。此外,pop 指令也可以用于相同的范围。显然,为了让整体工作,您还必须加载具有必要地址的本地描述符表(我尝试使用系统调用“modify_ldt”)。

标签: assembly g++ 64-bit x86-64


【解决方案1】:

我将探讨的部分答案是 Clang

http://llvm.org/releases/3.3/tools/clang/docs/LanguageExtensions.html

"用地址空间#256注释一个指针会导致它是相对于X86 GS段寄存器生成的代码,而地址空间#257会导致它相对于X86 FS段。注意这​​是一个非常非常低的级功能,只有在您知道自己在做什么时才应该使用(例如在操作系统内核中)。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多