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

相关推荐
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ24 分钟前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
05大叔2 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密2 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
dashizhi20152 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑
内卷焦虑人士2 小时前
Windows安装WSL2+Ubuntu 22.04
linux·windows·ubuntu
卷福同学3 小时前
【养虾日记】QClaw操作浏览器自动化发文
运维·人工智能·程序人生·自动化
woho7788993 小时前
不同网段IP的网络打印机,打印、扫描设置
运维·服务器·网络
耗子会飞4 小时前
小白学习固定VM虚拟机的centos服务器的IP
运维·服务器·centos
dddddppppp1234 小时前
qemu模拟的一个内核驱动 io口中断
linux
程序员老赵4 小时前
超全 Docker 镜像源配置指南|Windows/Mac/Linux一键搞定,拉镜像再也不卡顿
linux·后端·容器