嵌入式 Linux 开发与驱动
1. U-Boot
1.1 功能
硬件初始化:上电后配置 DDR、串口、存储等。
内核引导:加载 Linux 内核(zImage/uImage)、设备树(dtb)、根文件系统(initramfs)。
固件升级:支持 TFTP、NFS、SD 卡、USB 更新镜像。
调试管理:命令行、环境变量配置、内存读写。
1.2 编译流程
-
安装交叉编译器(如
arm-linux-gnueabihf-)。 -
清理环境:
make distclean -
选择开发板配置:
make <board_defconfig>示例:
make am335x_boneblack_defconfig -
编译:
make CROSS_COMPILE=arm-linux-gnueabihf- -
输出文件:
u-boot.bin、u-boot.img、MLO/SPL
2. Linux 内核
2.1 功能
硬件驱动层:管理 CPU、内存、外设。
系统服务层:进程管理、文件系统、网络协议栈。
用户接口层:提供系统调用给应用。
2.2 编译流程
-
设置环境变量:
export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- -
配置内核:
make menuconfig -
编译:
make zImage make dtbs make modules -
输出文件:
-
arch/arm/boot/zImage(内核镜像) -
arch/arm/boot/dts/*.dtb(设备树) -
drivers/*.ko(内核模块)
-
2.3 内核裁剪
关闭无关驱动(如 PC 网卡、SCSI、蓝牙)。
只保留实际需要的文件系统(ext4、NFS、YAFFS2)。
减少调试功能,减小体积,加快启动速度。
3. 根文件系统 (RootFS)
3.1 功能
提供用户空间运行环境,包含命令、库和配置文件。
内核启动后挂载 rootfs,并执行 /sbin/init。
3.2 制作流程
-
BusyBox:提供精简工具集。
make menuconfig make install输出
_install目录。 -
目录结构:
/bin /sbin /etc /dev /proc /sys /tmp /lib /usr /mnt -
C 库支持:glibc 或 musl。
-
文件系统格式:
-
initramfs(打包进内核)
-
jffs2/yaffs2(NAND)
-
ext4(SD/eMMC)
-
3.3 启动配置
U-Boot 中设置 bootargs:
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rw rootfstype=ext4 init=/sbin/init
3.4 关键脚本
/etc/inittab:定义 init 运行级别。
/etc/init.d/rcS:开机初始化脚本。
/etc/profile:环境变量设置。
4. 内核驱动
4.1 驱动分类
字符设备驱动
按字节流访问(串口、LED、按键)。
用户态通过 /dev/xxx 访问。
块设备驱动
按数据块(512B/4KB)访问(硬盘、SD 卡)。
支持缓存机制,效率高。
网络设备驱动
提供数据包收发接口。
依赖网络协议栈(TCP/IP、CAN)。
应用层通过 socket API 使用。
4.2 驱动编译方式
静态编译(built-in)
编译进内核 (y),随内核启动自动加载。
流程:
-
编写驱动
hello.c。 -
修改
Kconfig:config HELLO bool "Hello Driver" default n -
修改
Makefile:obj-$(CONFIG_HELLO) += hello.o -
make menuconfig选中配置项。 -
驱动随内核编译进
zImage。
动态编译(模块 .ko)
编译为独立模块 (m),可运行时加载/卸载。
流程(内核源码集成):
-
修改
Kconfig:config HELLO tristate "Hello Driver" -
修改
Makefile:obj-$(CONFIG_HELLO) += hello.o -
make menuconfig选 M。 -
make modules生成hello.ko。
流程(独立 Makefile 编译):
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
加载卸载命令:
insmod hello.ko # 加载
lsmod # 查看模块
rmmod hello # 卸载
dmesg # 查看内核日志
4.3 区别总结
| 特性 | 静态编译 | 动态编译 |
|---|---|---|
| 配置 | y | m |
| 输出 | 编进 zImage | .ko |
| 加载方式 | 随内核启动 | insmod/modprobe |
| 卸载 | 不支持 | rmmod |
| 适用场景 | 必须随内核启动的驱动(存储控制器) | 可选外设、调试驱动 |
5. 系统启动完整流程
[上电]
↓
[BootROM] → SoC 内部固化代码
↓
[SPL/MLO] → 初始化 DDR,启动 U-Boot
↓
[U-Boot] → 加载内核 + dtb + rootfs
↓
[Linux 内核] → 驱动加载,挂载 rootfs
↓
[/sbin/init] → 执行启动脚本 (/etc/init.d/rcS)
↓
[用户应用] → 系统正常运行
更多推荐



所有评论(0)