如何用Bash脚本从Linux设备树提取QSPI Flash分区偏移?
从设备树提取QSPI Flash分区偏移的Shell脚本实现
问题背景
设备树包含大量内核可直接解析的信息,但容器内的用户态环境无法正常访问/proc/device-tree。需从指定设备树节点/amba/spi@ff0f0000/flash@0下提取Flash分区的偏移值,用于生成与设备树配置匹配的Xilinx MCS镜像。以下是简化版设备树(制表符缩进):
/ { amba { spi@ff0f0000 { flash@0 { partition@0 { label = "boot"; reg = < 0x0 0x1000000 >; }; partition@1000000 { label = "kernel"; reg = < 0x1000000 0x2E80000 >; }; partition@3e80000 { label = "bootscr"; reg = < 0x3e80000 0x10000 >; }; }; }; }; };
实现脚本
以下Shell脚本可直接解析设备树文件,提取目标节点下所有分区的标签与偏移值:
#!/bin/bash # 替换为你的设备树文件路径 DTS_FILE="your_dts_file.dts" # 提取flash@0节点内的所有partition节点内容 PARTITION_CONTENT=$(awk '/flash@0 {/,/^[[:space:]]*}/ { if ($0 ~ /partition@/) in_part=1; if (in_part) { print $0; if ($0 ~ /^[[:space:]]*}/) in_part=0; } }' "$DTS_FILE") # 解析分区的标签和偏移值并格式化输出 echo "分区标签 偏移地址" echo "-------------------" echo "$PARTITION_CONTENT" | awk ' /label =/ { label = substr($3, 2, length($3)-2); } /reg =/ { offset = substr($3, 2); printf "%-10s %s\n", label, offset; } '
脚本说明
- 节点范围定位:通过
awk锁定flash@0节点的代码块,再从中筛选出所有partition@开头的节点内容。 - 字段提取:二次调用
awk,分别截取label字段(去除首尾引号)和reg字段中的第一个十六进制值(即分区偏移地址)。 - 使用方式:修改脚本中的
DTS_FILE路径为实际设备树文件路径,执行脚本即可得到格式化的分区偏移信息。
示例输出
执行脚本后将得到如下格式化结果:
分区标签 偏移地址 ------------------- boot 0x0 kernel 0x1000000 bootscr 0x3e80000
内容的提问来源于stack exchange,提问作者Compholio
相关产品推荐
相关产品推荐

