一种内存检测工具的实现方法与流程

文档序号:19216740发布日期:2019-11-26 01:45阅读:383来源:国知局
一种内存检测工具的实现方法与流程

本发明涉及内存检测技术领域,尤其涉及一种内存检测工具的实现方法。



背景技术:

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;

动态内存区域的地址空间为240mb;

模块区域的地址空间为16mb;

内核区域的地址空间为760mb;

固定映射区域的地址空间为3mb。

优选的,内存检测工具的实现方法,其中,内核检测区域的地址空间为用户区间的地址空间的1/24。

优选的,内存检测工具的实现方法,其中,在系统启动内核前,在系统页表存放路径中建立第一二级页表,内存检测工具根据第一二级页表对内核检测区域进行第一次初始化,将内存检测区域的地址映射到一个内容为0的物理页,使得内存检测工具的检测结果均为合法。

优选的,内存检测工具的实现方法,其中,在系统启动内核的过程中,内存检测工具对内核检测区域进行第二次初始化,内存检测工具判断当前的内存访问是否合法。

优选的,内存检测工具的实现方法,其中,进行第二次初始化具体包括以下步骤:

步骤a1,将系统页表存放路径中的第一二级页表复制到临时页表存放路径中;

步骤a2,将指向系统页表存放路径的寄存器的指向临时页表存放路径;

步骤a3,修改系统页表存放路径中的页表。

优选的,内存检测工具的实现方法,其中,步骤a3具体包括以下步骤:

步骤a31,根据第一公式,为线性映射区域分配对应的预留内存,随后根据第二公式将预留内存映射到内核检测区域中;

步骤a32,于内核检测区域中对未进行分配的动态内存区域和模块区域根据第二公式建立对应的映射区域;

步骤a33,在系统页表存放路径中建立两级页表,以根据页表对将动态内存区域和模块区域对应的映射区域进行初始化,使得内存检测工具对当前程序代码所在的动态内存区域和模块区域的内存地址的内存访问均为合法;

步骤a34,将指向临时页表存放路径的寄存器的指回系统页表存放路径;

步骤a35,刷新高速缓冲区和转换检测缓冲区;

步骤a36,移除内核区域和固定映射区域中分配的预留内存。

优选的,内存检测工具的实现方法,其中,

第一公式如下所示:

第二公式如下所示:

其中,

vs用于表示预留内存;

vshadow用于表示区域对应的内存检测区域的地址;

va用于表示区域的地址;

koffset为内核检测区域和用户区间之间的固定偏移量。

优选的,内存检测工具的实现方法,其中,固定偏移量为0xa0000000。

上述技术方案具有如下优点或有益效果:

第一、通过调整用户区间和系统区间中的各个区域的布局以设置合理的映射区域,从而减小对用户区间和系统区间的影响,进而使得32位arm架构可以支持内存检测工具;

第二、通过内核代码区域的首地址与模块区域的首地址之间的地址空间小于32mb,从而实现模块区域内的跳转指令可以跳转到内核区域中;

第三、通过在系统当前运行的程序代码中设置检测标志,使得内核通过内存检测工具的功能对系统区间的非法访问做出判断。

附图说明

参考所附附图,以更加充分的描述本发明的实施例。然而,所附附图仅用于说明和阐述,并不构成对本发明范围的限制。

图1为现有技术中支持kasan的64位内核地址空间划分;

图2为现有技术中32位内核地址空间划分;

图3为现有技术中的影子内存的实施例;

图4为本发明内存检测工具的实现方法的支持kasan的32位内核地址空间划分;

图5为本发明内存检测工具的实现方法的支持kasan的32位内核地址空间划分;

图6为本发明内存检测工具的实现方法的第一二级页表的结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。

需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。

下面结合附图和具体实施例对本发明作进一步说明,但不作为本发明的限定。

本发明包括一种内存检测工具的实现方法,提供内核检测工具(kasan),应用于32位arm处理器中,如图4所示,处理器提供用户区间和系统区间,系统区间被划分为多个区域,区域包括动态内存区域22(vmalloc)、模块区域24、内核区域23和固定映射区域21;

内核区域23设置有内核代码区域231,内核代码区域231的尾地址与模块区域24的首地址之间的地址空间小于32mb;

于用户区间中划分连续的地址空间为内核检测区域26,内核检测区域26设置在用户区间和系统区间的交界处;

将内核检测区域26设置为系统区间的映射区域,内存检测工具(kasan)根据系统当前运行的程序代码中的检测标志检测内核检测区域26中对应当前程序代码所在的内存地址的位置来判断当前的内存访问是否合法。

在上述实施例中,通过调整用户区间和系统区间中的各个区域的布局,可以为内存检测工具设置合理的映射区域,从而减小对用户区间和系统区间的影响,以解决在32位arm架构上实现kasan功能时面临的地址空间不足的问题,进而使得支持内存检测工具的内核能正常运行。

在上述实施例中,由于arm架构非寄存器方式的跳转指令最大的跳转范围是32mb,通过内核代码区域231的尾地址与模块区域24的首地址之间的地址空间小于32mb,并且使得模块区域24尽量靠近内核代码区域231,从而实现模块区域24内的跳转指令能跳转到内核区域23中,避免出现模块区域24的跳转指令插入失败的情况。

在上述实施例中,通过在系统当前运行的程序代码中设置检测标志,可以实现内存检测工具可以根据系统当前运行的程序代码中的检测标志检测内核检测区域26中对应当前程序代码所在的内存地址的位置来判断当前的内存访问是否合法,从而使得内核通过内存检测工具的功能对系统区间的非法访问做出判断。

需要说明的是,编译器可以在系统当前运行的程序代码中的每条load/store访问指令前插入一段对访问地址和访问大小的检查代码,检查代码通过对内存检测区域的检测标志,判断当前内存访问是否合法。

需要说明的是,内核检测区域26为现有技术中的“影子内存”。

其中,如图3所示,现有技术中给出了内存检测工具对内存访问是否合法的判断逻辑,实际上,内存检测工具的实现机理要复杂很多,可以具体包括:boot阶段的内核检测区域26的预留、下文中的内核检测区域26对每个区域建立对应的映射区域,以及内核检测区域26的值的初始化和内核检测区域26在使用过程中的状态值的修改。其中一部分工作可以通过编译器完成,一部分工作则需要与具体处理器架构相关的代码去完成。

进一步地,在上述实施例中,用户区间、动态内存区域22、模块区域24、内核区域23和固定映射区域21依次相邻设置。

作为优选的实施方式,用户区间、动态内存区域22、模块区域24、内核区域23和固定映射区域21由下至上依次相邻设置,即将动态内存区域22放置在模块区域24的下方,并且模块区域24可以紧邻内核代码区域231,从而可以保证模块区域24不会因为arm指令跳转的限制而插入失败。

在上述实施例中,内核检测区域26设置在用户区间和系统区间的交界处,从而使得内核检测区域26紧邻在动态内存区域22的下方,使得用户可以使用从0地址开始到内核检测区域26的一大段连续地址空间的用户区间,进而便于管理。

进一步地,在上述实施例中,用户区间还包括用户区域25,用户区域25的首地址为0x00000000,用户区域25的尾地址为0xb8000000,即用户区域25的地址空间为2944mb;

内核检测区域26的首地址为0xb8000000,内核检测区域26的尾地址为0xc0000000,即内核检测区域26的地址空间为128mb;

动态内存区域22的首地址为0xc0000000,动态内存区域22的尾地址为0xcf000000,即动态内存区域22的地址空间为240mb;

模块区域24的首地址为0xcf000000,模块区域24的尾地址为0xd0000000,即模块区域24的地址空间为16mb;

内核区域23的首地址为0xd0000000,内核区域23的尾地址为0xff800000,即内核区域23的地址空间为760mb;

固定映射区域21的首地址为0xffc00000,固定映射区域21的尾地址为0xfff00000,即固定映射区域21的地址空间为3mb。

在上述实施例中,模块区域24的首地址和动态内存区域22的尾地址重合,即模块区域24和动态内存区域22紧密相邻,并且内核区域23的内核代码区域231的首地址靠近内核区域23的首地址,因此模块区域24和内核区域23的内核代码区域231相邻之后,因此可以通过将动态内存区域22的地址空间设置为256mb,并且动态内存区域22的首地址对齐到0xc0000000,从而可以实现整个系统区间的地址空间为1gb,进而可以实现系统区间中的内核区域23或动态内存区域22都没有因为kasan的调整而损失地址空间。并且在上述实施例中,由于整个系统区间的地址空间恰好1gb对齐,所以计算内核检测区域26的地址空间、内核检测区域26与用户区间之间固定偏移量时都可以得到一个整数结果,因此不用担心对齐问题。

需要说明的是,kasan实现的机理为:先预留一部分内存,用来标记运行时候各个内存的访问状态。预留的这部分内存为本实施例中的内核检测区域26,并且通常内核检测区域26是实际可用内存(本实施例中的系统区间23)的1/8,即1gb的系统区间需要128mb的内核检测区域26,而用户区间的地址空间为3072mb,因此可以在用户区间中划分128mb的连续空间作为内核检测区域26,因此内核检测区域26的地址空间为用户区间的地址空间的1/24,从而可以减少内核检测区域26对系统区间的影响,并且可以解决了在32位arm架构上实现kasan功能时面临的地址空间不足的问题。

进一步地,在上述实施例中,在系统启动内核前,在系统页表存放路径中建立第一二级页表,内存检测工具根据第一二级页表对内核检测区域26进行第一次初始化,使得内存检测工具的检测结果均为合法。

进一步地,作为优选的实施方式,目前在完成基本的mmu初始化跳转到第二函数start_kernel()之前的启动代码都是汇编编写的代码,因此此过程中并不存在对内存访问进行检查的过程,并且在此过程之后会出现大量的c代码,但是c代码中插入了大量的检测标志。如果在跳转到c代码执行之前不进行初始化,则必然会导致内存访问的检测无法继续执行,进而导致系统卡死无法启动,由此可见,需要在完成基本的mmu初始化跳转到第二函数start_kernel()之前进行上述第一次初始化。

通过在系统启动内核前根据第一二级页表对内核检测区域26进行第一次初始化,将其指向内容为0的一个物理页,使得内存检测工具得到的任何检测结果均为合法,因此可以通过第一次初始化来避免kasan机制在启动内核前对内核进行检测,让内核的启动过程可以正常运行,并且第一次初始化中的内存检测工具没有对内存地址进行真正的检测。

其中,mmu初始化仅映射了系统区间的自身代码和数据。

上述实施例在完成基本的mmu初始化跳转到第二函数start_kernel()之前通过伪初始化函数kasan_early_init()进行第一次初始化;

第一次初始化具体包括:

步骤s1,通过伪初始化函数kasan_early_init()对内核检测区域26建立了第一二级页表,本实施方式中可以通过init_mm(一种init进程的内存管理结构)来建立第一二级页表,其中,init_mm是一个静态定义的数组,如图6所示;

需要说明的是,在第一次初始化过程中,第一二级页表存放在系统页表存放路径——“swapper_pg_dir”中,由于kasan预定义了几个0初始化的page,即kasan_zero_pud、kasan_zero_pmd、kasan_zero_pte,以及kasan_zero_page。因为32位arm架构上只有两级页表,所以kasan_zero_pud和kasan_zero_pmd这两个页在第一次初始化的建立映射过程中用不到。

步骤s2,伪初始化函数kasan_early_init()在内核检测区域26的地址空间(0xb8000000~0xc0000000)中,逐级查找每个pmd项,将其物理地址均赋值为指向kasan_zero_pte页所在的位置;同样的,查找每个pte项,将其物理地址均赋值为指向kasan_zero_page所在的位置,从而实现了将内核检测区域26的地址空间(0xb8000000~0xc0000000)全部指向kasan_zero_page所在的物理地址。而kasan_zero_page中的值都为0,根据上述内核检测区域26的标记状态可得到内存检测工具得到的任何检测结果均为合法。

在上述实施方式中,伪初始化函数kasan_early_init()的代码仅使用了两个页就建立好了对128mb地址空间的内核检测区域26映射。并且使得内核在第一初始化之后无论访问任何内核检测区域26的值,mmu都会把kasan_zero_page中的值返回给它,由于kasan_zero_page中的值都为0,根据上述内核检测区域26的标记状态,内存检测工具得到的检测结果均为合法结果,从而避免kasan的机制,让系统的启动过程可以正常进行。

进一步地,在上述实施例中,在系统启动内核的过程中,内存检测工具对内核检测区域26进行第二次初始化,内存检测工具判断当前的内存访问是否合法。

通过第二次初始化完成kasan的初始化工作,使得内核检测区域26中对每个区域建立对应的真正的映射区域,kasan可以在系统区间的运行过程中,实时检测对系统的当前的内存访问是否合法。

进一步地,在上述实施例中,进行第二次初始化具体包括以下步骤:

步骤a1,将系统页表存放路径中的第一二级页表复制到临时页表存放路径中;

步骤a2,将指向系统页表存放路径的寄存器的指向临时页表存放路径;

步骤a3,修改系统页表存放路径中的页表。

进一步地,作为优选的实施方式,可以通过第二次初始化让内存检测工具真正发挥作用,同时可以通过建立函数kasan_init()进行第二次初始化,以在内核检测区域26中对系统区间的每个区域建立真正的映射区域;

需要说明的是,通过boot_cpu_init()初始化启动cpu,随后在系统启动内核的过程中会调用函数setup_arch(),而函数kasan_init()就在上述函数setup_arch()中被建立,并且函数kasan_init()在函数paging_init()之后被调用;由于函数kasan_init()会调用arm_memblock_init()函数从dts中解析硬件相关的内存参数,之后调用了paging_init()函数,为低端内存、dma、io等创建好映射,以完成对dts(devicetreesource,设备树源码)的解析、低端内存的映射以及对一些io资源的映射。随后通过函数kasan_init()可以在内核检测区域26中根据系统区间的各个区域的大小来创建真正的映射区域。

具体的,通过建立函数kasan_init()进行第二次初始化具体包括:

将系统页表存放路径“swapper_pg_dir”中的第一二级页表复制到临时页表存放路径中“tmp_pg_dir”;

将指向系统页表存放路径“swapper_pg_dir”的寄存器的指向临时页表存放路径“tmp_pg_dir”;通过临时页表存放路径中“tmp_pg_dir”中备份的第一二级页表“init_mm页表”来避免修改系统页表存放路径中的页表时的kasan报错。

随后将第一二级页表清零;由于第一次初始化将第一二级页表均为指向kasan_zero_pte页所在的位置,因此要修改系统页表存放路径“swapper_pg_dir”中的页表前需要将第一二级页表清零。

修改系统页表存放路径中的页表。

进一步地,在上述实施例中,步骤a3具体包括以下步骤:

步骤a31,在内核区域23和固定映射区域21中根据第一公式分配对应的预留内存,随后根据第二公式将预留内存映射到内核检测区域26中;

进一步地,作为优选的实施方式,可以通过init_mm数组根据第二公式将预留内存映射到内核检测区域26的对应位置上。

步骤a32,于内核检测区域26中对未进行分配的动态内存区域22和模块区域24根据第二公式建立对应的映射区域;

进一步地,内存检测工具将当前的内存访问与系统当前运行的程序代码中的检测标志所在的内存地址的位置对应的状态标志作比较,以判断当前的内存访问是否合法;并根据判断结果和当前的内存访问来更新对应的状态标志。

步骤a33,在系统页表存放路径中建立两级页表,以根据页表对将动态内存区域22和模块区域24对应的映射区域进行初始化,将其映射到内容为0的物理页,使得内存检测工具对当前程序代码所在的动态内存区域22和模块区域24的内存地址的内存访问均为合法;

步骤a33具体可以通过伪初始化函数kasan_early_init()对内核检测区域26建立了两级页表,本实施方式中可以通过init_mm来建立第二级页表,伪初始化函数kasan_early_init()在内核检测区域26中的动态内存区域22和模块区域24对应的映射区域的地址空间(0xb8000000~0xba000000)中,逐级查找每个pmd项,将其物理地址均赋值为指向kasan_zero_pte页所在的位置;同样的,查找每个pte项,将其物理地址均赋值为指向kasan_zero_page所在的位置。而kasan_zero_page中的值都为0,根据上述内核检测区域26的标记状态可得到内存检测工具在地址空间(0xb8000000~0xba000000)中得到的任何检测结果均为合法。

步骤a34,将指向临时页表存放路径的寄存器指回系统页表存放路径;

步骤a35,刷新高速缓冲区(cache)和转换检测缓冲区(tlb,translationlookasidebuffer);

在步骤a35后完成了在内核检测区域26中根据系统区间的各个区域的大小来创建真正的映射区域。

步骤a36,移除内核区域23和固定映射区域21中分配的预留内存,避免在内存管理系统正式运作起来之前的kasan误报。

至此,kasan的初始化工作已经完成。在内核检测区域26对系统区间的各个区域建立真正的映射区域之后,kasan也就可以在内核运行过程中,实时检测对内核地址的访问是否合法了。随后代码继续mm_init()、sched_init()等内核启动相关的初始化工作,完成正常boot流程。

进一步地,在上述实施例中,

第一公式如下所示:

第二公式如下所示:

其中,

vs用于表示预留内存;

vshadow用于表示区域对应的所述映射区域的首地址;

va用于表示区域的地址;

koffset为内核检测区域26和用户区间之间的固定偏移量。

在上述实施例中,更通俗的说,内核检测区域26和系统区间的地址空间的比例为1/8。

进一步地,在上述实施例中,固定偏移量为0xa0000000。

在上述实施例中,上述公式为一个线性函数,因此可以通过上述公式将系统区间的所有地址段都被一一映射到内核检测区域26中,从而实现在系统对系统区间中的任何地址的内存进行访问时,都可以在内核检测区域26中找到对应的映射地址,进而可以实现内存检测工具通过对应的映射地址来检测系统区间的每个区域的状态进行检测。

在上述实施例中,如图5所示,于内核检测区域26中对动态内存区域22建立对应的映射区域,动态内存区域对应的映射区域32的首地址为0xb8000000,其尾地址为0xb9e00000,即动态内存区域对应的映射区域32的地址空间为30mb;

于内核检测区域26中对模块区域24建立对应的映射区域34,模块区域对应的映射区域34的首地址为0xb9e00000,其尾地址为0xba000000,即模块区域对应的映射区域34的地址空间为2mb;

于内核检测区域26中对内核区域23建立对应的映射区域,内核区域对应的映射区域33的首地址为0xb9e00000,其尾地址为0xbff00000,即内核区域对应的映射区域33的地址空间为95mb;

同时于内核检测区域26中对内核代码区域231建立对应的映射区域,内核代码区域对应的映射区域331的首地址和尾地址也可以通过上述第二公式得到;

于内核检测区域26中对固定映射区域21建立对应的映射区域,固定映射区域对应的映射区域31的首地址为0xbff80000,其尾地址为0xc0000000,即固定映射区域对应的映射区域31的地址空间为512kb。

以上所述仅为本发明较佳的实施例,并非因此限制本发明的实施方式及保护范围,对于本领域技术人员而言,应当能够意识到凡运用本发明说明书及图示内容所作出的等同替换和显而易见的变化所得到的方案,均应当包含在本发明的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1