6-內核配置選項編寫

內核裁剪的方式有兩種: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文件中用的宏就能夠直接與選項關聯上了。

相關文章
相關標籤/搜索