提取已有的內核配置文件

 

由於有時候所做的內核配置文件需要移植到其他的內核源碼中,此時又忘了保存,這時以下方法就可以滿足你了。

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)》

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章