2.2 Linux內核配置分析 筆記

1. make menuconfig配置結果

生成.config

2. 配置解析(以網卡DM9000 爲例)

打開.config文件,發現該文件是由以CONGIG_XXX形式的配置項組成的。
找到CONFIG_DM9000=y行,CONFIG_DM9000爲一個配置項,=y表示編譯進內核,=m表示編譯成模塊,沒有配置顯示CONFIG_DM9000 is not set

Q1:配置項CONFIG_DM9000的用途?

我們在內核目錄中查找:grep "CONFIG_DM9000" * -nrw發現以下文件中含有CONFIG_DM9000:

c源碼中的CONFIG_DM9000
這裏寫圖片描述

子目錄Makefile中的CONFIG_DM9000
這裏寫圖片描述

include目錄中的CONFIG_DM9000
圖3

可以看到,CONFIG_DM9000include/linux/autoconf.h中的一個宏定義,從名字可以看出該文件是自動生成的,它由執行makemake uImage時根據.config文件生成的,定義爲#define CONFIG_DM9000 = 1
也就是說不論.config中定義CONFIG_DM9000=yCONFIG_DM9000=mautoconf.h中始終=1,該頭文件將給c源碼中使用(見圖1)。

Q2:.config文件中的配置項CONFIG_DM9000=yCONFIG_DM9000=m在內核文件中如何體現呢?

在子目錄Makefile中(見圖1),obj -$(CONFIG_DM9000) +=dm9000.o, 根據配置項obj -y +=dm9000.o則該驅動編譯進內核;obj -m +=dm9000.o則該驅動編譯爲模塊,生成xxx.ko。

可以看到,根據.config文件,makemake uImage時,分別生成:
include/linux/autoconf.h,該頭文件中定義宏CONFIG_DM9000,被內核c源碼使用。
include/config/auto.conf,該文件被頂級Makefile包含,作爲子目錄Makefile的參數,用來指示構建系統編譯進內核還是模塊。


Makefile 語法 tips:

= 是最基本的賦值
:= 是覆蓋之前的值
?= 是如果沒有被賦值過就賦予等號後面的值
+= 是添加等號後面的值

1、
“=”,make會將整個makefile展開後,再決定變量的值。也就是說,變量的值將會是整個makefile中最後被指定的值。看例子:

        x = foo
        y = $(x) bar
        x = xyz

  在上例中,y的值將會是 xyz bar ,而不是 foo bar 。

2、
“:=”,表示變量的值決定於它在makefile中的位置,而不是整個makefile展開後的最終值。

        x := foo
        y := $(x) bar
        x := xyz

  在上例中,y的值將會是 foo bar ,而不是 xyz bar 了。

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