论文部分内容阅读
访存错误是一种危害严重却又难以定位的软件错误,对软件的可靠性构成严峻挑战,而在操作系统内核中,由于权限和内存划分问题,导致访存错误的发现和定位更加困难。由于设备驱动与操作系统内核共享内核地址空间,具有对内核地址空间的读、写和执行权限,使得设备驱动的设计和实现漏洞很容易造成对内核其它数据结构的错误访问或篡改,从而导致操作系统出错甚至崩溃。因此,快速定位和解决设备驱动中的访存错误对提高操作系统可靠性具有重要意义。 本文从设备驱动开发和调试的实际需求出发,在调研多种访存错误检测工具的基础上,面向UniCore64体系结构和PKUnity-4D系统芯片,设计并实现了一种Linux内核访存错误动态检测工具UniPro,用来检测设备驱动在运行过程中访问不属于自己的内存的错误。UniPro的设计思想是将驱动使用的地址空间与内核使用的地址空间进行隔离,在不影响驱动和内核正常运行的前提下,利用分离的页表机制和缺页异常机制对两者之间的控制流和数据流进行实时监控,捕获可能产生错误的访存行为。其主要工作包括:一、确定驱动使用的所有地址空间,并为其专门维护一套与内核页表具有相同虚实地址转换关系的页表,通过配置页表项中的权限位使驱动不能对内核地址空间进行直接访问;二、利用缺页异常捕获并记录驱动访问内核地址空间的行为,同时通过切换页表保证控制流在驱动和内核之间的正常传递,通过修改页表权限保证数据在异常处理结束后可被正确访问;三、分析被捕获的访存行为的发生地点和发生原因,根据驱动的运行状态和实际访存需求,判断该访存行为是否存在错误。 本文基于UniCore-3处理器FPGA原型验证系统对UniPro进行了功能验证和实际应用。实验表明,UniPro在不影响内核和驱动正常运行前提下,成功检测到了人工注入的访存错误。在对DE2显卡驱动的检测和分析中,UniPro成功定位并解决了DE2显卡驱动访问其它地址空间的访存错误,为调试人员定位和解决设备驱动中的访存错误提供了强有力的支持。