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

时间:2016-09-19 17:31:19

标签: gcc x86 inline-assembly xv6

当我阅读xv6源代码时,我对下面声明的语法感到困惑。任何人都可以向我解释一下吗?

this.setState(function(state){ 
    ...
    return newState 
});

2 个答案:

答案 0 :(得分:8)

我假设您了解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的指针。

答案 1 :(得分:8)

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