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