《嵌入式操作系统》_内核编译练习与配置文件讲解_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)

相关推荐
触想工业平板电脑一体机3 小时前
【触想智能】MES工位一体机在自动化生产线上的作用和市场应用前景分析
大数据·运维·自动化
芥子沫3 小时前
书签管理工具使用:Readeck-Docker部署和使用技巧
运维·docker·容器·书签管理
ba_pi3 小时前
每天写点什么2026-01-19-docker如何使用GPU
运维·docker·容器
xlq223223 小时前
4.LInux权限
linux·运维·服务器
txinyu的博客3 小时前
(续篇):手写 C++ 完整 HTTP/1.1 服务器
服务器·网络协议·http
HiTomcat3 小时前
一键自动化部署 macOS 开发环境
运维·macos·自动化
Bdygsl3 小时前
Linux(10)—— 进程控制(等待)
linux·运维·服务器
c++逐梦人3 小时前
进程的优先级与切换
linux·服务器·操作系统