声明“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 访问自己的数据。
当我阅读 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 访问自己的数据。