为什么输出结果是PASS,match_count和count都等于4但是提示dd: /dev/mem: Bad address
时间: 2024-01-30 12:01:50 浏览: 19
如果输出结果是`PASS`,但同时又出现`dd: /dev/mem: Bad address`的错误提示,有可能是脚本中的循环次数`count`设置不正确,导致`dd`命令尝试访问非法的地址。具体来说,如果`count`的值大于写入数据的字节数,那么在循环到未初始化的内存区域时,`dd`命令就会返回`Bad address`错误。
解决这个问题的方法是在脚本中设置正确的循环次数。如果写入的数据是4个字节,那么循环次数应该为1,即:
```
start_addr=0x30000000
end_addr=0x30000003
data_write=0x55AA55AA
count=1 # 循环1次,写入4个字节的数据
match_count=0
for ((addr=$start_addr; addr<$end_addr+1; addr=addr+4)); do
echo "addr=$(printf '%X' $addr)"
echo -ne "\x55\xAA\x55\xAA" | dd of=/dev/mem bs=4 count=1 seek=$(($addr/4)) conv=notrunc 2>/dev/null
data=$(echo -ne "\x55\xAA\x55\xAA" | hexdump -e '/4 "%08x\n"')
data_text=$(echo -ne "\x55\xAA\x55\xAA" | hexdump -e '/4 "%08x\n"' | sed 's/../& /g')
echo "data_text: $data_text"
data_read=$(dd if=/dev/mem bs=4 count=1 skip=$(($addr/4)) 2>/dev/null | hexdump -e '/4 "%08x\n"')
data_read_text=$(echo "$data_read" | hexdump -v -e '/4 "%08x\n"' | sed 's/../& /g')
echo "data_read_text: $data_read_text"
if [ "$data_read" == "$data" ]; then
match_count=$((match_count+1))
echo "match_count: $match_count"
fi
done
# 输出结果
echo "count: $count"
echo "match_count: $match_count"
# 判断结果
if [ $match_count -eq $count ]; then
echo "PASS"
else
echo "FAIL"
fi
```
在这个例子中,循环次数`count`设置为1,因为写入的数据是4个字节。同时,`addr`每次增加4,以便在循环中依次写入每个字节。在读取数据时,`dd`命令的`skip`参数也应该按照4字节的步长进行设置,以便正确读取数据。