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

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加密

kernel_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等。
相關文章
相關標籤/搜索