linux內(nèi)核中的__read_mostly變量
在閱讀socket源碼的時候,有如下一句(net/socket.c):
本文引用地址:http://m.butianyuan.cn/article/201611/319987.htm[plain]view plaincopyprint?
- staticstructvfsmount*sock_mnt__read_mostly;
感覺__read_mostly很奇怪,就深入分析了一下。
__read_mostly原語將定義為存放在.data.read_mostly段中。
[plain]view plaincopyprint?
- #ifdefined(CONFIG_X86)||defined(CONFIG_SPARC64)
- #define__read_mostly__attribute__((__section__(".data.read_mostly")))
- #else
- #define__read_mostly
- #endif
解決的方法有兩種:
- 修改include/asm/cache.h中的__ready_mostly定義為:#define __read_mostly
- 修改arch/xxx/kernel/vmlinux.S,將.data.read_mostly段的位置到實際內(nèi)存空間中去,例如放置在 .data段之后等等。
此外,內(nèi)核源碼通過CONFIG_X86)和(CONFIG_SPARC64)來判斷該怎樣定義__read_mostly,因此在arm中這個宏沒有意義。
評論