第十章:Kconfig配置文件
对于遍布源码树的所有Kconfig*配置文件来说,它们缩进方式与C代码相比有所不同。紧挨在“config”定义下面的行缩进一个制表符,帮助信息则再多缩进2个空格。比如:
config AUDIT
bool
"Auditing support"
depends
on NET
help
Enable
auditing infrastructure that can be used with another
kernel
subsystem, such as SELinux (which requires this for
logging of avc messages output).
Does not do system-call
auditing without CONFIG_AUDITSYSCALL.
仍然被认为不够稳定的功能应该被定义为依赖于“EXPERIMENTAL”:
config SLUB
depends
on EXPERIMENTAL && !ARCH_USES_SLAB_PAGE_STRUCT
bool "SLUB (Unqueued
Allocator)"
...
而那些危险的功能(比如某些文件系统的写支持)应该在它们的提示字符串里显著的声明这一点:
config ADFS_FS_RW
bool
"ADFS write support (DANGEROUS)"
depends
on ADFS_FS
...
要查看配置文件的完整文档,请看Documentation/kbuild/kconfig-language.txt。
第十一章:数据结构
如果一个数据结构,在创建和销毁它的单线执行环境之外可见,那么它必须要有一个引用计数器。内核里没有垃圾收集(并且内核之外的垃圾收集慢且效率低下),这意味着你绝对需要记录你对这种数据结构的使用情况。
引用计数意味着你能够避免上锁,并且允许多个用户并行访问这个数据结构——而不需要担心这个数据结构仅仅因为暂时不被使用就消失了,那些用户可能不过是沉睡了一阵或者做了一些其他事情而已。
注意上锁不能取代引用计数。上锁是为了保持数据结构的一致性,而引用计数是一个内存管理技巧。通常二者都需要,不要把两个搞混了。
很多数据结构实际上有2级引用计数,它们通常有不同“类”的用户。子类计数器统计子类用户的数量,每当子类计数器减至零时,全局计数器减一。
这种“多级引用计数”的例子可以在内存管理(“struct mm_struct”:mm_users和mm_count)和文件系统(“struct super_block”:s_count和s_active)中找到。
记住:如果另一个执行线索可以找到你的数据结构,但是这个数据结构没有引用计数器,这里几乎肯定是一个bug。
|