三大组成部分:
Uboot 系统启动的第一个程序,初始化硬件环境
Kernel Linux操作系统的核心,负责资源管理和硬件抽象
RootFS 根文件系统 内核启动后第一个挂载的系统文件,包含了必要的程序和库是用户空间的基础
UBoot是一串裸机程序,主要负责初始化CPU 内存 时钟 外设 等硬件
主要功能
- 初始化硬件:CPU模式、内存、时钟、中断控制器、看门狗、缓存等。
- 初始化板级硬件:如串口用于调试交互,网口用于网络下载。
- 初始化软件:网络协议栈。
- 将Linux内核镜像从存储设备(如SD卡、eMMC)搬运到内存(DDR)中。
- 向Linux内核传递必要的启动参数。
向内核传递参数
机器++ID++ 设备树二进制文件在内存中的++地址++ bootargs++字符串++
传统使用特定寄存器,现代基于设备树的方式 Uboot会将bootargs等参数填充到设备树的chosen结点中,然后将dtb的内存地址传递给内核。内核启动时解析设备树获取信息
r0 = 0(固定值)r1 = Machine ID(对于旧式ATAGs传递方式)r2 = DTB (Device Tree Blob) Address in Memory
目的:让内核知道它运行在那种硬件上(ID或设备树) 如何启动(bootargs) 确保内核能正确识别驱动硬件
编译与移植
使用交叉编译工具链编译源码得到u-boot.bin
将u-boot.bin烧录到存储介质的特定位置使开发板可以从该介质启动
常用命令:
printenv,setenv,saveenv: 管理U-Boot环境变量。bootz: 启动zImage格式的内核。tftp,ping: 网络下载和测试。mmc read/write/erase/info: 操作eMMC/SD卡。
2.Kernel(Linux内核)
4.1.15版本
编译流程:解压源码------配置.confg------编译啮内核镜像和设备树得到arch/arm/boot/zImage 和
arch/arm/boot/dts/*.dtb
3.内核裁剪:为了移除不需要的驱动/子系统,减小内核大小和启动时间
使用make menuconfig 图形界面选择性地禁用模块(设为N)
4.启动流程:
- U-Boot完成硬件初始化和参数传递后,跳转到内核入口。
- 内核解压自身。
- 执行
start_kernel函数,初始化各种子系统(中断、调度器、内存管理、控制台、MMU等)。 - 挂载根文件系统。
- 启动
init进程(用户空间的第一个进程)。
5.移植流程
- 编译内核和设备树。
- 配置TFTP服务器(用于网络下载)。
- 将编译好的内核镜像和设备树文件放到TFTP目录。
- 开发板通过U-Boot从网络下载并启动。
6.内核功能:多任务调度、内存管理、文件系统、网络、硬件管理。
7.镜像格式区别
vmlinux: ELF格式未压缩的内核镜像(可调试)。Image: 原始的、未压缩的内核镜像。zImage:Image+ 解压缩代码,压缩后体积较小,适合引导。uImage:zImage+ U-Boot专用的64字节头部信息。
8.内核加载地址(0x80800000)
- 为了避开U-Boot本身及其使用的内存区域(如参数区、页表区),选择一个安全的内存地址加载内核。
9.Kernel Panic(内核恐慌)
由于根文件系统挂载失败、驱动程序错误、内核bug、硬件冲突等严重错误导致内核无法继续运行
10.用户空间与内核空间交互
copy_to_user(): 内核向用户空间复制数据。copy_from_user(): 用户空间向内核复制数据。- 系统调用:
open,read,write,close,ioctl,mmap等是用户程序请求内核服务的标准接口。
四、RootFS(根文件系统)
内核成功启动后挂在的第一个文件系统,是整个文件系统的起点
常见目录结构:
/dev: 设备文件。/bin: 基本命令 (ls, cp, sh...)。/lib: 共享库文件。/etc: 系统配置文件。/mnt,/media: 挂载其他文件系统的挂载点。/tmp: 临时文件。/usr: 用户程序、库、头文件等。
3.制作方法
- BusyBox: 提供大量标准Unix工具的精简集合,常用于构建最小根文件系统的基础。
- Buildroot: 自动化构建嵌入式Linux系统的工具,可同时编译内核、U-Boot和根文件系统。
4.来源:通常由开发板厂商或项目提供。
5.挂载方式
- NFS (Network File System): 网络文件系统,开发调试时常用,直接将PC上的目录作为开发板的根文件系统挂载,便于实时更新和调试。
6.手动挂载NFS示例: mount -t nfs -o nolock,rw 192.168.1.3:/path/to/rootfs /mnt
7.配置NFS服务器:需要在PC端安装nfs-kernel-server,编辑/etc/exports文件导出目录,并重启NFS服务。
五、交叉编译
- 定义: 在一个平台(宿主机,如x86 Ubuntu)上编译出能在另一个不同架构平台(目标机,如ARM i.MX6ULL)上运行的程序。
- 原因: 宿主机和目标机的CPU架构不同(x86 vs ARM),不能直接运行对方的二进制代码。
- 工具链: 示例为
arm-linux-gnueabihf-gcc版本4.9.4。 - 配置: 需要安装交叉编译工具链,并将其路径添加到宿主机的环境变量(如修改
~/.bashrc文件)中,以便编译器能找到并使用。