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 | 合理大小 |
| 文件类型 | file | ELF 共享对象 |
| ELF 架构 | readelf -h | ARM |
| ELF 类型 | readelf -h | DYN (共享对象) |
| 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 4 | d00dfeed |
| 格式正确性 | 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] 设备树格式错误或损坏解决方法:
- 检查源码
.dts文件语法 - 使用
dtc手动编译测试 - 查看详细错误信息
错误 4:架构不匹配
✗ 架构错误 (期望: ARM, 实际: x86-64)原因:使用了错误的工具链(系统 gcc 而不是交叉编译器)。
解决方法:
确保 CROSS_COMPILE 环境变量正确设置。
审查标准
通过条件
驱动模块审查通过需要满足:
- ✓ ELF 架构为 ARM
- ✓ ELF 类型为共享对象
- ✓ 存在 init 函数
- ✓ 存在 exit 函数
警告条件
以下情况会产生警告但不会导致失败:
- 设备树文件不存在(某些驱动不需要)
- System.map 不存在(可选文件)
- modules 目录不存在(无模块依赖)
相关文档
- build_driver.sh - 驱动构建脚本
- deploy_driver.sh - 驱动部署脚本
- 驱动开发最佳实践