hi~ 我已经好久没有更新过东西了 = =
毕竟...
啊. 算了. 总之今天想说的是. 在看linux源码的时候. 看到了一个令我很疑惑的东西.
简而言之~. 代码中出现了一个未被定义的符号.
long lowmem_reserve[MAX_NR_ZONES];
其中的 MAX_NR_ZONES 从未出现过. 唯一一处比较可疑的地方是
DEFINE(MAX_NR_ZONES, __MAX_NR_ZONES);
其中 __MAX_NR_ZONES 源自一个 enum;
而 DEFINE 的展开是
#define DEFINE(sym, val) \\
asm volatile("\\n.ascii \\"->" #sym " %0 " #val "\\"" : : "i" (val))

大概就是这么个效果. 我查阅过 .ascii 的含义. 大意是声明一个字符串. 类似于.string
这做不了其他事情. 我仍然不知道这东西是如何运用到数组中的.
好在我在 google 上发现了些许提示.
How does this inline assembly define a variable?
大意是: 这个 .s 文件最后会经由 sed 转换为 .h 文件.
一些线索也验证了这一点. 包括源码中的
int main(void)
{
/* The enum constants to put into include/generated/bounds.h */
DEFINE(NR_PAGEFLAGS, __NR_PAGEFLAGS);
DEFINE(MAX_NR_ZONES, __MAX_NR_ZONES);
#ifdef CONFIG_SMP
DEFINE(NR_CPUS_BITS, ilog2(CONFIG_NR_CPUS));
#endif
DEFINE(SPINLOCK_SIZE, sizeof(spinlock_t));
/* End of constants */
return 0;
}
其中 "The enum constants to put into include/generated/bounds.h" 阐释了. 这些定义将会被转换到 .h 文件中.
同时. 下图中文件未被包含(并且处于 generated 文件夹下). 也证实了 bounds.h 文件的确是生成后的文件: