1. 前言
對剛接觸Linux kernel的同窗來講,遇到的第一個問題就是:我該從哪裏入手?、php
話說Linux kernel的打開方式是多種多樣的:從簡單的設備驅動入手;從源代碼的目錄結構入手;從kernel的啓動過程入手;從大的功能模塊入手;等等。無論怎樣,每條都是正途(條條大路通羅馬嘛)。linux
而本文(以及隨後的系列文章),將從Linux kernel的配置項入手,從總體上認識Linux kernel。之因此這麼作,緣由有二:git
1)Linux kernel的配置項數目繁多,以致於進行kernel移植的時候,看到menuconfig界面後,會有深深的恐懼感(可參考下面圖片1)。github
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,能夠獲得以下的配置界面:ui
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等。 |