printk打印到Flash的rom-console驱动说明

我们经常会碰到内核崩溃时没有收集到内核崩溃的信息:或者由于内核崩溃输出的信息太多,串口工具没有记录到有用的死机信息,或者是我们的串口控制台本身就没有输出内核调试信息。现在这个驱动可以把内核调试信息自动保存到Flash当中,方便死机后重新开机时再次获取到前次内核崩溃时的panic信息。

  1. 接口说明
    通过插入模块时给出的Flash起始地址以及区域的大小,驱动会使用这2个指定的参数来保存信息到Flash(通常处于一个分区内)。2个参数大小需要自己设定好,如果给错参数的话可能会把Flash上其它分区中的数据冲掉,参数的定义如下:
    flash_offset=0x200000 //Flash起始偏移地址
    used_size=0x200000 //记录的缓冲区大小,使用的Flash长度
    log_timeout=300 //驱动主动更新log记录的超时时间
    驱动中有简单判断参数内容是否合法的代码,详细的参数需要自己去确认,一般根据Flash分区表确认一下不会覆盖到其它分区就好了。
    驱动使用方法:insmod rom-console.ko flash_offset=0x200000 used_size=0x200000 log_timeout=300。
  2. 驱动工作原理简单说明
    驱动作为控制台驱动的一种,会把console write的信息直接写到Flash当中,Flash开头会写入一个0x43474244(DBGC)标识字符,后面跟printk信息:
    0x43474244+printk(> CONSOLE_LOGLEVEL的内核调试信息)。
    如果Flash指定的存储区域用完了,驱动会从前面指定的Flash开始位置重新写(略过并保留0x43474244标识字符,而前面写入的信息会被覆盖)。重新开机的时候,驱动再加载过程中会把保存在Flash上的前次内核printk信息读取出来,并在/proc目录放置一个last_kmsg文件。解析出来的/proc/last_kmsg文件格式类似如下:
    DBGC [ 0.000000] INFO-Cygnus:540:start_kernel() entry

    Boot info:
    Oct 9 2016 16:57:59 last_kmsg //这里的这个时间是驱动编译的时间戳
    同时在/data分区保存了一份last_kmsg复制文件,防止开机后未手动保存上次的打印信息文件last_kmsg而丢失该文件,保存的文件名格式类似:
    /data/last_kmsg.2016-10-11 16:29:47 //后面跟的是开机时的时间戳
    另外要指出的是:由于Flash写入是以Page页为单位的,因此不能做到同步实时更新log信息。只有在log信息超过了一个Page大小之后驱动才会主动去写Flash,因此如果在死机的情况下(或者log很久没有输出的情况,驱动中定义超过3分钟后),驱动会主动写入最后一次剩下的缓冲数据到Flash当中(不管有没有超出1个Page的大小)。

你可能感兴趣的:(物联网)