Section Mismatch 可能引发非法内存访问,进而引发内核crush崩溃
1.2 不同section之间的引用会导致编译时出现Warnning,同1.1, 运行时如果其中一个section资源被free掉,另外一个section重新去引用它也会出现section mismatch, 还可能崩溃
2.2 解决1.2的问题,如果不同的Section之间存在交叉引用,这个交叉引用是安全的,则用__ref标记让Section Mismatch Detector(modpost)忽略相关检查, 比如在cpu hotplug中,__cpuinit不会放在Init section中,在运行时访问是安全的。如果一个函数跟cpu hotplug无关,不用添加__cpuinit标记。因为这种访问是安全的,所以可以让内核忽略对它的检测,用__ref标记 该函数即可。
0 配置 Section Mismatch 检测
CONFIG_DEBUG_SECTION_MISMATCH=y1 如何引发 Section Mismatch
1.1 非法访问 __init section中的资源,因为带有__init 标记的section会在linux启动初始化完成后被free掉,这样可以较少内存消耗, 非法引用已经被free掉的init section的资源会导致Section Mistach1.2 不同section之间的引用会导致编译时出现Warnning,同1.1, 运行时如果其中一个section资源被free掉,另外一个section重新去引用它也会出现section mismatch, 还可能崩溃
2 如何解决 Section Mismatch
2.1 解决1.1的问题, 如果运行时函数需要调用init section 中的函数或者变量, 则被调用的函数或者变量要去掉__init *的标记, 或者给调用者加上init 的声明, include/linux/init.h2.2 解决1.2的问题,如果不同的Section之间存在交叉引用,这个交叉引用是安全的,则用__ref标记让Section Mismatch Detector(modpost)忽略相关检查, 比如在cpu hotplug中,__cpuinit不会放在Init section中,在运行时访问是安全的。如果一个函数跟cpu hotplug无关,不用添加__cpuinit标记。因为这种访问是安全的,所以可以让内核忽略对它的检测,用__ref标记 该函数即可。