当我读取xv6源代码时,我对以下声明的语法感到困惑。任何人都可以解释给我吗?声明“extern struct cpu * cpu asm(”%gs:0“);”是什么意思?
extern struct cpu *cpu asm("%gs:0");
当我读取xv6源代码时,我对以下声明的语法感到困惑。任何人都可以解释给我吗?声明“extern struct cpu * cpu asm(”%gs:0“);”是什么意思?
extern struct cpu *cpu asm("%gs:0");
我假设你明白extern struct cpu *cpu
是什么意思。你的问题是:asm("%gs:0")
部分是什么意思?
此代码使用名为asm labels的gcc扩展来表示变量cpu
由汇编器字符串%gs:0
定义。
这不是打算如何使用此扩展程序,而是将其视为hack。
有一个很好的讨论gs(和fs)here,但总之gs指向当前线程的本地存储。 gs中的数据格式取决于您的操作系统(Windows与Linux非常不同)。这个特定的代码是说在来自gs的偏移量0
处,有一个指向struct cpu
的指针。
请参阅[关于最近重复的讨论](https://stackoverflow.com/questions/47917027/what-does-asm-suffix-mean-in-given-code/47917087?noredirect=1#comment82802441_47917087) hack要么不编译+汇编(32位PIC代码,或者任何时候编译器试图将mov地址作为立即数“寄存”到寄存器中),或者编译时更糟糕,但是使用错误的地址(64位代码使用RIP相对寻址) –
变量声明后的'asm'通常允许您指定变量的名称以用于链接目的,但在这种情况下,您根本没有指定名称,而是一个类别的寄存器引用。 –
下一次 - 请Google首先! –