内核版别:2.6.14
在阅览socket源码的时分,有如下一句(net/socket.c):
[plain]view plaincopy
print?
- staticstructvfsmount*sock_mnt__read_mostly;
感觉__read_mostly很古怪,就深入分析了一下。
__read_mostly原语将界说为寄存在.data.read_mostly段中。
[plain]view plaincopy
print?
- #ifdefined(CONFIG_X86)||defined(CONFIG_SPARC64)
- #define__read_mostly__attribute__((__section__(“.data.read_mostly”)))
- #else
- #define__read_mostly
- #endif
由此可见,咱们能够将常常需要被读取的数据界说为 __read_mostly类型,这样Linux内核被加载时,该数据将主动被寄存到Cache中,以进步整个体系的履行功率。另一方面,假如地点的渠道没有Cache,或许虽然有Cache,但并不供给寄存数据的接口(也便是并不答应人工放置数据在Cache中),这样界说为 __read_mostly类型的数据将不能寄存在Linux内核中,乃至也不能够被加载到体系内存去履行,将形成Linux 内核发动失利。
处理的办法有两种:
- 修正include/asm/cache.h中的__ready_mostly界说为:#define __read_mostly
- 修正arch/xxx/kernel/vmlinux.S,将.data.read_mostly段的方位到实践内存空间中去,例如放置在 .data段之后等等。
此外,内核源码经过CONFIG_X86)和(CONFIG_SPARC64)来判别该怎样界说__read_mostly,因此在arm中这个宏没有意义。