2016-09-19 55 views
5

当我读取xv6源代码时,我对以下声明的语法感到困惑。任何人都可以解释给我吗?声明“extern struct cpu * cpu asm(”%gs:0“);”是什么意思?

extern struct cpu *cpu asm("%gs:0"); 
+2

变量声明后的'asm'通常允许您指定变量的名称以用于链接目的,但在这种情况下,您根本没有指定名称,而是一个类别的寄存器引用。 –

+0

下一次 - 请Google首先! –

回答

7

我假设你明白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的指针。

+0

请参阅[关于最近重复的讨论](https://stackoverflow.com/questions/47917027/what-does-asm-suffix-mean-in-given-code/47917087?noredirect=1#comment82802441_47917087) hack要么不编译+汇编(32位PIC代码,或者任何时候编译器试图将mov地址作为立即数“寄存”到寄存器中),或者编译时更糟糕,但是使用错误的地址(64位代码使用RIP相对寻址) –

7

这是asm label的特例。它指示编译器发出%gs:0而不是通常的符号名称,如果您引用cpu变量。据推测,%gs之前已被设置为每个cpu存储区域,struct cpu指针位于零偏移处。目的是让每个cpu访问自己的数据。

+1

所以这只是调用内存在0字节偏移在gs'cpu'引用的段中? –

+1

是的,基本上是正确的。 – Jester

+0

我匆匆瞥了一眼这个问题有点太快,不知道它是如何使用的。 –