论文部分内容阅读
目前Linux内核开发工作的工程师们始终没有能找到一种高效、快捷的调试方法。这当然与Linux内核的开源性有关。内核开发者可以根据自己需要来修改内核,这种修改打破了内核的统一。要实现一种适合所有修改内核的调试工具显然不合适,同时由于调试的意图也不一样(查看关键变量值或状态、执行某个逻辑过程、给测试人员使用)要实现统一的调试工具就更加困难。目前常用的Linux内核调试方法有printk,kdb,kprobes,kgdb。其中printk是用户通过在代码中增加打印信息来查看程序的执行情况。它调试手段单一,无法动态调试一些关键逻辑过程,和用户的交互性差。kdb无法直接使用到裁减过的Linux内核上。kprobes工具软件使用复杂,且对使用者要求高。同时对该工具使用需要有一定时间、和经验的积累。kgdb软件适合远程调试,需要两台机器才能搭建好环境,占用过多资源。本文根据实际的工程项目需求,结合Linux内核虚拟文件系统和SCSI中层的软件设计原则提出了VTLS(Virtual Test Layer System)。VTLS以一种统一和具体内核版本无关调试方式提供给开发者、测试者、维护者使用。它能够让内核模块开发者自己决定需要的调试点,并在软件运行过程中动态执行调试代码,即时向用户输出调试结果。开发者自己决定用户态下的输入命令,并且支持多内核模块的调试。该系统同时向测试人员提供测试接口,测试人员只需要在用户态下执行相关命令行就可以调用内核相关例程,并即时查看执行结果。软件后期的维护者可以根据开发者提供的调试手册通过执行对应的调试命令快速排查问题,找出问题的根源,这会大大降低产品的后期维护成本。VTLS系统的KVTM(Kernel Virtual Test Module)设计采用独立性的思想,通过降低和被调试模块间的耦合度提高了系统的稳定性,使得VTLS系统能够在大型的工程项目中发挥其高效的优势。被调试模块只需要调用KVTM的注册函数和注销函数就可以完成向VTLS添加调试命令和注销命令的功能。VTLS系统的UVTM(User Virtual Test Module)通过提供TAB键联想命令、上下键翻转历史命令、编辑错误命令等功能为用户提供最快捷的调试方式。同时KVTM和UVTM采用多样化的通信方式可以避免单点故障,在一种方式交互失败情况下,可以通过其他方式(字符驱动、procfs、io共享)查看甚至修复KVTM的错误。