一种内存检测工具的实现方法技术

技术编号:22641237 阅读:23 留言:0更新日期:2019-11-26 16:03
本发明专利技术提供一种内存检测工具的实现方法,提供内核检测工具,处理器提供用户区间和系统区间,系统区间被划分为多个区域,区域包括动态内存区域、模块区域、内核区域和固定映射区域;内核区域设置有内核代码区域,内核代码区域的尾地址与模块区域的首地址之间的地址空间小于32MB;于用户区间中划分连续的地址空间为内核检测区域,内核检测区域设置在用户区间和系统区间的交界处;将内核检测区域设置为系统区间的映射区域,内存检测工具根据系统当前运行的程序代码中的检测标志检测内核检测区域中对应当前程序代码所在的内存地址的位置来判断当前的内存访问是否合法。本发明专利技术的有益效果:使得32位ARM架构可以支持内存检测工具。

Implementation of a memory checking tool

The invention provides an implementation method of a memory detection tool, which provides a kernel detection tool, and a processor provides a user interval and a system interval. The system interval is divided into multiple regions, including a dynamic memory region, a module region, a kernel region and a fixed mapping region. The inner core region is provided with a kernel code region, the tail address of the kernel code region and the first place of the module region The address space between addresses is less than 32MB; the continuous address space in user interval is divided into kernel detection area, which is set at the junction of user interval and system interval; the kernel detection area is set as the mapping area of system interval, and the memory detection tool detects the corresponding current kernel detection area according to the detection flag in the currently running program code of the system The location of the memory address of the program code to determine whether the current memory access is legal. The invention has the advantages that the 32-bit arm architecture can support the memory detection tool.

【技术实现步骤摘要】
一种内存检测工具的实现方法
本专利技术涉及内存检测
,尤其涉及一种内存检测工具的实现方法。
技术介绍
KASAN(KernelAddressSanitizer),是Linux内核中的一个动态的内存检测工具,能够在运行态下检测全局变量、堆、栈等数据中存在的越界访问(out-of-bounds)、释放后访问(use-after-free)、内核对用户空间的非法访问等多种内存异常错误,并且能给出详细的错误报告,包括异常访问的函数、调用栈、异常地址等信息,便于程序调试(debug)。现有技术中的KASAN在4.4版本的Linux内核被合入mainline(Linux内核发展的主线)。此外,KASAN的编译也至少需要GCC4.9.2版本以上的编译器支持。但是要支持更多的KASAN特性,需要使用5.0以上版本的GCC编译器。“影子内存”也是内核空间可以访问的一部分内存,因此“影子内存”也需要被映射到内核地址空间上去。以64位ARM(AdvancedRISCMachines)架构处理器为例,启动boot程序的时候可以KASAN地址空间划分,如图1所示。需要说明的是,“影子内存”是可用内存的1/8,因此可以根据“影子内存”和可用内存的比例关系得知一个字节的影子内存可以标记八个字节的可用内存访问状态。现有技术中的影子内存的标记状态一般有:1、用0表示从当前地址开始连续8个字节的内存都是可以访问的;2、N=1~7表示从当前地址开始的连续N个字节的内存是可以访问的,剩余的字节数是不可访问的3、负数表示整个8个字节都不可访问。通常可以定义多种负数值来表示这部分内存的状态,例如:上述定义以char(占一个字节内存)类型来解释就是数字-1、-2、-4、-5、-6。分别表示对应内存页的释放以及redzone的各种状态。根据“影子内存”中的这些状态标记可以知道内核对该内存地址的访问是否合法。如图3所示,地址段0xffffffc010000000~0xffffffc010000007这8个字节对应的“内核检测区域”值是0x00,说明内核对0xffffffc010000000开始的8个字节都是可以访问的;地址段0xffffffc010000008~0xffffffc01000000f这8个字节对应的“内核检测区域”值是0x05,说明内核对0xffffffc010000008开始的5个字节都是可以访问的。即对地址段0xffffffc010000008~0xffffffc01000000c内的访问都是合法的,当访问到地址为0xffffffc01000000d、0xffffffc01000000e、0xffffffc01000000f时,则上述访问均为非法访问,KASAN工具将会在内核中打印出对应的错误地址、访问类型以及调用栈。相应的,如果“影子内存”中的值是负数,那么可以很方便的根据具体的负数值来判断错误访问类型。比如,如果地址0xffffffc010000000对应的内核检测区域的值是0xFB,则这是一次“use-after-free”(释放后访问)错误。在64位ARM内核上,内核地址空间通常从0xFFFFFF80_00000000(39bitVA)开始,整个可用的地址空间有512GB,这个数值是相当大的了。这其中0xFFFFFFC0_00000000开始往上的地址为线性映射区域,往下的地址空间为VMALLOC区域。上图中的KASAN的地址空间有64GB,即从地址段0xFFFFFF80_00000000~0xFFFFFF90_00000000。它占据内核可用地址空间的底部。实际上KASAN占据的地址空间也是堆叠在VMALLOC的地址空间,因为64位内核的地址空间非常大,所以占用KASAN占用掉一部分也没什么影响。到目前为止,在32位ARM架构上尚未有KASAN的实现。究其原因,“影子内存”也需要为其分配地址空间。这也是为什么KASAN目前多在64位处理器架构上实现的原因。64位处理器有足够大的内核地址空间,能够达到TB级别,分一部分出来给KASAN的影子内存使用也影响不大。然而在32位处理器上,硬件限制了只有4GB的寻址空间,这其中常见的地址空间划分是3:1的划分,即用户态程序占用0~3GB的地址空间,内核占用3~4GB这1GB的地址空间。地址空间的捉襟见肘,限制了KASAN在32位ARM处理器上的实现。32位内核地址空间划分如图2所示:地址0x00000000~0xBF000000,共3056MB是用户区间15的地址空间;地址0xBF000000~0xC0000000,共16MB是模块区域14的地址空间;地址0xC0000000~0xF0000000,共768MB是内核区域13的地址空间;地址0xF0000000~0xFF800000,共248MB,是动态内存区域(VMALLOC)12的地址空间;地址0xFFC00000~0xFFF00000,共3MB,是固定映射区域(Fixedmap)11地址空间,用于kmap_atomic功能;其中,内核区域13包括内核代码区域131,上述内核代码区域131靠近地址0xBF000000;这种地址空间划分如果要支持KASAN的话,可以在1GB的内核的地址空间内再划分1/8出来给KASAN影子内存,然而上述方式会导致内核的实际可用的地址空间将变得更小,会加剧运行时候的内存紧张情况;并且模块区域14的地址空间是从0xBF000000开始的,即实际整个内核可访问的地址空间是1GB+16MB,这16MB使得内核可访问的地址空间不是一个整数,如果按照1:8的比例等比缩小来获取影子内存,那么影子内存的容量和起始地址的放置将存在对齐问题。
技术实现思路
针对现有技术中存在的上述问题,现提供一种旨在32位ARM架构可以支持内存检测工具的内存检测工具的实现方法。具体技术方案如下:一种内存检测工具的实现方法,其中,提供内核检测工具,应用于32位ARM处理器中,处理器提供用户区间和系统区间,系统区间被划分为多个区域,区域包括动态内存区域、模块区域、内核区域和固定映射区域;内核区域设置有内核代码区域,内核代码区域的尾地址与模块区域的首地址之间的地址空间小于32MB;于用户区间中划分连续的地址空间为内核检测区域,内核检测区域设置在用户区间和系统区间的交界处;将内核检测区域设置为系统区间的映射区域,内存检测工具根据系统当前运行的程序代码中的检测标志检测内核检测区域中对应当前程序代码所在的内存地址的位置来判断当前的内存访问是否合法。优选的,内存检测工具的实现方法,其中,用户区间、动态内存区域、模块区域、内核区域和固定映射区域依次相邻设置。优选的,内存检测工具的实现方法,其中,用户区间还包括用户区域,用户区域的地址空间为2944MB;内核检测区域的地址空间为128MB;动态内存区域的地址空间本文档来自技高网
...

【技术保护点】
1.一种内存检测工具的实现方法,其特征在于,提供一内核检测工具,应用于32位ARM处理器中,所述处理器提供用户区间和系统区间,所述系统区间被划分为多个区域,所述区域包括动态内存区域、模块区域、内核区域和固定映射区域;/n所述内核区域设置有内核代码区域,所述内核代码区域的尾地址与所述模块区域的首地址之间的地址空间小于32MB;/n于所述用户区间中划分连续的地址空间为内核检测区域,所述内核检测区域设置在用户区间和所述系统区间的交界处;/n将所述内核检测区域设置为所述系统区间的映射区域,所述内存检测工具根据系统当前运行的程序代码中的检测标志检测所述内核检测区域中对应当前所述程序代码所在的内存地址的位置来判断当前的内存访问是否合法。/n

【技术特征摘要】
1.一种内存检测工具的实现方法,其特征在于,提供一内核检测工具,应用于32位ARM处理器中,所述处理器提供用户区间和系统区间,所述系统区间被划分为多个区域,所述区域包括动态内存区域、模块区域、内核区域和固定映射区域;
所述内核区域设置有内核代码区域,所述内核代码区域的尾地址与所述模块区域的首地址之间的地址空间小于32MB;
于所述用户区间中划分连续的地址空间为内核检测区域,所述内核检测区域设置在用户区间和所述系统区间的交界处;
将所述内核检测区域设置为所述系统区间的映射区域,所述内存检测工具根据系统当前运行的程序代码中的检测标志检测所述内核检测区域中对应当前所述程序代码所在的内存地址的位置来判断当前的内存访问是否合法。


2.如权利要求1所述的内存检测工具的实现方法,其特征在于,所述用户区间、所述动态内存区域、所述模块区域、所述内核区域和所述固定映射区域依次相邻设置。


3.如权利要求1所述的内存检测工具的实现方法,其特征在于,所述用户区间还包括用户区域,所述用户区域的地址空间为2944MB;
所述内核检测区域的地址空间为128MB;
所述动态内存区域的地址空间为240MB;
所述模块区域的地址空间为16MB;
所述内核区域的地址空间为760MB;
所述固定映射区域的地址空间为3MB。


4.如权利要求1所述的内存检测工具的实现方法,其特征在于,所述内核检测区域的地址空间为所述用户区间的地址空间的1/24。


5.如权利要求1所述的内存检测工具的实现方法,其特征在于,在所述系统启动内核前,在系统页表存放路径中建立二级页表,所述内存检测工具根据所述二级页表对所述内核检测区域进行第一次初始化,使得所述内存检测工具的检测结果均为合法。


6.如权利要求5所述的内存检测工具的实现方法,其特征在于,在所述系统启动内核的过程中,所述内存检测工具对所述内核检测区域进行第二次初始化,所述内存检测工具判断当前的内存访问是否合法。

【专利技术属性】
技术研发人员:曾涛潘建新
申请(专利权)人:晶晨半导体上海股份有限公司
类型:发明
国别省市:上海;31

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1