Linux 内核内存检测工具(3)

为了在内核中使用 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  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/27865.html