声明"extern struct cpu*cpu asm("%gs:0");"是什么意思?

xia*_*oma 6 x86 gcc inline-assembly xv6

当我正在阅读xv6源代码时,我对下面声明的语法感到困惑.有谁可以向我解释一下?

extern struct cpu *cpu asm("%gs:0");
Run Code Online (Sandbox Code Playgroud)

Dav*_*erd 8

我假设你明白了什么extern struct cpu *cpu意思.你的问题是:这个asm("%gs:0")部分是什么意思?

此代码使用名为asm labels的gcc扩展名来表示该变量cpu由汇编程序字符串定义%gs:0.

这不是如何使用此扩展并被视为黑客攻击.

有GS(和FS)的一个很好的讨论在这里,但在短期GS指向当前线程的本地存储.gs中数据的格式取决于您的操作系统(Windows与Linux非常不同).这个特殊的代码说,在偏离0gs时,有一个指向a的指针struct cpu.


Jes*_*ter 8

这是asm标签的特例.%gs:0如果引用cpu变量,它会指示编译器发出而不是通常的符号名称.据推测%gs,之前已将其设置为per-cpu存储区域,struct cpu指针偏移为零.目的是允许每个cpu访问自己的数据.

  • 我会说这仍然有点滥用这个功能.我有一种感觉,它可能会使编译器在环境下生成无效代码. (4认同)
  • 不能将它与位置无关的代码一起使用.在32位代码中.它将尝试生成类似于`%gs:0 @ GOT(%ebx)`的指令,当然这些指令无效.这不是64位代码的问题,因为它只使用RIP相对寻址,因为输出的指令将是'%gs:0(%rip)` (3认同)