1. 程式人生 > >Linux內核配置解析 - 概述(基於ARM64架構)

Linux內核配置解析 - 概述(基於ARM64架構)

dev upload padding 語言 之前 adf options manage ogl

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等。

Linux內核配置解析 - 概述(基於ARM64架構)