嵌入式Linux Kernel错误跟踪技术

欢迎进入IT技术社区论坛,与200万技术人员互动交流 >>进入

  2.3 LCRT机制的实现

  LCRT机制的实现可参照2.2节的设计思想,分步予以实现。限于篇幅,本文不过多涉及Linux内核模块的原理和实现相关的细节,仅仅给出LCRT机制的内核模块实现伪代码。用伪代码描述LCRT机制的加载函数如下:

  int lcrt_init(void)

  {

  printk(“Registering my__panic notifier. “);

  bt_nvram_ptr=(volatile unsigned char*)ioremap_

  nocache (BT_NVRAM_BASE,BT_NVRAM_LENGTH);

  bt_nvram_index+=sizeof(struct bt_info);

  *)bt_nvram_ptr,BT_NVRAM_LENGTH);

  notifier_chain_register(&panic_notifier_list,&my_

  panic_block);

  return 0;

  }

  LCRT机制的通知处理函数完成函数调用关系回溯、得到函数名称、函数栈内容等工作,限于篇幅,在这里用下面伪代码说明:

  void ll_bt_information(struct pt_regs *pr)

  {

  变量定义等初始化工作

  do {

  reglist=*(unsigned long *)(*myfp-8);

  //从函数栈帧的顶部获取函数开始执行时保存的寄存器信息

  //从函数的代码区中取得函数的名称

  //从函数的栈帧里取出函数执行函数体代码之前保存的函数参数信息

  //从本函数的栈帧中得到调用本函数的代码所在位置和调用本函数的函数栈帧的栈底

  }while(直到函数调用链的链头);

  //取得函数调用栈帧的内容

  //填充信息记录的记录头部

  //将上面的循环中取得的信息保存到非易失性存储器中

  write_to_nvram((void *)bt_nvram_ptr,&bt_record_header,sizeof(bt_info_t));

  }

  3 验证评估LCRT机制

  3.1 部署LCRT机制

  部署LCRT机制,使LCRT机制发挥作用前需要做的相关工作有:

  (1)针对目标Linux内核编译LCRT机制的Linux内核模块部分;

  (2) 将LCRT机制的内核模块部分载入Linux内核。

  3.2 实验结果

  为了实验LCRT机制的作用效果,构造一个会造成Linux内核崩溃的设备驱动模块,记这个内核驱动模块为bugguy.ko,列出如下所示的bugguy.ko中会引起Linux内核崩溃的代码如下所示:

  irqreturn_t my_timer_interrupt(int irq,void *dev_id,struct pt_regs* regs)

  {

  确认硬件状态并清除中断状态

  if(ujiffies > 5000) {

  void * ill_pointer=NULL;

  *(unsigned long *)ill_pointer=0;

  }

  else {

  ujiffies++;

  }

  return IRQ_HANDLED;

  }

  说明:用黑体标出的代码即为产生bug的代码

  从上面的代码可以看出,这个错误是对空指针进行解析而造成的。在一个中断处理函数中如果发生对空指针的解析,将会引起Linux内核的崩溃。在部署完成LCRT机制的嵌入式linux系统上将这个bugguy.ko载入Linux内核,使得会引起Linux内核崩溃的中断处理程序得以运行,LCRT机制可以将相关的信息保存到非易失性存储器中,在系统复位后,通过LCRT机制的用户空间工具,可以将保存的信息读取出来。实验结果显示,可以得到如图2所示的函数调用链信息。

  图2标注即为会引起Linux内核崩溃的错误代码的中断处理函数即真正引起系统宕机的“罪魁祸首”。而记录下的所有信息仅仅占用了不到1KB的存储空间,写入非易失性存储器所耗用的时间控制在50ms以内。在使用少量空间和少量时间的情况下,所记录下的信息对于查找问题和解决问题都有较大的帮助。

  实验结果表明,在LCRT机制的作用下,可以快速地定位到嵌入式Linux系统中隐藏的可能会导致系统宕机的软件缺陷。这就为后续的故障解决和软件完善提供了关键的辅助信息。对嵌入式Linux内核而言,即是为提高Linux内核的稳定性和可靠性提供了帮助。

  在基于ARM的嵌入式Linux应用中,开发LCRT机制来记录系统内核发生崩溃时引起崩溃的函数调用链和栈信息到非易失性存储器中,截至目前为止,LCRT机制可以记录基于ARM的嵌入式Linux内核发生崩溃时的函数调用链信息,可直接得到函数名称、函数调用链中单个函数被调用时的参数信息以及函数调用链中的函数各自的栈帧信息。这些记录下来的信息对于完善和发展基于arm的嵌入式Linux应用具有重要的辅助意义。

[1][2]

总有看腻的时候,不论何等荣华的身份,

嵌入式Linux Kernel错误跟踪技术

相关文章:

你感兴趣的文章:

标签云: