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

What does the declaration“extern struct cpu *cpu asm("%gs:0");” mean?

当我阅读 xv6 源代码时,我对下面声明的语法感到困惑。谁能给我解释一下?

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 的数据格式取决于您的 OS(Windows 与 Linux 非常不同)。这个特定的代码是说在 gs 的偏移 0 处,有一个指向 struct cpu.

的指针

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