1. 程式人生 > >LInux核心配置過程

LInux核心配置過程

核心版本

linux 2.6.32.2

配置核心的過程

配置核心可以通過執行 make menuconfig 來進行,下面分析該命令的執行流程

執行該目標

%config: scripts_basic outputmakefile FORCE
    $(Q)mkdir -p include/linux include/config
    $(Q)$(MAKE) $(build)=scripts/kconfig $@

依賴目標

scripts_basic:
    $(Q)$(MAKE) $(build)=scripts/basic

$(build) 的作用

### 
# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
# Usage:
# $(Q)$(MAKE) $(build)=dir
build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
# 原檔案中的註釋已經說得很清楚了,這是一個執行特定 Makefile 的縮寫
# 因此 $(Q)$(MAKE) $(build)=scripts/basic 可以轉換為
# $(Q)$(MAKE) -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj=scripts/basic
# 即 make 執行 Makefile.build 這個檔案

Makefile.build 關鍵語句

這幾句的目的是把 obj 記錄的目錄下的 Makefile include 進來,從而編譯一些主機上執行的程式

# src := $(obj)
# The filename Kbuild has precedence over Makefile
# kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
# kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
# include $(kbuild-file)

make menuconfig

現在回到原始目標上,make menuconfig 執行的指令如下

%config: scripts_basic outputmakefile FORCE
    $(Q)mkdir -p include/linux include/config
    $(Q)$(MAKE) $(build)=scripts/kconfig $@

# 即主要是執行
$(Q)$(MAKE) $(build)=scripts/kconfig menuconfig

同樣的,它還會再次進入到 Makfile.build 檔案中,並把 scripts/kconfig 目錄下的 Makefile 包含進來,同時執行的目標變成了 menuconfig

scripts/kconfig/Makefile

對應的目標如下

ifdef KBUILD_KCONFIG
Kconfig := $(KBUILD_KCONFIG)
else
# 實際是這個值,比如 arch/arm/Kconfig
Kconfig := arch/$(SRCARCH)/Kconfig
endif

menuconfig: $(obj)/mconf
    $< $(Kconfig)

其依賴於 scripts/kconfig/mconf 這個程式,而此程式並不存在,在該 Makefile 以下的內容中給出了其生成規則,並且還會檢查生成該程式所以來的程式是否存在,執行的指令碼是 scripts/kconfig/lxdialog/check-lxdialog.sh,如果沒有安裝依賴庫,則出現錯誤提示

# Check if we can link to ncurses
check() {
        $cc -xc - -o $tmp 2>/dev/null <<'EOF'
#include CURSES_LOC
main() {}
EOF
    if [ $? != 0 ]; then
        echo " *** Unable to find the ncurses libraries or the"       1>&2
        echo " *** required header files."                            1>&2
        echo " *** 'make menuconfig' requires the ncurses libraries." 1>&2
        echo " *** "                                                  1>&2
        echo " *** Install ncurses (ncurses-devel) and try again."    1>&2
        echo " *** "                                                  1>&2
        exit 1
    fi
}

這就是為什麼執行 make menuconfig 之前需要先安裝該程式的原因,因為需要用到它~

以上步驟順利完成之後,scripts/kconfig/mconf 程式就順利生成了,接下來就是真正的開始啟動配置了

scripts/kconfig/mconf $(Kconfig)
# 以 arm 為例,以下路徑其實已經被替換成了絕對路徑,這裡省略
scripts/kconfig/mconf arch/arm/Kconfig

至此,真正的配置工作開始了,mconf 開始讀取 Kconfig 並進行解析,其解析規則可以檢視 mconf.c 檔案,當然了,沒必要去看它如何實現的,只需要瞭解 Kconfig 的語法即可,其語法可以參考https://www.kernel.org/doc/html/latest/kbuild/kconfig-language.html

如果不出意外,現在終端上會顯示一個圖形介面,然後就可以對各個選項進行配置了,退出之後程式會把配置項寫入到 .config 檔案中,並生成相應的標頭檔案供原始碼使用。