Linux驱动复习小记

三大组成部分:

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服务。

五、交叉编译

  1. 定义: 在一个平台(宿主机,如x86 Ubuntu)上编译出能在另一个不同架构平台(目标机,如ARM i.MX6ULL)上运行的程序。
  2. 原因: 宿主机和目标机的CPU架构不同(x86 vs ARM),不能直接运行对方的二进制代码。
  3. 工具链: 示例为 arm-linux-gnueabihf-gcc 版本 4.9.4
  4. 配置: 需要安装交叉编译工具链,并将其路径添加到宿主机的环境变量(如修改 ~/.bashrc 文件)中,以便编译器能找到并使用。
相关推荐
2501_946490381 小时前
Hirender MTC时间码技术实操——PH®CLUB激光投影声光电精准同步实现方案
大数据·运维·人工智能·hirender·hecoos
田里的水稻1 小时前
OE_ubuntu24.04如何安装中文简体拼音输入法
运维·前端·chrome
东北甜妹2 小时前
Rsync+sersync 数据实时同步
运维
白云偷星子2 小时前
RHCSA笔记5
linux·运维·笔记
czxyvX2 小时前
013-Linux基础IO
linux
Wpa.wk2 小时前
har文件转为接口自动化测试用例
运维·测试工具·自动化·测试用例·接口自动化
红豆子不相思2 小时前
haproxy七层代理
linux·学习
志栋智能2 小时前
自动化运维还有这样一种模式。
运维·人工智能·安全·机器人·自动化
!沧海@一粟!2 小时前
zabbix监控模板
linux·运维