Skip to content

review_driver.sh - 驱动构建产物审查脚本

脚本概述

review_driver.sh 是 IMX-Forge 驱动开发基建系统的产物审查脚本。它在部署前验证驱动模块的完整性、设备树的正确性以及构建信息的准确性。

核心功能

  • 模块审查:检查驱动模块的架构、符号、依赖
  • 设备树审查:验证设备树格式和节点
  • 构建信息:显示详细的构建元数据
  • 产物清单:列出所有构建产物

设计理念

这个脚本的设计目标是"部署前检查",确保只有正确的产物才能被部署到目标系统。它是质量保证的重要环节。

依赖关系

review_driver.sh
    ├─ out/driver_artifacts/ (驱动构建产物)
    ├─ modinfo (模块信息工具)
    ├─ readelf (ELF 分析工具)
    ├─ dtc (设备树编译器)
    └─ fdtdump (设备树转储工具,可选)

参数说明

命令语法

bash
./scripts/driver_helper/review_driver.sh <> [板卡]

位置参数

参数说明默认值
驱动驱动名称 (如: example-driver, led)-
板卡板卡名称alpha-board

执行流程

总体架构

┌─────────────────────────────────────────────────────────────┐
│  参数验证                                                    │
│  - 检查驱动名称                                             │
│  - 检查产物目录是否存在                                     │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│  驱动模块审查                                                │
│  - review_driver_module()                                   │
│    - 文件信息(大小、类型)                                  │
│    - 模块信息(modinfo)                                     │
│    - ELF 头信息(架构、类型)                                │
│    - 代码段分析                                             │
│    - 符号表检查(init/exit 函数)                           │
│    - 依赖关系                                               │
│    - 模块参数                                               │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│  设备树审查                                                  │
│  - review_device_tree()                                     │
│    - 文件信息                                               │
│    - 格式验证(魔数、版本)                                  │
│    - 节点结构                                               │
│    - Compatible 属性                                        │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│  构建信息显示                                                │
│  - review_build_info()                                      │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│  审查总结                                                    │
│  - 产物清单                                                 │
│  - 通过/失败判定                                           │
└─────────────────────────────────────────────────────────────┘

审查函数详解

review_driver_module()

作用:审查驱动模块的完整性和正确性。

检查项目

项目检查方法期望结果
文件大小ls -lh合理大小
文件类型fileELF 共享对象
ELF 架构readelf -hARM
ELF 类型readelf -hDYN (共享对象)
init 函数readelf -s存在
exit 函数readelf -s存在
依赖关系modinfo有效
模块参数modinfo有效

输出示例

🔧 驱动模块审查
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

📦 文件信息:
  文件: out/driver_artifacts/example-driver/alpha-board/example_driver.ko
  大小: 12K
  类型: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV)

📋 模块信息:
  文件名: example_driver.ko
  版本: 1.0
  描述: Example driver for IMX-Forge
  作者: Developer
  许可证: GPL

🔍 ELF头信息:
  架构: ARM
  类型: DYN (共享对象)
  类别: ELF32
  ✓ 架构正确 (ARM)

📊 代码段分析:
  text:  1234  - 代码段
  data:  567   - 数据段
  bss:   89    - 未初始化段
  总计:  1890 (762)

🎯 关键符号:
  ✓ init 函数存在
  ✓ exit 函数存在

🔗 依赖关系:
  ✓ 无外部依赖 (独立模块)

⚙️  模块参数:
  无模块参数

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 检查总结:
  ✓ 驱动模块结构完整

review_device_tree()

作用:审查设备树的格式和内容。

检查项目

项目检查方法期望结果
文件大小ls -lh合理大小
DTB 魔数xxd -p -l 4d00dfeed
格式正确性dtc -I dtb -O dts成功反编译
节点数量统计 { 数量合理
Compatible 属性grep compatible=有效值

输出示例

🌳 设备树审查
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

📦 文件信息:
  文件: out/driver_artifacts/example-driver/alpha-board/imx6ull-aes-example-driver.dtb
  大小: 256

🔍 设备树结构:
/dts-v1/;
/ {
    ...
};

📋 格式验证:
  ✓ DTB魔数正确 (0xd00dfeed)
  版本: 17
  节点数量: 5

🎯 设备节点:
  - example-device

🔗 Compatible属性:
  - example,imx6ull-driver

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✓ 设备树格式正确

review_build_info()

作用:显示构建信息文件内容。

构建信息内容

驱动构建信息
================
构建时间: 2026-04-29 12:34:56
构建用户: user@hostname
内核类型: 主线内核 (linux_mainline)
驱动目录: /home/user/imx-forge/driver/example-driver/alpha-board

产物文件:
  - example_driver.ko (12K)
  - imx6ull-aes-example-driver.dtb (256)

使用示例

审查单个驱动

bash
# 指定板卡
./scripts/driver_helper/review_driver.sh example-driver alpha-board

# 使用默认板卡
./scripts/driver_helper/review_driver.sh example-driver

完整审查输出

🔍 驱动构建产物审查
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

驱动: example-driver
板卡: alpha-board
目录: /home/user/imx-forge/out/driver_artifacts/example-driver/alpha-board

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔧 驱动模块审查
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[驱动模块审查内容...]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🌳 设备树审查
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[设备树审查内容...]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📋 构建信息
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[构建信息内容...]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📊 审查总结
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

✅ 驱动模块审查通过

📦 产物清单:
  example_driver.ko              12K
  imx6ull-aes-example-driver.dtb 256
  build_info.txt                 256

✓ 所有产物审查通过,可以安全部署!

部署命令: ./scripts/driver_helper/deploy_driver.sh out/driver_artifacts/example-driver/alpha-board

故障排除

常见错误

错误 1:产物目录不存在

[ERROR] 构建产物目录不存在: out/driver_artifacts/unknown-driver/alpha-board

解决方法

先运行构建脚本:

bash
./scripts/driver_helper/build_driver.sh unknown-driver alpha-board

错误 2:驱动模块缺失关键符号

  ✗ init 函数缺失
  ✗ exit 函数缺失
✗ 驱动模块存在问题

原因:驱动源码中没有定义模块初始化/退出函数。

解决方法

检查驱动源码是否包含:

c
module_init(driver_init);
module_exit(driver_exit);

错误 3:设备树格式错误

[ERROR] 设备树格式错误或损坏

解决方法

  1. 检查源码 .dts 文件语法
  2. 使用 dtc 手动编译测试
  3. 查看详细错误信息

错误 4:架构不匹配

  ✗ 架构错误 (期望: ARM, 实际: x86-64)

原因:使用了错误的工具链(系统 gcc 而不是交叉编译器)。

解决方法

确保 CROSS_COMPILE 环境变量正确设置。

审查标准

通过条件

驱动模块审查通过需要满足:

  1. ✓ ELF 架构为 ARM
  2. ✓ ELF 类型为共享对象
  3. ✓ 存在 init 函数
  4. ✓ 存在 exit 函数

警告条件

以下情况会产生警告但不会导致失败:

  • 设备树文件不存在(某些驱动不需要)
  • System.map 不存在(可选文件)
  • modules 目录不存在(无模块依赖)

相关文档

Built with VitePress