一种linux内核模块动态打桩的方法
【技术领域】
[0001]本发明涉及Linux内核开发单元测试技术,尤其涉及一种Iinux内核模块动态打粧的方法。
【背景技术】
[0002]软件开发活动中单元测试是必不可少的,单元测试可以有效地提高软件质量,降低后期软件维护成本,对关键代码进行单元测试也是软件开发项目的基本要求。不同于应用软件开发,目前Iinux内核驱动开发,由于Iinux内核系统的高度親合、复杂以及技术特点,造成对运行的内核模块进行单元测试难度较大。
[0003]开展单元测试最重要的工作就是对被测函数进行打粧,模拟故障异常场景,内核的技术特点,造成对内核模块进行打粧会有很大的风险和难度。
【发明内容】
[0004]为了解决以上问题,本发明提出一种Iinux内核模块动态打粧的方法,该方法提供了一种在内核态对加载运行的内核模块进行函数替换打粧、前打粧、后打粧的有效方法,利用函数打粧内核开发人员就能够对内核驱动完成函数级别的单元测试。
[0005]本发明的技术方案是:
一种Iinux内核模块动态打粧的方法,主要用于Iinux内核驱动开发过程,解决内核模块加载运行后较难进行函数打粧替换,导致单元测试、系统调试很困难的情况。该方法可用在Iinux内核驱动开发过程,其通过动态重定向技术对已经加载运行的被测内核模块进行动态打粧、用例执行控制。该方法主要由2部分组成:内核重定向模块(I);测试用例控制模块(2 );测试用例控制模块(2 )再通过内核重定向模块(I)实现单元测试。
[0006]在对某一函数地址进行打粧时,内核重定向模块(I)依据打粧原函数地址、打粧函数地址、打粧方式等,生成一个动态重定向框架的控制代码块,该代码块完成打粧函数的调用控制、参数复制、返回值复制等。
[0007]所述的内核重定向模块(I ),
Linux内核驱动加载运行后,所有内核模块共享系统内核符号表及地址空间;内核可以获取代码段进行读写执行权限;通过动态生成重定向机器指令完成函数的跳转。本模块获取利用内核获取某内存页面的写权限,修改目标地址的机器指令为重定向指令区,在重定向指令区实现了被测函数替换打粧、前打粧、后打粧的调用框架,完成函数的打粧替换。
[0008]所述的测试用例控制模块(2),
Linux内核驱动加载运行后,所有内核模块共享系统内核符号表及地址空间。本模块管理单元测试需要的粧函数,负责加载、卸载粧函数,加载后的粧函数可以被内核重定向模块(O的调用框架直接使用,完成对被测函数运行环境的直接控制,以实现单元测试的目的。
[0009]内核重定向模块是一个内核模块,该模块在内核中依据内核模块名称、函数名称完成名称到地址的转换,并管理所有重定向代码控制块。
[0010]本发明的另一个创新点,动态重定向框架,该框架函数依据函数地址动态生成,完成函数多种方式调用重定向,自动完成调用参数、返回值的调用兼容。
[0011]本发明的创新点之一内核模块动态函数打粧,该方法通过修改被测函数代码段,利用函数重定向技术,完成内核函数级别的打粧。
【附图说明】
[0012]图1是为本发明中Iinux内核模块单元测试示意图。
[0013]图2是函数打粧框架流程图。
【具体实施方式】
[0014]下面对本发明的内容进行更加详细的阐述:
如图1所示,一种Iinux内核模块动态打粧的方法,主要用于Iinux内核驱动开发过程,解决内核模块加载运行后较难进行函数打粧替换,导致单元测试、系统调试很困难。该方法可用在Iinux内核驱动开发过程,其通过动态重定向技术对已经加载运行的被测内核模块进行动态打粧、用例执行控制。该方法主要由2部分组成:内核重定向模块(I);测试用例控制模块(2)。
[0015]所述的内核重定向模块(1),Linux内核驱动加载运行后,所有内核模块共享系统内核符号表及地址空间;内核可以获取代码段进行读写执行权限;通过动态生成重定向机器指令完成函数的跳转。本模块获取利用内核获取某内存页面的写权限,修改目标地址的机器指令为重定向指令区,在重定向指令区实现了被测函数替换打粧、前打粧、后打粧的调用框架,完成函数的打粧替换。
[0016]所述的测试用例控制模块(2),Linux内核驱动加载运行后,所有内核模块共享系统内核符号表及地址空间。本模块管理单元测试需要的粧函数,负责加载、卸载粧函数,加载后的粧函数可以被模块(I)的调用框架直接使用,完成对被测函数运行环境的直接控制,以实现单元测试的目的。
[0017]如图2所示,该方法主要在软件层面实现,具体流程如下:
(1)在内核中找到函数地址,将函数名称转换为函数地址;
(2)获取函数地址所在页面的写权限;
(3)依据重定向框架生成重定向代码块,将原函数直接重定向到该代码块;
(4)运行被测试函数。
[0018]以上就是内核模块动态打粧的整体实现流程。
【主权项】
1.一种Iinux内核模块动态打粧的方法,其特征在于,主要由2部分组成:内核重定向模块(I);测试用例控制模块(2), 在对某一函数地址进行打粧时,内核重定向模块(I)依据打粧原函数地址、打粧函数地址、打粧方式,生成一个动态重定向框架的控制代码块,该代码块完成打粧函数的调用控制、参数复制、返回值复制,测试用例控制模块(2)再通过内核重定向模块(I)实现单元测试。2.根据权利要求1所述的方法,其特征在于, 所述的内核重定向模块(1),Linux内核驱动加载运行后,所有内核模块共享系统内核符号表及地址空间;内核可以获取代码段进行读写执行权限;通过动态生成重定向机器指令完成函数的跳转。3.根据权利要求2所述的方法,其特征在于, 内核重定向模块(I)获取利用内核获取某内存页面的写权限,修改目标地址的机器指令为重定向指令区,在重定向指令区实现了被测函数替换打粧、前打粧、后打粧的调用框架,完成函数的打粧替换。4.根据权利要求3所述的方法,其特征在于, 测试用例控制模块(2),Linux内核驱动加载运行后,所有内核模块共享系统内核符号表及地址空间。5.根据权利要求4所述的方法,其特征在于, 测试用例控制模块(2)管理单元测试需要的粧函数,负责加载、卸载粧函数,加载后的粧函数可以被内核重定向模块(I)的调用框架直接使用,完成对被测函数运行环境的直接控制。
【专利摘要】本发明提供一种linux内核模块动态打桩的方法,涉及Linux内核开发单元测试技术。本发明主要由2部分组成:内核重定向模块(1);测试用例控制模块(2),在对某一函数地址进行打桩时,内核重定向模块依据依据打桩原函数地址、打桩函数地址、打桩方式等,生成一个动态重定向框架的控制代码块,该代码块完成打桩函数的调用控制、参数复制、返回值复制等,测试用例控制模块(2)再通过内核重定向模块(1)实现单元测试。解决了内核模块加载运行后较难进行函数打桩替换,导致单元测试、系统调试很困难的情况。
【IPC分类】G06F11/36
【公开号】CN104915292
【申请号】CN201510322979
【发明人】李雪生, 张延良
【申请人】浪潮电子信息产业股份有限公司
【公开日】2015年9月16日
【申请日】2015年6月12日