一、Linux内核概述
1.1 内核与操作系统
内核
内核是一个操作系统的核心,提供了操作系统最基本的功能,是操作系统工作的基础,决定着整个系统的性能和稳定性
操作系统
操作系统是在内核的基础上添加了各种工具集、桌面管理器、库、shell、应用程序等
uboot中的shell命令是放在跟目录下的bin中,开发板中的shell命令是放在根文件系统中
1.2 Linux层次结构
1.3 Linux内核特点
代码结构清晰、模块化设计
支持丰富的硬件平台
较高的稳定性
轻量化及较强的裁剪性
开放源代码
更新活跃、用户较多、资料丰富
支持丰富的网络协议
... ...
二、Linux内核源码结构
2.1 Linux内核源码获取
Linux内核源码下载
https://www.kernel.org/
Linux内核版本命名
主版本号.次版本号.修订版本
Linux内核版本选择
支持对应的硬件平台
相对成熟的版本(资料多)
稳定版本(次版本号为偶数的版本一般都是稳定版)
2.2 Linux内核源码结构
平台相关代码
arch: 与CPU架构相关的源代码
上图是我们用的exynos4412的处理器的源代码
平台无关代码
block:磁盘设备的支持 crypto:加密相关
drivers:设备驱动 firmware:固件
fs:文件系统 include:头文件
init:内核初始化 ipc:进程间通信
kernel:内核核心调度机制等 lib:库
mm:内存管理 net:网络协议
scripts:工具、脚本等 security:安全
usr:打包与压缩 virt:虚拟
帮助文档、示例程序、工具等
COPYING: 版权
CREDITS: 内核贡献者
README: 说明文档
Documentation: 帮助文档
Makefile: 编译管理
samples: 示例
tools: 工具
... ...
三、Linux内核源码配置
指定处理器架构及编译工具
在Linux内核源码顶层目录下的Makefile中指定(ARCH、CROSS_COMPILE)
导入当前处理器的默认配置
make <soc_name>_defconfig
注1:soc_name为当前使用的处理器的名字
注2:内核源码的arch/arm/configs下对各个厂商的soc都有一个默认配置文件。执行该命令后就会将对应的配置文件中的信息导入到源码顶层目录下的.config。文件中CONFIG_xxx=y表示内核选中了该功能,内核编译时就会将该功能对应的代码编译,内核的体积也会增大。#CONFIG_xxx is not set表示内核没有选中该功能,内核编译时该功能对应的代码不会被编译,内核的体积也会减小。
四、Linux内核源码编译
4.1 修改配置
默认配置只能保证内核拥有最基本的功能,我们需要根据自己的实际需求对内核做进一步的配置
方法1: 直接修改.config文件(不推荐)
方法2: make menuconfig
4.2 make menuconfig
修改配置
[ ] 有两种状态
输入Y,显示“*”,内核中该功能被选中,相关代码会被编译进内核
输入N,显示“ ”,内核中该功能不被选中,相关代码不会被编译进内核
< > 有三种状态
输入Y,显示“*”,内核中该功能被选中,相关代码会被编译进内核
输入N,显示“ ”,内核中该功能不被选中,相关代码不会被编译进内核
输入M,显示“M”,内核中该功能被选为模块(被编译为独立的模块)
注:使用make menuconfig配置的本质还是修改.config文件
五、Linux编译内核模块
内核编译(以下命令均在内核源码的顶层目录下执行)
make uImage
编译内核(编译选为“*”的选项到内核)
make modules
编译内核模块(编译选为“M”的选项为独立模块)
make dtbs
编译设备树(将设备树源文件dts编译为二进制文件dtb)
make clean
删除编译过程中产生的中间文件
make modules实验步骤:
先在顶层目录下用make menuconfig进入图形化界面,然后把DM9000选为M(将会编译成模块)。
保存后,再回到顶层目录下用make modules命令编译模块,下图可见DM9000被编译了。
.ko就是内核模块的意思,我们可以把dm9000.ko单独安装到linux内核,也可以单独卸载。
六、Linux编译设备树
make dtbs实验步骤:
我们复制一份和我们的设备最接近的设备树,再进行修改。
修改当前目录下的Makefile,先搜索origen,看它是怎么编译的,我们把fs4412添加在它下方。
回到顶层目录后,用make dtbs进行编译,就会发现已经生成了fs4412的两个文件