vim编辑hex文件

我在 Dell T5820 GPU异常排查 想尝试是否能够通过修订VBIOS的SSID,也就是VBIOS中标记GPU型号的修改来扰过 Dell Precision T5820 工作站 对GPU卡的限制(如果它确实只允许使用workstation graphics的话)

这就需要能够直接编辑hex十六进制文件,如果使用HexEdit这种工具虽然方便,但是在Linux平台,显然 vim 更为普遍。Linux中有一个系统工具 xxd 可以处理二进制文件,vim可以通过调用 xxd 来实现 修订AMD MI50 VBIOS的BAR size 这样的固件修改。

备注

修订SSID最好使用 Red BIOS Editor (RBE) 或者在 GOPUpd 处理完后再用 hexedit 修改

  • 首先在终端用vim打开ROM文件:

-b 参数(Binary模式)打开ROM二进制文件
vim -b v420_32gb.rom

备注

-b 参数(Binarymoshi)非常重要,可以防止vim尝试猜测字符编码或者在文件末尾自动添加换行符,避免破坏固件结构

  • 转换成十六进制可视化:

进入vim后,输入如下命令

调用xxd转换标准十六进制
:%!xxd

此时文件会由乱码转换成标准的十六进制网格,左侧是偏移量(Offset),中间是十六进制数据,右侧是ASCII预览

  • 编辑文件,建议使用 r 替换单个字符, 不要使用 i 插入模式以免文件长度偏移破坏校验

  • 转换回二进制并保存

这一步非常关键,如果没有转换回去情况下保存,文件会损坏

转换回二进制并保存
:%!xxd -r
:wq

这里 -r 表示 reverse,将十六进制文本重新压回原始二进制流

警告

当使用vim调用xxd修改二进制的ROM文件,一定要确保修改前后ROM大小不变,谨防因为不小心按了回车导致字节数增加。