为了在内核中使用 kmemcheck 功能,需要进行如下设置:
下面例举了内核选项中针对 Kmemcheck 的配置选项,以及它们应该被设置的值(或推荐值):
CONFIG_CC_OPTIMIZE_FOR_SIZE=n
禁止 gcc 对数据长度进行优化,例如在 32 位的机器中,为了提高内存访问速度,gcc 可能会将一些 16 位的数据访问提升至 32 位(真正使用时会舍弃高 16 位),这样 kmemcheck 可能就会对高 16 位中数据内容访问发出警告(这种警告成为伪警告)。这个选项是配置 kmemcheck 的前提,否则 kmemcheck 不会出现在配置选项中。默认是 y,在选项"General setup" 中。
CONFIG_SLAB=y or CONFIG_SLUB=y
使用 slab 或者 slub 机制,默认是 CONFIG_SLUB=y,在选项"General setup" 中。
CONFIG_FUNCTION_TRACER=n
防止嵌套的页面异常,默认是 n,在选项"General setup" 中。
CONFIG_DEBUG_PAGEALLOC=n
关闭页面分配调试功能,默认是 n,在选项"Kernel hacking" 中。
CONFIG_DEBUG_INFO=y (推荐值)
打开内核调试信息,方便内核调试,在选项"Kernel hacking" 中。
CONFIG_KMEMCHECK=y
决定内核是否包含 kmemcheck 功能,在选项"Kernel hacking" 中
CONFIG_KMEMCHECK_[DISABLED|ENABLED| ONESHOT]_BY_DEFAULT
定义 Kmemcheck 在机器启动时的状态,默认是 ENABLED,在选项"Kernel hacking" 中。DISABLED 为不启动,ENABLED 为启动但它会降低启动的速度,ONESHOT 将在第一次警告之后关闭 Kmemcheck 功能。kmemcheck 的状态是可以在系统启动后通过修改 /proc/sys/kernel/kmemcheck 的值来进行动态调整的。
CONFIG_KMEMCHECK_QUEUE_SIZE
出错循环缓冲区大小,默认是 64,即最多一次可以保存 64 条警告记录,推荐保留默认值。
CONFIG_KMEMCHECK_SHADOW_COPY_SHIFT
当发生警告时,保存下来的内存数据大小,默认是 5,即可以保存 32 字节的数据,推荐保留默认值。
CONFIG_KMEMCHECK_PARTIAL_OK
为了解决 gcc 对数据长度的优化,默认是 y,推荐保留默认值。
CONFIG_KMEMCHECK_BITOPS_OK
针对位域的访问,默认是 n,推荐保留默认值(如果需要用到 kmemcheck 来对位域的访问进行跟踪,推荐使用其提供的 Bitfield annotations)。
选用新内核来启动系统,此时系统会根据 CONFIG_KMEMCHECK_[DISABLED|ENABLED|ONESHOT]_BY_DEFAULT 来决定 kmemcheck 在启动时的状态,如果需要动态修改,可以在引导程序的内核启动选项中加入 kmemcheck=x 参数(x 为 0 对应 CONFIG_KMEMCHECK_DISABLED_BY_DEFAULT,x 为 1 对应 CONFIG_KMEMCHECK_ENABLED_BY_DEFAULT,x 为 2 时对应 CONFIG_KMEMCHECK_ONESHOT_BY_DEFAULT)。例如可以设置如下 grub 参数选项来禁止 kmemcheck 在系统启动时启动:
title Fedora (2.6.31.1 with kmemcheck) root (hd0, 5) kernel /boot/vmlinuz-2.6.31.1 ro root=UUID=6f6907e3-2dc6-4d4f-bd05-0e53111ad969 \ kmemcheck=0 initrd /boot/initrd-2.6.31.1另外还可以在系统启动完毕之后,动态启用 kmemcheck 功能,值得注意的是 kmemcheck 的该功能仍处在试验阶段,可能会产生一些伪警告信息。打开 kmemcheck 功能启动命令为:
echo 1 > /proc/sys/kernel/kmemcheck #0:disable 1:enable 2:one-shot