1. 前言
對剛接觸Linux kernel的同學來說,遇到的第一個問題就是:我該從哪里入手?、
話說Linux kernel的打開方式是多種多樣的:從簡單的設備驅動入手;從源代碼的目錄結構入手;從kernel的啟動過程入手;從大的功能模塊入手;等等。不管怎樣,每條都是正途(條條大路通羅馬嘛)。
而本文(以及隨后的系列文章),將從Linux kernel的配置項入手,從整體上認識Linux kernel。之所以這么做,原因有二:
1)Linux kernel的配置項數目繁多,以至於進行kernel移植的時候,看到menuconfig界面后,會有深深的恐懼感(可參考下面圖片1)。
2)配置項的目的,是功能配置和功能開關,從一定程度上可以看出一個軟件的功能模塊划分。以Linux kernel為例,Kconfig所呈現出來的樹狀結構,從功能划分的角度看,比source code的目錄結構還清晰。
注1:本系列文章使用的Linux kernel版本是“X Project”所用的“Linux 4.6-rc5”,具體可參考“https://github.com/wowotechX/linux.git”。
2. Kernel配置項初識
Linux kernel的配置項,是以架構(ARCH)為單位,通過Kconfig語言組織在一起的。以ARM64為例,其Kconfig的入口位於:
arch/arm64/Kconfig
在Kernel根目錄下以“ARCH=arm64”為參數,執行make menuconfig,可以得到如下的配置界面:
make ARCH=arm64 menuconfig
圖片1 Kernel_menuconfig
第一個畫面,還可以接受,畢竟畫風清爽。但點進到二級菜單,腦袋就大了。不過不着急,我們一層一層的分析。
開始之前,先交代一下分析的手段,很簡單,要點有四:
結合Kconfig文件;
跟隨menuconfig的菜單項;
加上強大的Google;
必要時閱讀source code。
另外,鑒於篇幅問題,本文只介紹Kconfig的一級菜單(就是圖片1所能看到的部分),相當於一個索引,后續文章會一個一個展開描述。
3. 一級菜單
本章我們將根據arch/arm64/Kconfig文件,對menuconfig的一級菜單進行簡要的分析,目的是從實際的例子出發,理解Kconfig語言的語法,一級Linux kernel配置項的整體結構。具體請參考如下表格:
配置項 | Kconfig文件位置 | 功能說明 |
ARM64架構的默認配置項 | arch/arm64/Kconfig | 指定ARCH為ARM64之后,ARM64的Kconfig會默認幫我們確定眾多的配置項,例如CONFIG_64BIT、CONFIG_MMU、CONFIG_OF等等。這些配置項不會體現在menuconfig的菜單中,但可以在最終生成的config文件中看到。 |
General setup | init/Kconfig 位於menu "General setup"和對應的endmenu之間 |
該配置項由“menu … endmenu”定義,是一個配置菜單,表示一類配置的集合(參考上面圖片1,“--->”結尾的配置項都是菜單項,按Enter直接進入對應的菜單界面); 主要用於配置和功能無關的的通用選項,例如kernel的版本號、壓縮方式、等等。 |
loadable module | init/Kconfig 由“menuconfig MODULES”定義 |
menuconfig和menu不同,是一個可以選擇是否開啟的菜單(參考圖片1中的“[*]”); 用於配置內核“模塊”有關的特性。 |
block device | block/Kconfig 由“menuconfig BLOCK”定義 |
內核塊設備有關的特性。 |
Platform selection | arch/arm64/Kconfig.platforms 位於menu "Platform selection"和endmenu之間 |
用於配置和具體平台有關的配置項,如SUNIX、HISI等; 自從ARM64把“mach-xxx”目錄拋棄之后,這里可能是各個平台可自行發揮的最后一個空間了。 |
PCI Bus support | arch/arm64/Kconfig drivers/pci/Kconfi |
PCI總線有關的特性。 |
ACPI support | drivers/acpi/Kconfig | ACPI總線有關的特性。 |
Kernel Features | arch/arm64/Kconfig kernel/Kconfig.preempt kernel/Kconfig.hz mm/Kconfig 位於menu "Kernel Features"和對應的endmenu之間 |
Linux kernel的核心功能的配置,如進程管理、內存管理、等等。是Linux kernel配置項中最復雜的一類。 |
Boot options | arch/arm64/Kconfig 位於menu "Boot options"和對應的endmenu之間 |
用於配置和內核啟動有關的功能,如默認的Command line、UEFI支持等。 |
Userspace binary formats | arch/arm64/Kconfig fs/Kconfig.binfmt 位於menu "Userspace binary formats"和對應的endmenu之間 |
用於配置用戶空間二進制的格式。 |
Power management | arch/arm64/Kconfig kernel/power/Kconfig 位於menu "Power management options"和對應的endmenu之間 |
Linux kernel電源管理有關的特性。 |
CPU Power Management | arch/arm64/Kconfig drivers/cpuidle/Kconfig drivers/cpufreq/Kconfig 位於menu "CPU Power Management"和對應的endmenu之間 |
CPU有關的電源管理特性,如cpuidle、cpufreq等; 這是新版kernel的一大改進,將CPU有關的電源管理功能,抽象成一個頂層功能,和系統的電源管理並列。 |
Networking support | net/Kconfig | 網絡有關的特性。 |
Device Drivers | drivers/Kconfig | 設備驅動有關的配置項。 |
Firmware Drivers | drivers/firmware/Kconfig … |
Firmware有關的配置項。 |
File systems | fs/Kconfig | 文件系統有關的配置項。 |
Virtualization | arch/arm64/kvm/Kconfig | 虛擬化有關的配置項。 |
Kernel hacking | arch/arm64/Kconfig.debug | Kernel調試有關的配置項。 |
Security options | security/Kconfig | 安全特性有關的配置項。 |
Cryptographic API | crypto/Kconfig arch/arm64/crypto/Kconfig |
加密算法有關的配置項。 |
Library routines | lib/Kconfig | 用於配置常用的library,如CRC16等。 |