当我阅读xv6源代码时,我对下面声明的语法感到困惑。任何人都可以向我解释一下吗?
this.setState(function(state){
...
return newState
});
答案 0 :(得分:8)
我假设您了解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
的指针。
答案 1 :(得分:8)
这是asm label的一个特例。如果引用%gs:0
变量,它会指示编译器发出cpu
而不是通常的符号名称。据推测,%gs
先前已设置为per-cpu存储区域,其中struct cpu
指针位于零偏移处。目的是允许每个cpu访问自己的数据。