====== Make Menuconfig for Linux Kernel ======
===== Kernel 下 scripts 文件夾 =====
scripts 文件夾存放的是跟 make menuconfig 配置介面的圖形繪製相關的文件\\
''make menuconfig'' \\
在 Kernel 的目錄下,讀取 Kernel目錄下的 Kconfig\\
目錄下的 Kconfig 如下
# SPDX-License-Identifier: GPL-2.0
#
# For a description of the syntax of this configuration file,
# see Documentation/kbuild/kconfig-language.rst.
#
mainmenu "Linux/$(ARCH) $(KERNELVERSION) Kernel Configuration"
source "scripts/Kconfig.include"
source "init/Kconfig"
source "kernel/Kconfig.freezer"
source "fs/Kconfig.binfmt"
source "mm/Kconfig"
source "net/Kconfig"
source "drivers/Kconfig"
source "fs/Kconfig"
source "security/Kconfig"
source "crypto/Kconfig"
source "lib/Kconfig"
source "lib/Kconfig.debug"
source "Documentation/Kconfig"
再來根據 Linux/$(ARCH) 選擇其架構下對應的 Kconfig
如 ARM64 下的 Kconfig 文件生成整個配置介面選項
# SPDX-License-Identifier: GPL-2.0-only
config ARM64
def_bool y
select ACPI_CCA_REQUIRED if ACPI
select ACPI_GENERIC_GSI if ACPI
select ACPI_GTDT if ACPI
select ACPI_IORT if ACPI
select ACPI_REDUCED_HARDWARE_ONLY if ACPI
select ACPI_MCFG if (ACPI && PCI)
select ACPI_SPCR_TABLE if ACPI
select ACPI_PPTT if ACPI
…………………
至於 $(ARCH) 可先指定變量或在執行 menuconfig 時指定
make ARCH=arm64 menuconfig
每一種架構都有其個別定義的內核默認選項\\
其資料都會放置在 arch/$ARCH/configs 下\\
內核默認會以 Linux 根目錄下 .config 當作默認選項
我們會根據開發版最接近的系列的 defconfig 將其拷貝到 Kernel 根目錄覆蓋 .config
在 Kernel 根目錄執行以下命令
cp arch/arm64/ configs/defconfig .config
當我們執行 make menuconfig 之後,會把修改的內容更新到根目錄的 .config \\
還會將所有選項以巨集定義產生在 kernel 根目錄下成為一個 .h 頭文件 \\
include/generated/autoconf.h \\
內容如下:\\
/*
*
* Automatically generated file; DO NOT EDIT.
* Linux/x86 5.10.120 Kernel Configuration
*
*/
#define CONFIG_IP6_NF_MATCH_AH_MODULE 1
#define CONFIG_NLS_CODEPAGE_861_MODULE 1
#define CONFIG_MTD_SPI_NAND_MODULE 1
#define CONFIG_RING_BUFFER 1
#define CONFIG_SND_SOC_WM8804_MODULE 1
#define CONFIG_NF_CONNTRACK_H323_MODULE 1
#define CONFIG_HAVE_ARCH_SECCOMP_FILTER 1
#define CONFIG_IP6_NF_SECURITY_MODULE 1
#define CONFIG_SND_PROC_FS 1
#define CONFIG_VFIO_PCI_MMAP 1
#define CONFIG_SCSI_DMA 1
#define CONFIG_IQS624_POS_MODULE 1
#define CONFIG_NETFILTER_FAMILY_BRIDGE 1
#define CONFIG_TWL6040_CORE 1
#define CONFIG_NUMA_EMU 1
#define CONFIG_INTEL_IDLE 1
#define CONFIG_TOUCHSCREEN_IQS5XX_MODULE 1
#define CONFIG_TCP_MD5SIG 1
#define CONFIG_HID_GT683R_MODULE 1
#define CONFIG_CC_HAS_SANCOV_TRACE_PC 1
………………………
內核中的源代碼都會包含上述的 .h文件 ,來進行編譯
===== 如何修改 Kconfig =====
Kconfig 在修改或新增內容時也要修改對應的 Makefile ,這樣才能讓選單對應取得或取消包含的程序\\
Driver 下的 Makefile 內容如下 :\\
obj-$(CONFIG_FB_I810) += video/fbdev/i810/
obj-$(CONFIG_FB_INTEL) += video/fbdev/intelfb/
obj-$(CONFIG_PARPORT) += parport/
obj-$(CONFIG_NVM) += lightnvm/
obj-y += base/ block/ misc/ mfd/ nfc/
obj-$(CONFIG_LIBNVDIMM) += nvdimm/
obj-$(CONFIG_DAX) += dax/
obj-$(CONFIG_DMA_SHARED_BUFFER) += dma-buf/
obj-$(CONFIG_NUBUS) += nubus/
obj-y += macintosh/
obj-$(CONFIG_IDE) += ide/
obj-y += scsi/
obj-y += nvme/
obj-$(CONFIG_ATA) += ata/
obj-$(CONFIG_TARGET_CORE) += target/
obj-$(CONFIG_MTD) += mtd/
obj-$(CONFIG_SPI) += spi/
……………