由於有時候所做的內核配置文件需要移植到其他的內核源碼中,此時又忘了保存,這時以下方法就可以滿足你了。
1.首先這兩個配置的位於(init/Kconfig):
2. 如果要內核保存內核的配置,必須先選擇 <*> Kernel .config support,這個選項作用是讓內核在編譯的時候將.config文件做gz壓縮後將其轉換爲一個放置於只讀數據段的大字符數組“static const char kernel_config_data”中最後通過config.o連接進內核。
如果在這個基礎上選擇了“[*] Enable access to .config through /proc/config.gz”就在保持內核配置到數組的基礎上,提供一個用戶空間讀取這個數組的procfs文件接口。實現這個功能的是由內核的kernel/Makefile和kernel/configs.c共同完成的。下面詳細解析一下
(1)如果配置了CONFIG_IKCONFIG就要生產 configs.o 文件
(2) configs.o 文件依賴 $(obj)/config_data.h文件,隱含的生成條件是通過configs.c文件編譯生成。而在configs.c文件中包含了$(obj)/config_data.h文件。
(3) $(obj)/config_data.h文件的生成依賴$(obj)/config_data.gz,並強制每次編譯都重新生成$(obj)/config_data.h文件(FORCE)。這個文件的生成規則是(5)
(4)$(obj)/config_data.gz文件的生成依賴$(KCONFIG_CONFIG)(也就是內核配置文件.config),並強制每次編譯都重新生成$(obj)/config_data.gz(FORCE)。這個文件的生成是通過將.config執行gzip壓縮生成的。
(5)這裏其實就是執行一個shell指令,將$(obj)/config_data.gz文件中的數據通過內核工具程序scripts/bin2c放入一個名爲“kernel_config_data”的字符數組中,並以MAGIC_START(宏:"IKCFG_ST")開頭,MAGIC_END(宏: "IKCFG_ED")結尾。
最後這個configs.o文件會被連接進內核,如果你的內核中配置了CONFIG_KALLSYMS,那麼你就可以在/proc/kallsyms中看到“kernel_config_data”這個符號。
如果你配置了CONFIG_IKCONFIG_PROC,那麼configs.c中的procfs文件系統接口模塊就會被編譯進去,其實就是實現了對這個字符數組的讀取和定位的功能。
上面的生產過程介紹完了,現在用一個圖來總結一下過程 :
上面介紹了內核映像中內核配合信息的生成,接下來就看要如何獲取了。從上面的介紹中其實不能看出獲取的方法有兩種:
1、在運行時通過/proc/config.gz獲取:
在控制檯輸入命令:cat /proc/config.gz | gzip -d > (你要保存配置的文件名)
這個方法簡單,但是也有他的侷限性,首先必須配置CONFIG_IKCONFIG_PROC,其次必須在系統運行時進行獲取。
2、可以直接通過編譯好的內核映像:vmlinux、zImage、uImage等直接獲取
這個方法其實也非常簡單,內核黑客們已經幫我們做好了提取工具了:scripts/extract-ikconfig。使用起來超簡單:
(如果是交叉編譯,那就在宿主機)輸入如下命令:(內核源碼路徑)scripts/extract-ikconfig (內核映像路徑) > (你要保存配置的文件名)
這個工具對於gz壓縮方式是支持一貫不錯,從2.6.37開始支持bzip2、 lzma 和 lzo壓縮方式,從2.6.39開始支持 xz壓縮方式。這些從內核的git log中可以看出。
3、從內核邏輯地址空間提取:
從上面的的生成介紹中我們可以知道,配置文件的壓縮文件其實就在內核映像的只讀數據段中。如果內核在運行的時候,其實數據在內核邏輯地址空間中可以找到。方法概況如下:
(1)通過/proc/kallsyms找到“kernel_config_data”這個符號對應的內核邏輯地址
(2)通過/dev/kmem和上面得到的邏輯地址獲取數據。壓縮文件數據就在:"IKCFG_ST"與"IKCFG_ED"之間。
這個步驟需要自己寫一小段的C代碼,可以參考devkmem的代碼(《對於驅動調試有用的兩個小工具(devmem2、devkmem)》)