内核版本: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:二值选项(y或n)tristate:三态选项(y、n、m,支持模块编译)
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"会显示为一个带有--->符号的项。 - 如果用户选择了它(设为
y或m),那么它本身会变成一个可以进入的子菜单(里面包含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)。