crash —— 查看内核配置
在编译内核时如果配置了CONFIG_IKCONFIG,那么内核配置文件会被内嵌到内核中,那么可以通过crash工具将其输出出来。
crash> sys config
#
# Automatically generated file; DO NOT EDIT.
# Linux/x86 4.18.0 Kernel Configuration
#
#
# Compiler: gcc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609
#
CONFIG_64BIT=y
CONFIG_X86_64=y
CONFIG_X86=y
CONFIG_INSTRUCTION_DECODER=y
...
还有其他方法可以提取内核配置吗?
下面有三种方法:
- /proc/config.gz
这个方法前提是使能了CONFIG_IKCONFIG_PROC
可以使用zcat来读取,比如:zcat /proc/config.gz - scripts/extract-ikconfig
可以将内核配置从vmlinux中解析出来,比如:./scripts/extract-ikconfig vmlinux
这个方法前提是使能了CONFIG_IKCONFIG,如果设置的是y,那么用vmlinux即可,如果设置的是m,那么需要用 ./scripts/extract-ikconfig kernel/configs.ko - vmlinux-gdb.py
通过make scripts_gdb,会在编译目录下生成一个软链接vmlinux-gdb.py,然后通过qemu启动gdbserver,然后通过gdb启动调试,使用lx-configdump命令可以将内核配置dump出来。$ gdb ./vmlinux (gdb) source vmlinux-gdb.py (gdb) lx-configdump config.log warning: Type size unknown, assuming 1. Try casting to a known type, or void *. Dumped config to config.log
内核配置是如何集成到内核中的呢?
参考kernel/Makefile:
在编译的时候,会先将.config拷贝到kernel/config_data中,然后使用下面的命令对其进行压缩:
cat kernel/config_data | gzip -n -f -9 > kernel/config_data.gz
在kernel/configs.c中会通过汇编代码将上面的压缩文件包含进来:
/*
* "IKCFG_ST" and "IKCFG_ED" are used to extract the config data from
* a binary kernel image or a module. See scripts/extract-ikconfig.
*/
asm (
" .pushsection .rodata, \"a\" \n"
" .ascii \"IKCFG_ST\" \n"
" .global kernel_config_data \n"
"kernel_config_data: \n"
" .incbin \"kernel/config_data.gz\" \n"
" .global kernel_config_data_end \n"
"kernel_config_data_end: \n"
" .ascii \"IKCFG_ED\" \n"
" .popsection \n"
);
这样会将压缩包链接到kernel_config_data和kernel_config_data_end之间,读取/proc/config.gz时,其实读取的就是这两个数据段之间的内容,此外,还提供了两个字符串标识"IKCFG_ST"和"IKCFG_ED",工具extract-ikconfig就是通过定位这两个标识来找到内核配置文件。
本文来自博客园,作者:dolinux,未经同意,禁止转载

浙公网安备 33010602011771号