前提是reset板子不会照成memory被reset
方法一(已测试):
1. 打开你的System.map文件,找到symbol: __log_buf
比如:806d6f88 b __log_buf
这里的地址0x806d6f88是虚拟地址,不过是和物理地址一一对应的,
一般双方只差一个最高4位的偏移。本例中__log_buf的物理地址是
0x106d6f88
2. boot板子进入uboot,运行一下命令:
md 0x106d6f88 40
你就能够看到上次的输出了(如下)。
106d6f88: 00000000 00000000 001f0030 c6000000 ........0.......
106d6f98: 746f6f42 20676e69 756e694c 6e6f2078 Booting Linux on
106d6fa8: 79687020 61636973 5043206c 00302055 physical CPU 0.
106d6fb8: 00000000 00000000 007a0090 a6000000 ..........z.....
106d6fc8: 756e694c 65762078 6f697372 2e33206e Linux version 3.
方法二(未测试)
1. 加入如下的改动:
> diff --git a/kernel/printk.c b/kernel/printk.c index7982a0a..a67a178
> 100644
> --- a/kernel/printk.c
> +++ b/kernel/printk.c
> @@ -661,6 +661,8 @@ static voidcall_console_drivers(unsigned start,
> unsigned end)
> _call_console_drivers(start_print, end, msg_level); }
>
> +extern void printch(const char c);
> +
> static void emit_log_char(char c)
> {
> LOG_BUF(log_end) = c;
> @@ -671,6 +673,8 @@ static void emit_log_char(charc)
> con_start = log_end - log_buf_len;
> if(logged_chars < log_buf_len)
> logged_chars++;
> +
> + printch(c);
> }
目的应该是用earlyprintk打印出上次printk的buffer。2. 加入 CONFIG_DEBUG_LL重新编译kernel
3. 加入earlyprintk到你的bootloader的参数里。
4,然后启动kernel就能看到上次的打印了。