十六进制转储 (hexdump)
将内存数据以经典的 hex dump 格式输出,每行 16 字节,包含地址、十六进制值和 ASCII 字符。
输出格式
00000000: 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 00 00 00 00 |Hello World!....|
00000010: 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 |................|
每行由三部分组成:
- 地址 — 8 位十六进制地址,基于
base参数递增 - 十六进制 — 每字节 2 位十六进制 + 空格,不足 16 字节时对齐填充
- ASCII — 可打印字符(0x20~0x7e)原样显示,其余显示为
.
API
void hexdump(void (*output)(char), unsigned long base, void * buf, int len);
output— 字符输出回 调函数,每个字符调用一次,不可为 NULLbase— 起始地址值(仅用于显示,不影响数据读取)buf— 待转储的数据缓冲区len— 数据长度(字节)
使用示例
输出到 shell
static void shell_output(char c)
{
shell_printf("%c", c);
}
hexdump(shell_output, 0x80000000, data, sizeof(data));
输出到动态字符串
static struct ds_t * g_ds;
static void ds_output(char c)
{
ds_append_char(g_ds, c);
}
g_ds = ds_alloc();
hexdump(ds_output, 0, buf, len);
/* g_ds 中包含完整的 hex dump 文本 */
ds_free(g_ds);
调试寄存器转储
hexdump(shell_output, 0x40000000, mmio_base, 64);
/* 显示从 0x40000000 开始的 64 字节寄存器内容 */