Linux內核配置過程

內核版本

linux 2.6.32.2html

配置內核的過程

配置內核能夠經過執行 make menuconfig 來進行,下面分析該命令的執行流程linux

執行該目標

%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 進來,從而編譯一些主機上運行的程序web

# 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 執行的指令以下bash

%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 包含進來,同時執行的目標變成了 menuconfigapp

scripts/kconfig/Makefile

對應的目標以下ui

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,若是沒有安裝依賴庫,則出現錯誤提示spa

# 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 以前須要先安裝該程序的緣由,由於須要用到它~code

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

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.htmlhtm

若是不出意外,如今終端上會顯示一個圖形界面,而後就能夠對各個選項進行配置了,退出以後程序會把配置項寫入到 .config 文件中,並生成相應的頭文件供源碼使用。

相關文章
相關標籤/搜索