OpenBMC内核驱动开发与编译指南:从修改到部署的全流程解析
在OpenBMC开发过程中,内核驱动的修改和调试是常见的需求。本文将以修改PMBUS驱动为例,详细介绍OpenBMC内核驱动的完整开发流程。
一、OpenBMC内核驱动开发环境概述
OpenBMC使用Yocto项目作为构建系统,内核驱动开发涉及多个目录和编译阶段:
关键目录结构
openbmc/
├── build/
│ └── {machine}/ # 构建目录
│ ├── tmp/
│ │ ├── work-shared/ # 共享源码目录(开发修改位置)
│ │ │ └── {machine}/kernel-source/
│ │ ├── work/ # 工作目录(编译中间文件)
│ │ └── deploy/ # 部署目录(最终输出文件)
│ └── conf/
└── meta-phosphor/ # 平台层配置
二、内核驱动修改流程
2.1 定位驱动源码
以修改PMBUS驱动pmbus_crps.c为例:
cd build/{machine}/
vi tmp/work-shared/{machine}/kernel-source/drivers/hwmon/pmbus/pmbus_crps.c
重要提醒:work-shared目录是源码的共享副本,修改前请确认是否需要创建永久补丁。
2.2 创建备份(推荐)
# 备份修改的文件
cp drivers/hwmon/pmbus/pmbus_crps.c /tmp/pmbus_crps.c.backup
三、编译流程详解
3.1 编译前确认驱动类型
# 确认驱动配置
grep -r "CONFIG_SENSORS_PMBUS" tmp/work-shared/{machine}/kernel-source/.config
3.2 编译方法选择
方法一:清理并完整编译(最可靠)
# 清理编译状态(不会删除源码)
bitbake -c cleansstate linux-aspeed# 重新编译内核
bitbake virtual/kernel# 重新构建镜像
bitbake obmc-phosphor-image
方法二:强制重新编译(快速开发)
bitbake -c compile -f virtual/kernel
bitbake -c install virtual/kernel
bitbake obmc-phosphor-image
方法三:单独编译驱动模块
# 进入内核构建目录
cd tmp/work-shared/{machine}/kernel-source/# 编译特定驱动
make M=drivers/hwmon/pmbus/
3.3 编译清理命令的区别
| 命令 | 作用 | 是否删除源码 | 使用场景 |
|---|---|---|---|
cleansstate | 清除编译状态和输出 | ❌ 不删除 | 常规重新编译 |
clean | 基本清理,保留缓存 | ❌ 不删除 | 轻微修改后 |
cleanall | 彻底清理,包括下载缓存 | ❌ 不删除源码 | 解决依赖问题 |
四、输出文件定位与分析
4.1 主要部署目录
# 最终部署文件位置
cd tmp/deploy/images/{machine}/# 查看生成的镜像文件
ls -la
4.2 关键输出文件
obmc-phosphor-image-*.static.mtd- MTD镜像文件kernel-*.bin- 内核镜像modules-*.tgz- 内核模块包rootfs.*- 根文件系统
4.3 驱动编译输出查找
# 查找编译后的驱动模块
find tmp/work/ -name "pmbus_crps.ko" -type f# 检查编译中间文件
find tmp/work/ -name "pmbus_crps.o" -type f# 查看编译日志
tail tmp/work/{machine}/linux-aspeed/*/temp/log.do_compile
五、部署与测试
5.1 整体镜像部署
# 使用生成的MTD镜像刷写设备
flashcp obmc-phosphor-image-{machine}-*.static.mtd /dev/mtd6
5.2 模块热更新测试
# 如果是可加载模块,可以热更新
rmmod pmbus_crps
insmod /lib/modules/$(uname -r)/kernel/drivers/hwmon/pmbus/pmbus_crps.ko# 验证驱动加载
dmesg | grep pmbus
lsmod | grep pmbus
5.3 功能验证
# 检查hwmon设备
ls /sys/class/hwmon/
cat /sys/class/hwmon/hwmon*/name# 查看传感器数据
cat /sys/class/hwmon/hwmon*/temp*_input
六、开发调试技巧
6.1 启用驱动调试
在驱动代码中添加调试信息:
#define DEBUG
#include <linux/printk.h>dev_dbg(&client->dev, "CRPS probe: device found\n");
printk(KERN_DEBUG "pmbus_crps: initialization complete\n");
6.2 编译配置检查
# 确认调试选项开启
grep "CONFIG_DEBUG" tmp/work-shared/{machine}/kernel-source/.config
grep "CONFIG_DYNAMIC_DEBUG" tmp/work-shared/{machine}/kernel-source/.config
6.3 快速开发迭代流程
# 1. 修改驱动源码
vi tmp/work-shared/{machine}/kernel-source/drivers/hwmon/pmbus/pmbus_crps.c# 2. 快速编译测试
bitbake -c compile -f virtual/kernel# 3. 检查编译结果
find tmp/work/ -name "pmbus_crps.ko" -exec ls -la {} \;# 4. 部署测试
bitbake obmc-phosphor-image -c rootfs
七、常见问题与解决方案
7.1 编译输出文件找不到
如果tmp/deploy/images/{machine}/目录为空:
# 检查编译是否成功
bitbake -s | grep linux-aspeed# 查找所有可能的输出位置
find tmp/ -name "*.ko" -o -name "*.bin" | head -10# 检查机器配置
grep "^MACHINE" conf/local.conf
7.2 修改被覆盖
解决方案:创建永久补丁
# 生成补丁文件
cd tmp/work-shared/{machine}/kernel-source/
git diff drivers/hwmon/pmbus/pmbus_crps.c > 0001-pmbus-crps-fix.patch# 将补丁添加到对应的recipe中
7.3 驱动加载失败
# 查看详细错误信息
dmesg | tail -20# 检查依赖关系
modinfo pmbus_crps.ko# 验证内核符号版本
nm pmbus_crps.ko | grep unresolved
7.4 目录结构说明
{machine}:指代具体的机器名称,如huakun-turin、witherspoon等- 实际路径根据具体的OpenBMC项目和机器配置而定
八、最佳实践总结
- 修改前备份:始终备份对
work-shared目录的修改 - 渐进式编译:开发时使用
-f强制编译加快迭代速度 - 版本控制:重要修改应及时创建补丁并提交到recipe
- 验证部署:编译后务必验证输出文件是否生成正确
- 日志追踪:充分利用
dmesg和编译日志进行问题定位 - 路径适配:将文中的
{machine}替换为实际使用的机器名称
通过本文介绍的完整流程,OpenBMC开发者可以高效地进行内核驱动的修改、编译和调试工作,显著提升开发效率。
本文基于OpenBMC最新社区实践编写,具体命令可能因版本差异而需要调整。实际使用时请将{machine}替换为对应的机器名称。
