1. U-Boot

1.1 功能

硬件初始化:上电后配置 DDR、串口、存储等。

内核引导:加载 Linux 内核(zImage/uImage)、设备树(dtb)、根文件系统(initramfs)。

固件升级:支持 TFTP、NFS、SD 卡、USB 更新镜像。

调试管理:命令行、环境变量配置、内存读写。

1.2 编译流程

  1. 安装交叉编译器(如 arm-linux-gnueabihf-)。

  2. 清理环境:

    make distclean
    
  3. 选择开发板配置:

    make <board_defconfig>
    

    示例:make am335x_boneblack_defconfig

  4. 编译:

    make CROSS_COMPILE=arm-linux-gnueabihf-
    
  5. 输出文件:u-boot.binu-boot.imgMLO/SPL

2. Linux 内核

2.1 功能

硬件驱动层:管理 CPU、内存、外设。

系统服务层:进程管理、文件系统、网络协议栈。

用户接口层:提供系统调用给应用。

2.2 编译流程

  1. 设置环境变量:

    export ARCH=arm
    export CROSS_COMPILE=arm-linux-gnueabihf-
    
  2. 配置内核:

    make menuconfig
    
  3. 编译:

    make zImage
    make dtbs
    make modules
    
  4. 输出文件:

    • 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 制作流程

  1. BusyBox:提供精简工具集。

    make menuconfig
    make install
    

    输出 _install 目录。

  2. 目录结构

    /bin  /sbin  /etc  /dev  /proc
    /sys  /tmp  /lib  /usr  /mnt
    
  3. C 库支持:glibc 或 musl。

  4. 文件系统格式

    • 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),随内核启动自动加载。

流程:

  1. 编写驱动 hello.c

  2. 修改 Kconfig

    config HELLO
        bool "Hello Driver"
        default n
    
  3. 修改 Makefile

    obj-$(CONFIG_HELLO) += hello.o
    
  4. make menuconfig 选中配置项。

  5. 驱动随内核编译进 zImage

动态编译(模块 .ko)

编译为独立模块 (m),可运行时加载/卸载。

流程(内核源码集成):

  1. 修改 Kconfig

    config HELLO
        tristate "Hello Driver"
    
  2. 修改 Makefile

    obj-$(CONFIG_HELLO) += hello.o
    
  3. make menuconfig 选 M。

  4. 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 区别总结

      特性静态编译动态编译
      配置ym
      输出编进 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)
         ↓
      [用户应用] → 系统正常运行
      
      Logo

      智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

      更多推荐