Linux的DD命令

最近发现DD命令还挺有用的。

已经从板子当前活动槽 _a 提取完成。

文件:

  • xbl_config.elf(C:\Users\John Jiang\Documents\Codex\2026-08-12\xian\outputs\xbl_config.elf)
  • xbl_config_a 完整分区镜像(C:\Users\John Jiang\Documents\Codex\2026-08-12\xian\outputs\xbl_config_a_partition.img)

提取信息:

复制代码
当前槽位:          _a
分区:              /dev/block/by-name/xbl_config_a
实际块设备:        /dev/block/mmcblk0p3
完整分区大小:      237,568 字节
ELF有效大小:       139,448 字节(0x220B8)

ELF 的 SHA-256:

复制代码
5903F15B3B992126F294D3B1371557C0243FE23D855AE12976EC8CBAD5FC4A90

完整分区镜像 SHA-256:

复制代码
41DA633AC42E7BE17E0D5190FEFF81FF6C87C0D0E34CDDF1B075EAC0D8536DFB

提取出的 ELF 已确认:

  • 开头是标准 ELF64 文件头;
  • 包含 11 个 Program Header;
  • 其中仍有9个 PT_LOAD 配置载荷;
  • ELF 有效结束位置由最后一个安全元数据段确定为 0x220B8
  • 分区剩余区域全部是 0x00 填充,已从 xbl_config.elf 中剔除;
  • 完整原始分区镜像也已保留,方便还原或复核。

它与之前的旧版本不同:

复制代码
旧版本大小:143,544 字节
旧版本 SHA:3C07ADF54086649A679B4D798F52D99148B975B424EC12D5B2BDD7E3ACD8C032

新版本大小:139,448 字节
新版本 SHA:5903F15B3B992126F294D3B1371557C0243FE23D855AE12976EC8CBAD5FC4A90

因此可以确认:这次确实提取到了新刷版本的 xbl_config.elf,不是之前文件的重复副本。

我是从板子当前启动槽的 xbl_config 原始分区直接读取出来的,没有通过 Android 文件系统查找,也没有修改或刷写分区。

1. 确认设备和当前槽位

复制代码
D:\Tools\platform-tools\adb.exe devices -l
D:\Tools\platform-tools\adb.exe shell getprop ro.boot.slot_suffix

板子返回:

复制代码
_a

说明目前使用 A 槽。

2. 查找 xbl_config 分区

复制代码
D:\Tools\platform-tools\adb.exe shell "ls -l /dev/block/by-name | grep -i xbl"

结果中有:

复制代码
xbl_config_a -> /dev/block/mmcblk0p3
xbl_config_b -> /dev/block/mmcblk0p4

因此当前正在使用的分区是:

复制代码
/dev/block/by-name/xbl_config_a

3. 获取 root 权限

读取原始块设备通常需要 root:

复制代码
D:\Tools\platform-tools\adb.exe root
D:\Tools\platform-tools\adb.exe wait-for-device
D:\Tools\platform-tools\adb.exe shell id

这里设备返回了:

复制代码
uid=0(root)

4. 查询分区大小

复制代码
D:\Tools\platform-tools\adb.exe shell "blockdev --getsize64 /dev/block/by-name/xbl_config_a"

返回:

复制代码
237568

即完整分区大小为 237,568 字节。

5. 直接提取完整分区

执行:

复制代码
D:\Tools\platform-tools\adb.exe pull ^
  /dev/block/by-name/xbl_config_a ^
  D:\tmp\xbl_config_a_partition.img

也可以使用 dd

复制代码
D:\Tools\platform-tools\adb.exe shell ^
  "dd if=/dev/block/by-name/xbl_config_a of=/data/local/tmp/xbl_config_a_partition.img bs=4096"

D:\Tools\platform-tools\adb.exe pull ^
  /data/local/tmp/xbl_config_a_partition.img ^
  D:\tmp\xbl_config_a_partition.img

第一种方法更直接,而且不会在板子上留下临时文件。

这个操作只有读取:

复制代码
if=/dev/block/by-name/xbl_config_a

没有向分区写入任何内容。

6. 检查是否为 ELF

检查前几个字节:

复制代码
D:\Tools\platform-tools\adb.exe shell ^
  "dd if=/dev/block/by-name/xbl_config_a bs=64 count=1 2>nul | od -An -tx1"

开头是:

复制代码
7f 45 4c 46

对应:

复制代码
\x7FELF

说明分区开头直接就是 xbl_config.elf,不存在额外的 GPT 或文件系统封装。

7. 为什么还要裁剪?

完整分区大小为:

复制代码
237568 字节

但它包含:

复制代码
xbl_config ELF
+
分区尾部的 0x00 填充

通过解析 ELF Header 和所有 Program Header,计算每个段的:

复制代码
p_offset + p_filesz

最大的结束位置来自最后一个安全元数据段:

复制代码
0x21000 + 0x10B8 = 0x220B8

换算为十进制:

复制代码
0x220B8 = 139448 字节

检查 0x220B8 后面的全部内容,只有:

复制代码
0x00

因此:

  • xbl_config_a_partition.img:完整原始分区备份
  • xbl_config.elf:去掉分区尾部填充后的有效 ELF

8. 简化版操作

如果只想备份分区,执行下面几条就够了:

复制代码
set "ADB=D:\Tools\platform-tools\adb.exe"

"%ADB%" root
"%ADB%" wait-for-device
"%ADB%" shell getprop ro.boot.slot_suffix
"%ADB%" shell "ls -l /dev/block/by-name/xbl_config*"
"%ADB%" pull /dev/block/by-name/xbl_config_a D:\tmp\xbl_config_a_partition.img

注意最后一条中的 _a 要根据当前槽位调整。如果当前槽位是 _b,则应该执行:

复制代码
"%ADB%" pull /dev/block/by-name/xbl_config_b D:\tmp\xbl_config_b_partition.img

最核心的方法就是:

确认当前 A/B 槽位,通过 /dev/block/by-name/xbl_config_<slot> 读取完整原始分区,再根据 ELF Program Header 的最大结束偏移去掉分区尾部填充。

相关推荐
华清远见成都中心2 小时前
FreeRTOS事件组(Event Group)的工作机制分析
服务器·网络·网络协议
xiaoxiangsiyan2 小时前
RHCE2026云原生路线EX188和EX288完整备考指南
运维·网络·云原生·自动化
九硕智慧建筑一体化厂家2 小时前
从照明节能到碳排可见:能碳平台助力机房迈向 “零碳” 未来
运维·笔记·智慧城市
张洛闻Eren2 小时前
MySQL 管理复制拓扑【MySQL第四课】
linux·运维·数据库·mysql
Meya11272 小时前
RFID 机房资产管理系统:告别手工台账,实现资产全流程自动管控
大数据·服务器
西安景驰电子2 小时前
《PTP精确时间协议系列》第二篇:工程部署、调试与性能优化
运维·服务器·网络·数据库·windows·性能优化
xiaohua10093 小时前
Linux-JVM线程查询
linux·jvm
Aision_3 小时前
代码安全学习手记(二):SCA 软件成分分析原理与 OWASP Dependency-Check 集成实战
运维·人工智能·学习·安全·web安全·网络安全
yinshuzhineng3 小时前
如何提升生产线自动化水平,降低人工成本?
运维·人工智能·自动化·制造