声明“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“);”是什么意思?的主要内容,如果未能解决你的问题,请参考以下文章