正点原子2026开发板教程——从0开始配置Linux内核3menuconfig不是黑魔法只是有点绕对应的仓库在https://github.com/Awesome-Embedded-Learning-Studio/imx-forge欢迎各位大佬提提意见克隆尝试为什么要写这篇配置教程如果说编译内核是照着菜谱做菜那配置内核就是自己设计菜谱。你选择哪些功能、不选哪些直接决定了内核的大小、性能、功能。但我第一次用menuconfig的时候完全是懵的状态。几百个菜单项每个还有子菜单看得我头晕眼花。网上的教程要么太简单只告诉你选这个选那个要么太复杂上来就讲Kconfig的语法规则。我想做的是介于这两者之间让你理解配置系统是怎么工作的知道常用配置项的作用并且能够创建自己的defconfig。到了最后配置不再是照抄别人的机械过程而是知道自己在做什么的理性选择。Kconfig系统配置的底层逻辑在进入menuconfig之前先理解一下Kconfig系统的工作原理。Linux内核的配置系统叫Kconfig它的核心思想是用一种专门的语法Kconfig语言描述配置选项配置选项之间可以有依赖关系用户通过图形界面menuconfig等选择配置生成.config文件供编译使用Kconfig文件的格式是这样的config DM9000 tristate DM9000 support depends on NET_ETHERNET ARM select CRC32 help DM9000 ethernet driver To compile this driver as a module, choose M here. The module will be called dm9000.这里解释一下各个字段的意思config DM9000定义一个配置选项名字是CONFIG_DM9000tristate三种状态y/m/n表示可以编译进内核(y)、编译成模块(m)、不编译(n)depends on依赖关系只有NET_ETHERNET和ARM都选了这个选项才可选select反向依赖选中DM9000时自动选中CRC32help帮助文本在menuconfig里按?可以看到tristate和bool的区别tristate是三种状态y/m/n用于驱动可以编译成模块bool是两种状态y/n用于核心功能不能编译成模块。当你运行make menuconfig时内核会扫描所有Kconfig文件构建出一颗配置树然后用ncurses库画出菜单界面。你选择配置项时Kconfig系统会自动处理依赖关系——比如你选了某个功能它依赖的其他选项会自动选中你取消了某个功能依赖它的选项会变灰或取消。defconfig到底是什么默认配置的艺术在02章我们提到了defconfig现在来深入理解一下。defconfig是default configuration的缩写字面意思是默认配置。但这个默认不是内核默认而是某个平台或板型的默认配置。对于i.MX6ULLdefconfig就是适合i.MX6ULL的默认配置选择。defconfig文件位于arch/arm/configs/目录arch/arm/configs/ ├── imx_aes_defconfig# NXP i.MX AES引擎支持的配置├── imx_v6_v7_defconfig# i.MX 6/7系列通用配置├── imx_v7_defconfig# i.MX 7系列配置├── multi_v7_defconfig# 多平台v7配置└──...打开一个defconfig看看内容CONFIG_SYSVIPCy CONFIG_POSIX_MQUEUEy CONFIG_NO_HZy CONFIG_HIGH_RES_TIMERSy CONFIG_PREEMPTy CONFIG_ARMy CONFIG_ARCH_MXCy ...defconfig只记录与默认值不同的配置项。如果某个选项在Kconfig里默认是ndefconfig里设为y那defconfig里会记录CONFIG_XXXy如果默认就是ydefconfig里就不会出现。这样的设计有几个好处defconfig文件很小只包含特定平台的特殊配置Kconfig升级时新增选项、改变默认值defconfig仍然有效不同平台的defconfig可以共享差异最小化当你运行make xxx_defconfig时内核做的事情是读取Kconfig文件建立完整的配置选项树应用指定的defconfig覆盖部分默认值评估所有依赖关系自动选中/取消相关选项生成完整的.config文件所以.config是Kconfig默认值 defconfig覆盖 依赖关系计算的结果不是简单的复制。menuconfig实战图形化配置教程现在我们进入实战环节打开menuconfig看看。启动menuconfigmakeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux menuconfig你应该看到类似这样的界面*** User Mode Linux port *** General setup --- [*] Enable loadable module support --- *** Enable the block layer --- System Type --- Bus support --- Kernel Features --- Boot options --- CPU Power Management --- Floating point emulation --- Userspace binary formats --- Power management options --- Networking support --- Device Drivers --- File systems --- Kernel hacking --- Security options --- Cryptographic API --- Library routines ---导航操作menuconfig的操作按键如下方向键移动光标Enter进入子菜单或选中选项Esc Esc返回上一级菜单Space切换选项状态y/n/m/搜索功能?查看帮助:q: 退出会提示是否保存搜索功能搜索功能非常实用尤其当你不知道某个选项在哪的时候。按/输入关键词Search: DM9000 Symbol: DM9000 [n] Type : tristate Prompt: DM9000 support Location: (1) - Device Drivers - Network device support (NETDEVICES [y]) - Ethernet driver support (ETHERNET [y]) Defined at drivers/net/ethernet/davicom/Kconfig:6 Depends on: NETDEVICES [y] ETHERNET [y] (ARM || MIPS) Selects: CRC32搜索结果告诉你选项的位置、类型、依赖关系。你还可以按数字键跳转到该选项需要支持跳转。常用菜单解析我们来看看几个常用的菜单。System Type系统类型这个菜单选择CPU和SoC类型System Type --- [*] Support for ARM processor type ARM system type (NXP i.MX based) --- ( ) Allwinner sunxi SoC ( ) Broadcom BCM2835 (X) NXP i.MX based ... [*] MXC support [*] Support for i.MX6ULL对于i.MX6ULL确保选中NXP i.MX based和Support for i.MX6ULL。Kernel Features内核特性这里配置内核的基本特性Kernel Features --- Memory split (3G/1G user/kernel split) --- (1) VMSPLIT_3G (2) VMSPLIT_2G (3) VMSPLIT_1G [*] High Memory Support [*] Tickless System (Dynamic Ticks) [*] High Resolution Timer Support Preemption Model (No Forced Preemption (Server)) --- (1) No Forced Preemption (Server) (2) Voluntary Kernel Preemption (Desktop) (3) Preemptible Kernel (Low-Latency Desktop)Memory split用户空间和内核空间的虚拟内存划分。对于512MB内存的i.MX6ULL3G/1G足够了Tickless System动态时钟省电Preemption Model抢占模式。嵌入式系统选Preemptible Kernel可以获得更低延迟Device Drivers设备驱动这是最大的菜单包含了所有驱动Device Drivers --- [*] Network device support --- [*] Ethernet driver support --- [*] DM9000 support [*] Character devices --- [*] Enable TTY [*] Serial drivers --- [*] IMX serial port support [*] I2C support --- [*] I2C device interface [*] SPI support --- [*] MMC/SD/SDIO card support --- [*] MMC block device driver这里根据你的硬件需求选择。i.MX6ULL开发板常用的驱动以太网FEC或DM9000串口IMX serial portI2CI2C device interfaceSPISPI support存储MMC/SD/SDIO card supportFile systems文件系统选择要支持的文件系统File systems --- [*] Second extended fs support (EXT2) [*] Ext3 journalling file system support [*] The Extended 4 (ext4) filesystem [*] Reiserfs support [*] Journalling Flash File System v2 (JFFS2) support [*] UBIFS file system support DOS/FAT/EXFAT/NT Filesystems --- [*] MSDOS fs support [*] VFAT fs support [*] exFAT fs support对于嵌入式系统EXT4用于SD卡或eMMC的普通分区UBIFS用于NAND FlashVFAT用于与Windows兼容的SD卡分区保存和加载配置修改完配置后按Esc退到主菜单选择Save保存Do you wish to save your new configuration? Save Exit选择输入保存路径默认是.output/linux/.config。你也可以把配置保存为另一个文件以便后续使用。选择Save configuration to an alternate file输入文件名。下次要加载这个配置时可以makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux loadcfg# 或者在menuconfig里选择Load configuration from an alternate file保存为defconfig如果你想创建自己的defconfig可以makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux savedefconfig这会在输出目录生成defconfig文件是当前配置的精简版本。你可以把它复制到arch/arm/configs/目录作为新的defconfigcpout/linux/defconfig arch/arm/configs/my_imx6ull_defconfig下次使用时makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux my_imx6ull_defconfig常用内核配置项说明下面列出一些常用且重要的配置项帮助你理解它们的含义。系统基本信息配置项说明推荐值CONFIG_LOCALVERSION_AUTO自动添加版本信息git commit hashy调试CONFIG_LOCALVERSION“”自定义版本后缀留空CONFIG_KERNEL_GZIP内核压缩方式gzipyCONFIG_KERNEL_XZ内核压缩方式xz更小但慢可选内存和进程配置项说明推荐值CONFIG_SMP对称多处理器支持y多核CONFIG_NR_CPUS2最大CPU核心数实际核心数CONFIG_VMSPLIT_3G3G用户/1G内核y内存1GBCONFIG_PREEMPT抢占式内核y低延迟网络相关配置项说明推荐值CONFIG_NET网络支持yCONFIG_INETTCP/IP协议栈yCONFIG_NETFILTER防火墙/Netfiltery需要时CONFIG_VLAN_8021QVLAN支持需要时CONFIG_BRIDGE网桥支持需要时驱动相关配置项说明推荐值CONFIG_SERIAL_IMXi.MX串口驱动yCONFIG_SERIAL_IMX_CONSOLE串口控制台yCONFIG_FECi.MX以太网驱动yCONFIG_DM9000DM9000以太网驱动需要时CONFIG_I2CI2C核心yCONFIG_I2C_IMXi.MX I2C驱动yCONFIG_SPISPI核心yCONFIG_SPI_IMXi.MX SPI驱动yCONFIG_MMCMMC/SD核心yCONFIG_MMC_SDHCISDHCI控制器需要时CONFIG_MMC_SDHCI_ESDHC_IMXi.MX ESDHC驱动y文件系统配置项说明推荐值CONFIG_EXT4_FSEXT4文件系统yCONFIG_VFAT_FSVFAT文件系统yCONFIG_FAT_FSFAT文件系统yCONFIG_NTFS_FSNTFS文件系统只读需要时CONFIG_JFFS2_FSJFFS2NOR Flash需要时CONFIG_UBIFS_FSUBIFSNAND Flash需要时CONFIG_PROC_FSproc伪文件系统yCONFIG_SYSFSsysfs伪文件系统y调试相关配置项说明推荐值CONFIG_DEBUG_KERNEL调试支持n发布版CONFIG_DEBUG_INFO调试信息-gy调试CONFIG_MAGIC_SYSRQSysRq键y调试CONFIG_KALLSYMS符号表yCONFIG_PRINTKprintk输出y踩坑笔记配置中的常见问题在配置内核时我踩过不少坑这里分享几个最常见的。问题1模块加载失败你编译了一个驱动为模块(m)但加载时失败insmod: ERROR: could not insert module dm9000.ko: Unknown symbol这通常是因为缺少依赖的模块或符号。检查一下modprobe --show-depends dm9000.ko它会显示依赖关系确保依赖的模块都加载了。问题2内核太大你发现编译出来的zImage有10MB太大了。可能原因编译了太多驱动为y应该编译为m模块可以按需求加载但是编进去了裁剪可就难了开启了太多调试选项没有精简不必要的功能解决方法使用menuconfig把不需要的驱动设为m或n。问题3配置冲突menuconfig里某个选项是灰色的无法选择。这是因为依赖关系不满足。按?查看依赖Symbol: FOO [n] Type : tristate Prompt: Foo support Defined at drivers/Kconfig:10 Depends on: BAR !BAZ需要先选中BAR取消BAZ。问题4.config被覆盖你编辑了.config但再次make时被覆盖。因为make会重新评估Kconfig依赖。解决方法修改defconfig而不是直接改.config用make oldconfig更新.config而不是重新生成禁用CONFIG_IKCONFIG内嵌配置实战创建自己的defconfig现在我们来创建一个适用于i.MX6ULL开发板的defconfig。方法1基于现有defconfig修改最简单的方法是基于imx_aes_defconfig修改# 加载基础配置makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux imx_aes_defconfig# 用menuconfig调整makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux menuconfig# 保存为精简defconfigmakeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux savedefconfig# 复制到源码目录cpout/linux/defconfig arch/arm/configs/my_imx6ull_defconfig方法2从头创建如果你想完全控制可以# 清空配置makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux allnoconfig# 用menuconfig逐步添加makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux menuconfig# 保存defconfigcpout/linux/.config arch/arm/configs/my_imx6ull_defconfig方法3脚本化配置对于重复性配置可以写一个脚本#!/bin/bash# config_my_board.shmakeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux imx_aes_defconfig# 使用scripts/config工具修改配置./scripts/config--fileout/linux/.config\--set-val CONFIG_LOCALVERSION-myboard\--disableCONFIG_DEBUG_KERNEL\--enableCONFIG_PREEMPT\--moduleCONFIG_DM9000# 更新配置makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux olddefconfig# 保存makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux savedefconfigcpout/linux/defconfig arch/arm/configs/my_imx6ull_defconfig配置优化建议根据使用场景给一些配置建议。最小化配置体积优先# 不编译模块 CONFIG_MODULESn # 精简驱动 CONFIG_NETDEVICESy # 只选必需的网卡驱动 # 去掉调试 CONFIG_DEBUG_KERNELn CONFIG_DEBUG_INFOn低延迟配置实时性优先# 抢占式内核 CONFIG_PREEMPTy # 高精度定时器 CONFIG_HIGH_RES_TIMERSy # 关闭节流 CONFIG_CPU_FREQn调试配置开发阶段# 调试信息 CONFIG_DEBUG_INFOy CONFIG_DEBUG_KERNELy CONFIG_MAGIC_SYSRQy # 符号表 CONFIG_KALLSYMSy CONFIG_KALLSYMS_ALLy # Oops定位 CONFIG_DEBUG_INFOy CONFIG_FRAME_POINTERy写在最后到这里Linux内核配置的核心内容你就掌握了。从Kconfig系统的原理到menuconfig的使用到常用配置项的含义再到创建自己的defconfig我们走完了配置的完整流程。配置不是神秘的艺术而是有规律可循的系统工程。理解了依赖关系、知道常用选项的作用、掌握了创建defconfig的方法你就可以根据自己的需求定制内核了——无论是最小化体积、优化性能还是增强调试能力都在你的掌控之中。下一篇文章我们将进入内核模块的世界。你会看到什么是内核模块为什么需要它如何编写一个简单的内核模块如何编译和加载模块模块和驱动的区别准备好了吗我们来探索内核的动态扩展能力。延伸阅读Kconfig Language Documentation - Kconfig语法文档Linux Kernel Module Programming Guide - 内核模块编程指南Kernel Newbies: Configuration - 配置教程
正点原子2026开发板教程——从0开始配置Linux内核(3):menuconfig不是黑魔法,只是有点绕
正点原子2026开发板教程——从0开始配置Linux内核3menuconfig不是黑魔法只是有点绕对应的仓库在https://github.com/Awesome-Embedded-Learning-Studio/imx-forge欢迎各位大佬提提意见克隆尝试为什么要写这篇配置教程如果说编译内核是照着菜谱做菜那配置内核就是自己设计菜谱。你选择哪些功能、不选哪些直接决定了内核的大小、性能、功能。但我第一次用menuconfig的时候完全是懵的状态。几百个菜单项每个还有子菜单看得我头晕眼花。网上的教程要么太简单只告诉你选这个选那个要么太复杂上来就讲Kconfig的语法规则。我想做的是介于这两者之间让你理解配置系统是怎么工作的知道常用配置项的作用并且能够创建自己的defconfig。到了最后配置不再是照抄别人的机械过程而是知道自己在做什么的理性选择。Kconfig系统配置的底层逻辑在进入menuconfig之前先理解一下Kconfig系统的工作原理。Linux内核的配置系统叫Kconfig它的核心思想是用一种专门的语法Kconfig语言描述配置选项配置选项之间可以有依赖关系用户通过图形界面menuconfig等选择配置生成.config文件供编译使用Kconfig文件的格式是这样的config DM9000 tristate DM9000 support depends on NET_ETHERNET ARM select CRC32 help DM9000 ethernet driver To compile this driver as a module, choose M here. The module will be called dm9000.这里解释一下各个字段的意思config DM9000定义一个配置选项名字是CONFIG_DM9000tristate三种状态y/m/n表示可以编译进内核(y)、编译成模块(m)、不编译(n)depends on依赖关系只有NET_ETHERNET和ARM都选了这个选项才可选select反向依赖选中DM9000时自动选中CRC32help帮助文本在menuconfig里按?可以看到tristate和bool的区别tristate是三种状态y/m/n用于驱动可以编译成模块bool是两种状态y/n用于核心功能不能编译成模块。当你运行make menuconfig时内核会扫描所有Kconfig文件构建出一颗配置树然后用ncurses库画出菜单界面。你选择配置项时Kconfig系统会自动处理依赖关系——比如你选了某个功能它依赖的其他选项会自动选中你取消了某个功能依赖它的选项会变灰或取消。defconfig到底是什么默认配置的艺术在02章我们提到了defconfig现在来深入理解一下。defconfig是default configuration的缩写字面意思是默认配置。但这个默认不是内核默认而是某个平台或板型的默认配置。对于i.MX6ULLdefconfig就是适合i.MX6ULL的默认配置选择。defconfig文件位于arch/arm/configs/目录arch/arm/configs/ ├── imx_aes_defconfig# NXP i.MX AES引擎支持的配置├── imx_v6_v7_defconfig# i.MX 6/7系列通用配置├── imx_v7_defconfig# i.MX 7系列配置├── multi_v7_defconfig# 多平台v7配置└──...打开一个defconfig看看内容CONFIG_SYSVIPCy CONFIG_POSIX_MQUEUEy CONFIG_NO_HZy CONFIG_HIGH_RES_TIMERSy CONFIG_PREEMPTy CONFIG_ARMy CONFIG_ARCH_MXCy ...defconfig只记录与默认值不同的配置项。如果某个选项在Kconfig里默认是ndefconfig里设为y那defconfig里会记录CONFIG_XXXy如果默认就是ydefconfig里就不会出现。这样的设计有几个好处defconfig文件很小只包含特定平台的特殊配置Kconfig升级时新增选项、改变默认值defconfig仍然有效不同平台的defconfig可以共享差异最小化当你运行make xxx_defconfig时内核做的事情是读取Kconfig文件建立完整的配置选项树应用指定的defconfig覆盖部分默认值评估所有依赖关系自动选中/取消相关选项生成完整的.config文件所以.config是Kconfig默认值 defconfig覆盖 依赖关系计算的结果不是简单的复制。menuconfig实战图形化配置教程现在我们进入实战环节打开menuconfig看看。启动menuconfigmakeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux menuconfig你应该看到类似这样的界面*** User Mode Linux port *** General setup --- [*] Enable loadable module support --- *** Enable the block layer --- System Type --- Bus support --- Kernel Features --- Boot options --- CPU Power Management --- Floating point emulation --- Userspace binary formats --- Power management options --- Networking support --- Device Drivers --- File systems --- Kernel hacking --- Security options --- Cryptographic API --- Library routines ---导航操作menuconfig的操作按键如下方向键移动光标Enter进入子菜单或选中选项Esc Esc返回上一级菜单Space切换选项状态y/n/m/搜索功能?查看帮助:q: 退出会提示是否保存搜索功能搜索功能非常实用尤其当你不知道某个选项在哪的时候。按/输入关键词Search: DM9000 Symbol: DM9000 [n] Type : tristate Prompt: DM9000 support Location: (1) - Device Drivers - Network device support (NETDEVICES [y]) - Ethernet driver support (ETHERNET [y]) Defined at drivers/net/ethernet/davicom/Kconfig:6 Depends on: NETDEVICES [y] ETHERNET [y] (ARM || MIPS) Selects: CRC32搜索结果告诉你选项的位置、类型、依赖关系。你还可以按数字键跳转到该选项需要支持跳转。常用菜单解析我们来看看几个常用的菜单。System Type系统类型这个菜单选择CPU和SoC类型System Type --- [*] Support for ARM processor type ARM system type (NXP i.MX based) --- ( ) Allwinner sunxi SoC ( ) Broadcom BCM2835 (X) NXP i.MX based ... [*] MXC support [*] Support for i.MX6ULL对于i.MX6ULL确保选中NXP i.MX based和Support for i.MX6ULL。Kernel Features内核特性这里配置内核的基本特性Kernel Features --- Memory split (3G/1G user/kernel split) --- (1) VMSPLIT_3G (2) VMSPLIT_2G (3) VMSPLIT_1G [*] High Memory Support [*] Tickless System (Dynamic Ticks) [*] High Resolution Timer Support Preemption Model (No Forced Preemption (Server)) --- (1) No Forced Preemption (Server) (2) Voluntary Kernel Preemption (Desktop) (3) Preemptible Kernel (Low-Latency Desktop)Memory split用户空间和内核空间的虚拟内存划分。对于512MB内存的i.MX6ULL3G/1G足够了Tickless System动态时钟省电Preemption Model抢占模式。嵌入式系统选Preemptible Kernel可以获得更低延迟Device Drivers设备驱动这是最大的菜单包含了所有驱动Device Drivers --- [*] Network device support --- [*] Ethernet driver support --- [*] DM9000 support [*] Character devices --- [*] Enable TTY [*] Serial drivers --- [*] IMX serial port support [*] I2C support --- [*] I2C device interface [*] SPI support --- [*] MMC/SD/SDIO card support --- [*] MMC block device driver这里根据你的硬件需求选择。i.MX6ULL开发板常用的驱动以太网FEC或DM9000串口IMX serial portI2CI2C device interfaceSPISPI support存储MMC/SD/SDIO card supportFile systems文件系统选择要支持的文件系统File systems --- [*] Second extended fs support (EXT2) [*] Ext3 journalling file system support [*] The Extended 4 (ext4) filesystem [*] Reiserfs support [*] Journalling Flash File System v2 (JFFS2) support [*] UBIFS file system support DOS/FAT/EXFAT/NT Filesystems --- [*] MSDOS fs support [*] VFAT fs support [*] exFAT fs support对于嵌入式系统EXT4用于SD卡或eMMC的普通分区UBIFS用于NAND FlashVFAT用于与Windows兼容的SD卡分区保存和加载配置修改完配置后按Esc退到主菜单选择Save保存Do you wish to save your new configuration? Save Exit选择输入保存路径默认是.output/linux/.config。你也可以把配置保存为另一个文件以便后续使用。选择Save configuration to an alternate file输入文件名。下次要加载这个配置时可以makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux loadcfg# 或者在menuconfig里选择Load configuration from an alternate file保存为defconfig如果你想创建自己的defconfig可以makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux savedefconfig这会在输出目录生成defconfig文件是当前配置的精简版本。你可以把它复制到arch/arm/configs/目录作为新的defconfigcpout/linux/defconfig arch/arm/configs/my_imx6ull_defconfig下次使用时makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux my_imx6ull_defconfig常用内核配置项说明下面列出一些常用且重要的配置项帮助你理解它们的含义。系统基本信息配置项说明推荐值CONFIG_LOCALVERSION_AUTO自动添加版本信息git commit hashy调试CONFIG_LOCALVERSION“”自定义版本后缀留空CONFIG_KERNEL_GZIP内核压缩方式gzipyCONFIG_KERNEL_XZ内核压缩方式xz更小但慢可选内存和进程配置项说明推荐值CONFIG_SMP对称多处理器支持y多核CONFIG_NR_CPUS2最大CPU核心数实际核心数CONFIG_VMSPLIT_3G3G用户/1G内核y内存1GBCONFIG_PREEMPT抢占式内核y低延迟网络相关配置项说明推荐值CONFIG_NET网络支持yCONFIG_INETTCP/IP协议栈yCONFIG_NETFILTER防火墙/Netfiltery需要时CONFIG_VLAN_8021QVLAN支持需要时CONFIG_BRIDGE网桥支持需要时驱动相关配置项说明推荐值CONFIG_SERIAL_IMXi.MX串口驱动yCONFIG_SERIAL_IMX_CONSOLE串口控制台yCONFIG_FECi.MX以太网驱动yCONFIG_DM9000DM9000以太网驱动需要时CONFIG_I2CI2C核心yCONFIG_I2C_IMXi.MX I2C驱动yCONFIG_SPISPI核心yCONFIG_SPI_IMXi.MX SPI驱动yCONFIG_MMCMMC/SD核心yCONFIG_MMC_SDHCISDHCI控制器需要时CONFIG_MMC_SDHCI_ESDHC_IMXi.MX ESDHC驱动y文件系统配置项说明推荐值CONFIG_EXT4_FSEXT4文件系统yCONFIG_VFAT_FSVFAT文件系统yCONFIG_FAT_FSFAT文件系统yCONFIG_NTFS_FSNTFS文件系统只读需要时CONFIG_JFFS2_FSJFFS2NOR Flash需要时CONFIG_UBIFS_FSUBIFSNAND Flash需要时CONFIG_PROC_FSproc伪文件系统yCONFIG_SYSFSsysfs伪文件系统y调试相关配置项说明推荐值CONFIG_DEBUG_KERNEL调试支持n发布版CONFIG_DEBUG_INFO调试信息-gy调试CONFIG_MAGIC_SYSRQSysRq键y调试CONFIG_KALLSYMS符号表yCONFIG_PRINTKprintk输出y踩坑笔记配置中的常见问题在配置内核时我踩过不少坑这里分享几个最常见的。问题1模块加载失败你编译了一个驱动为模块(m)但加载时失败insmod: ERROR: could not insert module dm9000.ko: Unknown symbol这通常是因为缺少依赖的模块或符号。检查一下modprobe --show-depends dm9000.ko它会显示依赖关系确保依赖的模块都加载了。问题2内核太大你发现编译出来的zImage有10MB太大了。可能原因编译了太多驱动为y应该编译为m模块可以按需求加载但是编进去了裁剪可就难了开启了太多调试选项没有精简不必要的功能解决方法使用menuconfig把不需要的驱动设为m或n。问题3配置冲突menuconfig里某个选项是灰色的无法选择。这是因为依赖关系不满足。按?查看依赖Symbol: FOO [n] Type : tristate Prompt: Foo support Defined at drivers/Kconfig:10 Depends on: BAR !BAZ需要先选中BAR取消BAZ。问题4.config被覆盖你编辑了.config但再次make时被覆盖。因为make会重新评估Kconfig依赖。解决方法修改defconfig而不是直接改.config用make oldconfig更新.config而不是重新生成禁用CONFIG_IKCONFIG内嵌配置实战创建自己的defconfig现在我们来创建一个适用于i.MX6ULL开发板的defconfig。方法1基于现有defconfig修改最简单的方法是基于imx_aes_defconfig修改# 加载基础配置makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux imx_aes_defconfig# 用menuconfig调整makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux menuconfig# 保存为精简defconfigmakeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux savedefconfig# 复制到源码目录cpout/linux/defconfig arch/arm/configs/my_imx6ull_defconfig方法2从头创建如果你想完全控制可以# 清空配置makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux allnoconfig# 用menuconfig逐步添加makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux menuconfig# 保存defconfigcpout/linux/.config arch/arm/configs/my_imx6ull_defconfig方法3脚本化配置对于重复性配置可以写一个脚本#!/bin/bash# config_my_board.shmakeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux imx_aes_defconfig# 使用scripts/config工具修改配置./scripts/config--fileout/linux/.config\--set-val CONFIG_LOCALVERSION-myboard\--disableCONFIG_DEBUG_KERNEL\--enableCONFIG_PREEMPT\--moduleCONFIG_DM9000# 更新配置makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux olddefconfig# 保存makeARCHarmCROSS_COMPILEarm-none-linux-gnueabihf-Oout/linux savedefconfigcpout/linux/defconfig arch/arm/configs/my_imx6ull_defconfig配置优化建议根据使用场景给一些配置建议。最小化配置体积优先# 不编译模块 CONFIG_MODULESn # 精简驱动 CONFIG_NETDEVICESy # 只选必需的网卡驱动 # 去掉调试 CONFIG_DEBUG_KERNELn CONFIG_DEBUG_INFOn低延迟配置实时性优先# 抢占式内核 CONFIG_PREEMPTy # 高精度定时器 CONFIG_HIGH_RES_TIMERSy # 关闭节流 CONFIG_CPU_FREQn调试配置开发阶段# 调试信息 CONFIG_DEBUG_INFOy CONFIG_DEBUG_KERNELy CONFIG_MAGIC_SYSRQy # 符号表 CONFIG_KALLSYMSy CONFIG_KALLSYMS_ALLy # Oops定位 CONFIG_DEBUG_INFOy CONFIG_FRAME_POINTERy写在最后到这里Linux内核配置的核心内容你就掌握了。从Kconfig系统的原理到menuconfig的使用到常用配置项的含义再到创建自己的defconfig我们走完了配置的完整流程。配置不是神秘的艺术而是有规律可循的系统工程。理解了依赖关系、知道常用选项的作用、掌握了创建defconfig的方法你就可以根据自己的需求定制内核了——无论是最小化体积、优化性能还是增强调试能力都在你的掌控之中。下一篇文章我们将进入内核模块的世界。你会看到什么是内核模块为什么需要它如何编写一个简单的内核模块如何编译和加载模块模块和驱动的区别准备好了吗我们来探索内核的动态扩展能力。延伸阅读Kconfig Language Documentation - Kconfig语法文档Linux Kernel Module Programming Guide - 内核模块编程指南Kernel Newbies: Configuration - 配置教程