6

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

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

2 回答 2

9

我假设你明白什么extern struct cpu *cpu意思。你的问题是:这asm("%gs:0")部分是什么意思?

此代码使用称为asm 标签的 gcc 扩展来表示该变量cpu是由汇编器字符串定义的%gs:0

这不是这个扩展的使用方式,被认为是hack

这里对 gs(和 fs)进行了很好的讨论,但总之 gs 指向当前线程的本地存储。gs 的数据格式取决于您的操作系统(Windows 与 Linux 非常不同)。这个特定的代码是说在0从 gs 的偏移量处,有一个指向 a 的指针struct cpu

于 2016-09-19T20:52:25.363 回答
9

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

于 2017-12-21T02:30:16.437 回答