內核裁剪的方式有兩種:linux
第一種:make menuconfig 進入圖形界面的配置。vim
第二種:就是打開源碼進行相應的裁剪。app
這裏咱們先介紹一下第一種方式的裁剪方式:make menuconfig函數
首先介紹下make menuconfig 這個命令其實是這樣運行的:./scripts/kconfig/mconf arch/arm/Kconfigui
mconf:這個是一個解析器,用來解析Kconfig文件this
Kconfig:就是用來生成咱們make menuconfig看到的全部選項,固然,Kconfig也是一層層調用的,和makefile相似。下面咱們來寫一個最簡單的Kconfig文件。spa
首先在咱們上一節課的目錄下driver/mydriver下建立一個Kconfig的文件:並寫入一下代碼code
1 config MY_DRIVER 2 bool "select mydriver" //這是一個選項,並無與咱們的mydirver.c關聯 3 default n //默認狀況下不選擇 也就是make menuconfig 中[ ]空的狀況 想要選擇的話,default y 4 help //對應咱們make menuconfig 中下面的 select exit help 中的help 5 IF yuo select this ,you will happy !!! //這個是help中的解釋描述
而後保存退出./scripts/kconfig/mconf driver/mydriver/Kconfig文件:blog
能夠看到咱們的選項就長成這個樣子;ip
上面咱們說過Kconfig是一層層調用的,因此咱們來打開上層的Kconfig,把咱們寫的Kconfig寫入到上層Kconfig,這樣就可以make menuconfig的時候直接在總體的選項裏面看到咱們的Kconfig所生成的選項;
vim ../Kconfig 照貓畫虎:第三行就是咱們添加的代碼用source 命令。source一下咱們的Kconfig
1 menu "Device Drivers" 2 3 source "drivers/mydriver/Kconfig" 4 5 source "drivers/base/Kconfig" 6 7 source "drivers/connector/Kconfig" 8 9 source "drivers/mtd/Kconfig"
最後,make menuconfig 就能夠看到咱們的選項了,此次咱們用空格按鍵把它選上,exit 保存。
[liuye@LiuYe linux-3.5]$>make menuconfig scripts/kconfig/mconf Kconfig # # configuration written to .config # *** End of the configuration. *** Execute 'make' to start the build or try 'make help'.
能夠看到配置被寫入到.config文件下:
咱們來打開這個文件搜索一下 :/MY_DRIVER
1096 # 1097 # Device Drivers 1098 # 1099 CONFIG_MY_DRIVER=y 1100 1101 # 1102 # Generic Driver Options 1103 #
能夠看到:CONFIG_MY_DRIVER=y。 這就是咱們把本身編寫出來的選項選中了;若是不選中的話,則以下#CONFIG_MY_DRIVER is not set
1096 # 1097 # Device Drivers 1098 # 1099 # CONFIG_MY_DRIVER is not set 1100 1101 # 1102 # Generic Driver Options 1103 #
到這裏添加一個最簡單的make menuconfig選項就寫完了,後面咱們會再講解如何編寫其餘類型的選項。
/×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××/
還記得咱們前面說的Kconfig中只是建立了一個選項,並無把咱們的代碼和選項關聯在一塊兒:下面咱們就來說解一下如何把咱們的代碼與剛剛編寫的選項關聯:
116 若是咱們寫的選項被選中,那麼在編譯以後(make 以後),最終都會體如今下面兩個文件中;make以前咱們的選項,是否被選中都會直接體如今.config中,忘記了的同窗往上屢屢。 117 118 內核中全部的.C中都會包含下面這個文件: 119 [liuye@LiuYe linux-3.5]$>vim include/generated/autoconf.h //這裏面存放的是關於咱們的選項的宏定義; 120 內核中全部的makefile中都會包含下面這個文件: 121 [liuye@LiuYe linux-3.5]$>vim include/config/auto.conf //這裏面存放的是關於咱們的選項的CONFIG_MY_DRIVER=y的變量:根makefiel中定義變量的方式是同樣同樣的;
同窗們自行打開上面的文件look look。
打開driver/mydriver/Makefile
1 #include/config/auto.conf 2 obj-$(CONFIG_MY_DRIVER) += my.o #這行也就把咱們的選項關聯上了咱們的代碼。 3 #若是沒有選中咱們的選項:CONFIG_MY_DRIVER就不存在,上面的代碼也就至關於下面這行。至關於沒有選中咱們的代碼。 4 #obj-n +=my.o 5 #obj-y +=my.o
而後咱們再用make menuconfig就能夠自由的配置內核,也就是裁剪咱們的代碼,同窗們能夠選中或者不選中,從新編譯一下kernel,刷機而後啓動過程當中咱們的代碼執行與否就能夠體現的淋漓盡致。建議小夥伴們都試試。
/×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××/
上面咱們裁剪的是對一個文件總體的一個裁剪,那若是咱們想對文件中部分代碼進行裁剪該怎麼辦呢?
讓樓主告訴大家吧;
咱們來想一下:整個文件的裁剪是在Kconfig裏面編寫的一個選項(一個宏)決定的,那咱們也一樣能夠在Kconfig中來再寫一個選項(宏)來匹配咱們文件中的部分代碼啊。真聰明!!!而後在代碼中利用這個選項(宏),進行條件判斷,執行不一樣的代碼。
第一步:改咱們的程序 :vim my.c
1 #include <linux/init.h> 2 #include <linux/module.h> 3 #include <linux/sched.h> 4 //include/generated/autoconf.h 5 //在內核啓動過程當中執行,且在內核啓動過程當中執行的函數類型是固定的:int test_init(void) :返回值和行參是固定的。 6 //init 段:這個函數被放到init段,好處是代碼執行完成以後,函數體就釋放了,節省一部份內存。只能調用一次。後面不要調用了> 。 7 static __init int test_init(void) 8 { 9 int i; 10 //若是資源申請失敗,要飯會相應的錯誤嗎 11 // 12 //return -ENOMEM;內存申請失敗 13 for(i=0;i<20;i++) 14 { 15 #ifdef CONFIG_MY_DRIVER_KERNEL 16 printk("hello kernel\n"); 17 #else 18 printk("hello arm\n"); 19 #endif 20 } 21 //printf("") //>> 1 22 return 0; 23 24 } 25 //把test_init函數放到內核啓動過程當中執行 26 module_init(test_init); 27 MODULE_LICENSE("GPL"); 28 //下面三行無關緊要 29 MODULE_AUTHOR("LIUYE"); 30 MODULE_VERSION("V1.0"); 31 MODULE_DESCRIPTION("test for class");
第二步:在Kconfig中添加咱們的另外一個選項(宏):vim driver/mydriver/Kconfig
1 config MY_DRIVER 2 bool "select mydriver" 3 default n 4 help 5 IF yuo select this ,you will happy !!! 6 config MY_DRIVER_KERNEL 7 bool "select my_driver" 8 default n 9 help 10 If ....................
第三步:make menuconfig 來選中或者不選中,編譯內核:make 刷機:看效果!!!
須要注意的是:在my.c 中用的宏定義:CONFIG_MY_DIRVER_KERNEL要與Kconfig定義的選項(宏):MY_DRIVER_KERNEL相差一個CONFIG前綴:
由於,Kconfig裏面定義的選項(宏)MY_DRIVER_KERNEL:在編譯以後會在include/generated/autoconf.h中自動添加CONFIG前綴,然而內核中每一個.c程序都是默認包含這個頭文件的,因此咱們在.c文件中用的宏就能夠直接與選項關聯上了。