《嵌入式操作系统》_内核编译练习与配置文件讲解_20260119

内核版本:2.6.35.7

有三种版本:kernel.org官方版本、三星移植的版本、九鼎移植的版本

1.文件分析

(1)kbuild,就是kernel bulid的意思,内核编译,文件规则有点像makefile

(2)makefile,管理整个内核的makefile

(3)mk,九鼎自己加的自动化脚本

2.编译内核(练习)

(1)清除文件夹中残留的配置

进入内核文件夹中,试用一下命令行:

bash 复制代码
make distclean

(2)检查makefile

查看交叉编译工具是否有问题

(3)配置文件

1.初步配置

bash 复制代码
make x210ii_qt_defconfig

出现以下结果:

2.二次配置(类似于BIOS)

bash 复制代码
make menuconfig

可能出现的错误1:

ncurses库未安装,使用代码:

sudo apt-get install libncurses-dev

可能出现的错误2:

屏幕太小了,放不下图形化界面

(4)直接make -j16

-j16 以16线程进行编译,编译完成之后的内核镜像不在源码的根目录下,在arch/arm/boot这个目录下,镜像的名字叫zimage

3.配置说明

make x210ii_qt_defconfig的意思就是

bash 复制代码
cp arch/arm/configs/x210ii_qt_defconfig .config

这是别人做好的配置。别人把自己的.config文件保存过来的配置文件。

make menuconfigh主要看懂界面的提示:

箭头导航菜单,选项结尾有(-->)的可以进入子菜单,高亮的字母是快捷键,Y键编入,N键去除,M键模块化,?表示帮助,/表示全局搜索。*表示已编入,空白表示去除,M表示已模块化, 表示只可以包含或者去除,<>表示可以被模块化编译。

linux内核中的功能模块有三种编译方法:编入(Y)、去除(N)、模块化(M)。

编入:直接编译链接到zimage中

去除:不编译连接到zimage中

模块化:将该模块单独链接为一个内核模块.ko文件,之后linux系统启动之后可以动态加载或卸载模块(类似于驱动)

4.menuconfig的实现

menuconfig图新化的实现:使用ncurses库用文字实现的图形化界面

调用:script\kconfig\lxdialog目录下的一些c文件

menuconfig内容从哪里来:

1.读取kconfig文件,几乎内核中每个文件下都有kconfig文件,kconfig文件中包含了给menuconfig准备的菜单项目。

2.读取.config文件,其中包含了这些选项的状态。

menuconfig效果:如果有改动且保存,退出时把图形化配置信息重新写入.config文件中,指导整个编译过程

5.kconfig文件详解

kconfig按照一定的规则来写,使得menuconfig可以识别,然后冲里面提取有用信息组成menuconfig中的菜单项。

如果之后做驱动移植,需要自己添加kconfig中的一个配置项来将这个设备驱动添加到内核的配置文件中。

#开头为注释

1.基本结构:

config表示菜单中的一个配置项,基本结构:

bash 复制代码
config <配置项名称>
    <类型> <选项名称>
    default <默认值>
    --help--
        <帮助文本>
  • bool/tristate/int/string :定义数据类型
    • bool:二值选项(yn
    • tristate:三态选项(ynm,支持模块编译)
  • default:设置默认值
  • help:添加说明文本(需缩进)

2.依赖关系

depends on <依赖条件>,基本结构:

bash 复制代码
config FOO
    bool "启用FOO功能"
    depends on BAR  # 仅当BAR启用时显示此配置
# ||逻辑或,!取反,&&逻辑与

3.菜单分组

menuconfig:创建可展开的配置项,其子选项的可见性依赖于该配置项的开启状态。。示例:

bash 复制代码
menuconfig NETWORK_SUBSYSTEM
    bool "Enable Network Subsystem"
    if NETWORK_SUBSYSTEM
        config NET_PROTOCOL_A
            ...
        config NET_PROTOCOL_B
            ...
    endif
  • menuconfig 界面中,"Enable Network Subsystem" 会显示为一个带有 ---> 符号的项。
  • 如果用户选择了它(设为 ym),那么它本身会变成一个可以进入的子菜单(里面包含 NET_PROTOCOL_A, NET_PROTOCOL_B 等)。
  • 如果用户没有选择它(设为 n),那么整个子菜单在界面上通常是不可见或不可配置的。if ... endif 块用于控制子菜单的可见性。

menu:创建可视化分组菜单,用于归类配置项,不产生实际配置逻辑。示例:

bash 复制代码
menu "网络设置"
    config NET_IPV4
        bool "启用IPv4"
    config NET_IPV6
        bool "启用IPv6"
endmenu

choice:创建互斥单选组,用户必须且只能选择组内一个选项。语法:

bash 复制代码
choice
    prompt "提示文本"
    default 默认选项
    config 选项1
        bool "选项1描述"
    config 选项2
        bool "选项2描述"
endchoice

4.条件选择

select <依赖项> if <条件>,示例:

bash 复制代码
config USB
    bool "USB支持"
    select PCI if ARCH_X86  # 在x86架构下自动启用PCI

5.递进引用

source表示引入一个子config,形成一个递进关系(如果说你在linux内核中添加了一个文件夹,一定要在该文件夹中添加kconfig,并在上一层目录中source引用它)

bash 复制代码
menu "Device Drivers"

source "drivers/base/Kconfig"

source "drivers/connector/Kconfig"

source "drivers/mtd/Kconfig"

source "drivers/of/Kconfig"

6.Kconfig文件修改测试

复制一份DM9000的配置文件下来,改名称为LXY3080Ti,展示名称Kconfig test,依赖于DM9000,自动选择......

触发条件

选项从未被配置过

内核配置系统会对比当前 .config 文件(保存了上次的配置结果)。如果 Kconfig test 这个选项在之前的 .config 里没有任何记录(既没被选中,也没被排除),当你在本次会话中第一次看到它或选中它时,就会标上 (NEW)

相关推荐
bush41 分钟前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行52015 分钟前
Linux 11 动态监控指令top
linux
小宇宙Zz21 分钟前
Maven依赖冲突
java·服务器·maven
Inhand陈工1 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智1 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩2 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
shushangyun_2 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
古城小栈2 小时前
Unix 与 Linux 异同小叙
linux·服务器·unix
施努卡机器视觉2 小时前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
程序猿阿伟2 小时前
《Chrome离线扩展安装的底层逻辑与场景落地指南》
服务器·网络·chrome