xv6中extern char userret[]含义及去掉[]后语义问题咨询
xv6 相关问题解答
问题1:extern char userret[]的含义
- 汇编代码里的
.globl userret是将userret声明为全局符号,这个符号的取值就是它在代码段中对应的虚拟内存地址,本身没有对应的数据段存储空间。 - C代码里用
extern char userret[]声明,是利用了C语言「不完全数组类型」的特性:这种声明不会为符号分配存储空间,也不会把符号解析为可取值的左值,你直接使用userret这个标识符的时候,得到的就是这个符号本身对应的虚拟地址,和汇编标签userret的取值完全匹配。 - 这里的
char只是表示该地址对应的存储单元是按字节寻址的,实际我们不会去读取这个地址指向的内容,仅用它做地址运算。
问题2:去掉[]仅保留extern char userret是否代表对应虚拟地址
- 直接使用
userret的话不是。如果声明为extern char userret,C编译器会把userret解析为一个存储在userret符号对应地址的char类型变量,直接写userret会得到这个地址里存的1字节内容,而不是地址本身。 - 如果你声明为
extern char userret,想要得到汇编标签对应的虚拟地址,需要显式写&userret,这时候得到的地址和原来数组形式下userret的取值是等价的。 - 原xv6代码里直接用
userret做地址偏移计算(比如userret - trampoline),如果改成char userret的话这段代码逻辑就完全错误了,必须改成&userret - trampoline才能正常运行。
内容的提问来源于stack exchange,提问作者RecharBao
相关产品推荐
相关产品推荐

