一、Linux内核概述
(一)内核和操作系统
1、内核是操作系统的核心,内核是水果的核。
2、内核提供最核心的功能,内核是操作系统工作的基础,决定整个系统的性能和稳定性。
3、ubuntu是操作系统,内核是Linux。操作系统是在内核基础上添加了shell、库、应用程序等。
4、 shell不属于内核。shell会保护内核,通过命令间接操作内核,用户和内核的交流,不直接操作内核。
5、库函数是系统调用的接口,不属于Linux内核。
6、桌面管理器支持可视的界面,是操作系统加的。
(二)Linux内核的功能
1、进程管理
2、内存管理
3、文件系统:对上层提供接口,规定下层不同硬件
4、寄存器控制:寄存器配置
5、网络协议栈
操作系统是内核加一些简单的库和其他配置,不会有庞大的操作系统。
(三)Linux内核的特点
1、安卓-手机
wins-电脑
Linux不是专门为嵌入式设计的,但是是最适合嵌入式的。
2、微内核:内核+多模块,模块可以随意添加,但是耦合性低。模块之间的联系小,沟通不便。
宏内核:模块之间耦合性高,效率高,模块间沟通方便,一个模块出现问题,其他模块也会受到影响。
3、精简指令集处理器,支持丰富的硬件平台。
4、稳定性高,开机时间长,不会有什么改变。
5、轻量级,成本低,硬件配置低也可以运行,具有较强的裁剪性,没有用的功能可以裁剪。
6、除了嵌入式,95%服务器用Linux也很多,丰富的网络协议。
7、开源。更新活跃资料多。
二、Linux内核源码结构
(一)Linux获取![](https://i-blog.csdnimg.cn/blog_migrate/fc066b0db14d73ce7a35e50ccfdd9fe3.png)
1、arch
不同公司不同系列芯片,本节用到的是samsung下的处理器(CPU级别)mach-exynos。
2、block
磁盘设备的支持
3、COPYING:版权信息
4、CREITS:内核贡献者
5、crypto:加密
6、readme:基础说明
7、Documentation:详细说明
8、drivers:驱动
i2c:驱动程序
9、firmware:固件
10、fs:文件系统,管理访问磁盘
11、inculde:头文件
12、init:Linux内核启动
13、ipc:Linux进程间通信机制
14、kconfig:图形化界面
15、kernel:内核的核心,核心调度算法
16、lib:库
17、Makefile:编译
18、mm:内存管理代码
19、net网络协议,可以部分编译
20、samples:示例
21、scripts:脚本工具
22、security:安全相关代码
23、sound:音频驱动
24、tools:使用Linux借助的工具
25、usr:压缩解压代码
26、virt:虚拟化相关代码
三、Linux内核源码配置
软硬件匹配,对用到的处理器对应的代码进行选择和配置。
(一)Linux内核源码配置
(二).config的作用
内核编译赋值为y的变量对应的功能。被注释的功能不会被编译。
含y的变量越多,内核功能越强大,体积越大。
.config是默认配置,可能与实际情况不相符,手动修改内核配置。
没有用的功能可以手动注释。
四、Linux内核源码编译
(一)Linux内核源码编译方法
1、方法一
有可能会配置混乱,内核有很多功能具有依赖关系,随意修改会造成很严重的后果。
NFS->TCP/IP->DM9000网卡。
2、方法二
配置Linux内核功能:
3、方法二的好处
1)方面寻找功能,掌握某个功能的作用。
2)自动检查和解决依赖关系。
(二)make menuconfig使用方法
1、Y:选中
2、N:不选中
3、?:help
4、/:搜索
5、使用make menuconfig的本质还是修改.config文件
(三)make menuconfig常用配置选项
1、设置交叉编译工具
2、内核压缩、进程通信
3、指定第几个串口
4、网络支持
以下是比较重要的三个
5、驱动设置
6、文件系统
(四) make menuconfig的修改设置
*:和内核编译到一起,编译到uImage中。
M:编译成独立的模块,不需要重新编译uImage。
(五)uImage介绍
UImage介绍 UImage是为了配合uboot而定义的一种image格式。在原有的image基础之上,mkimage工具会自动添加一个64字节的头部信息供uboot启动系统来使用。模块的好处可以随意的加载和卸载,不对uImage产生影响。
五、Linux编译内核模块
(一)设备树介绍
Linux下的驱动驱动程序和硬件设施分离,驱动代码包括逻辑代码(怎么电灯)和硬件信息(点哪个灯,配置寄存器),逻辑代码放到drivers,硬件信息放到了设备树,硬件修改只需要修改设备树即可。
内核由两部分组成,逻辑代码放在uImage中,硬件信息放到了设备树中。Linux在运行时,将uImage和设备树都加载到内存。
设备树有源代码(不是C语言),编译成二进制代码,可以被加载到内存。
不同开发板设备树不同,开发板对应设备树,此时设备树对应的还是芯片厂家对应的评估板。
samsung对应的origen的设备树:
(二)编译设备树
六、Linux编译设备树
(一)编译内核
编译成可以在CPU执行的,zImage再被加工成被uboot引导的uImage。
(二)编译模块
.ko:内核模块后缀,可装可卸载。