前言:
关于linux内核、设备驱动、根文件系统的移植教程在我上传的linux内核、设备驱动、根文件系统移植资源中已有详细讲解,本篇讲述移植过程中需要了解的一些知识 。
一、Linux内核概述
1、内核与操作系统
内核 内核是一个操作系统的核心 ,提供了操作系统最基本的功能,是操作系统工作的基础,决定着整个系统的性能和稳定性操作系统 操作系统是在内核的基础上 添加了各种工具集、桌面管理器、库、shell、应用程序等
2、内核的特点
- 代码结构清晰、模块化设计
- 支持丰富的硬件平台
- 较高的稳定性
- 轻量化及较强的裁剪性
- 开放源代码
- 更新活跃、用户较多、资料丰富
- 支持丰富的网络协议
二、Linux内核源码结构
1、Linux内核源码获取
- Linux内核 源码下载
https://www.kernel.org/ - Linux内核 版本命名
主版本号.次版本号.修订版本 - Linux内核 版本选择
支持对应的硬件平台 相对成熟的版本(资料多) 稳定版本(次版本号为偶数的版本一般都是稳定版)
2、Linux内核源码结构
- 平台相关代码
arch : 与CPU架构 相关的源代码 - 平台无关代码
如下:
block:磁盘设备的支持 crypto:加密相关
drivers:设备驱动 firmware:固件
fs:文件系统 include:头文件
init:内核初始化 ipc:进程间通信
kernel:内核核心调度机制等 lib:库
mm:内存管理 net:网络协议
scripts:工具、脚本等 security:安全
usr:打包与压缩 virt:虚拟
- 帮助文档、示例程序、工具等
如下:
COPYING: 版权
CREDITS: 内核贡献者
README: 说明文档
Documentation: 帮助文档
Makefile: 编译管理
samples: 示例
tools: 工具
三、Linux内核的配置与编译
1、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表示内核没有选中该功能,内核编译时该功能对应的代码不会被编译,内核的体积也会减小。
默认配置只能保证内核拥有最基本的功能,我们需要根据自己的实际需求对内核做进一步的配置
方法1:
直接修改.config文件(不推荐)
方法2:
make menuconfig
2、图形化界面配置
如下:
输入Y,显示“*”,内核中该功能被选中,相关代码会被编译进内核
输入N,显示“ ”,内核中该功能不被选中,相关代码不会被编译进内核
如下:
输入Y,显示“*”,内核中该功能被选中,相关代码会被编译进内核
输入N,显示“ ”,内核中该功能不被选中,相关代码不会被编译进内核
输入M,显示“M”,内核中该功能被选为模块(被编译为独立的模块)
注:使用make menuconfig配置的本质还是修改.config文件
3、Linux内核源码编译
内核编译(以下命令均在内核源码的顶层目录下执行)
make uImage
编译内核(编译选为“*”的选项到内核)
make modules
编译内核模块(编译选为“M”的选项为独立模块)
make dtbs
编译设备树(将设备树源文件dts编译为二进制文件dtb)
make clean
删除编译过程中产生的中间文件
四、设备树
1、概念
设备树是一种描述硬件信息的数据结构 ,Linux内核运行时可以通过设备树将硬件信息直接传递给Linux内核,而不再需要在Linux内核中包含大量的冗余编码
2、设备树语法概述
如下:
dts 设备树源文件
dtsi 类似于头文件,包含一些公共的信息,可被其它设备树文件引用
dtb 编译后的设备树文件
设备树的语法为树状结构 ,由一系列的节点和属性组成,根节点下包含子节点。 子节点下还可以包含子节点,节点内部包含了对应设备的属性
3、驱动移植过程
1.在make menuconfig界面中选中要安装的驱动
2.在设备树中添加/修改相应的设备信息
3.重新编译内核/设备树
五、根文件系统移植
1、概念与内容
概念:根文件系统是 内核启动后挂载的第一个文件系统系统引导程序 会在根文件系统挂载后,从中把一些基本的初始化脚本和服务等加载到内存中去运行
内容:
bin shell命令(elf格式)(通过busybox编译生成)
dev 设备文件(内核启动后会将设备信息写入该目录)
etc 内核配置文件
lib 共享库(elf格式)(从交叉编译工具链中获取)
linuxrc 内核运行的第一个应用程序(通过busybox编译生成)
mnt 挂载目录(非必要)
proc 进程相关文件(内核启动后会将进程信息写入该目录)
root 超级用户家目录(非必要)
sbin 系统管理shell命令(elf格式)(通过busybox编译生成)
sys 驱动相关文件(内核启动后会将驱动信息写入该目录)
usr shell命令(elf格式)(通过busybox编译生成)
2、Busybox
BusyBox将很多常用的工具集成到一个很小的可执行文件中 ,为普通用户提供大多数常用的命令 ,BusyBox实现的命令都是精简版的,很多扩展都不支持。
BusyBox的获取 :https://busybox.net/downloads/
由于其轻量级的特点适用于嵌入式硬件中。
到这里就结束啦!
|