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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了声明“extern struct cpu * cpu asm(”%gs:0“);”是什么意思?相关的知识,希望对你有一定的参考价值。

当我正在阅读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中数据的格式取决于您的操作系统(Windows与Linux非常不同)。这个特殊的代码说,在gs偏移0时,有一个指向struct cpu的指针。

另一答案

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

以上是关于声明“extern struct cpu * cpu asm(”%gs:0“);”是什么意思?的主要内容,如果未能解决你的问题,请参考以下文章

声明那回事儿

Go语言基础之变量声明

C#显式声明隐式声明是怎么定义的

JavaScript 函数声明和变量声明

在C语言中声明和定义的区别?

显式声明和隐式声明都是啥时候用?该用哪一个?