一种具有内存保护功能的内存管理方法.pdf

上传人:r5 文档编号:633569 上传时间:2018-02-28 格式:PDF 页数:23 大小:1.06MB
返回 下载 相关 举报
摘要
申请专利号:

CN03132246.8

申请日:

2003.07.31

公开号:

CN1581108A

公开日:

2005.02.16

当前法律状态:

终止

有效性:

无权

法律详情:

未缴年费专利权终止IPC(主分类):G06F 12/14申请日:20030731授权公告日:20060809终止日期:20130731|||授权|||专利申请权、专利权的转移(专利申请权的转移)变更项目:申请人变更前权利人:深圳市中兴通讯股份有限公司南京分公司变更后权利人:中兴通讯股份有限公司变更项目:地址变更前:210012江苏省南京市雨花台区紫荆花路68号变更后:518057深圳市南山区高新技术产业园科技南路中兴通讯大厦法律部登记生效日:2005.7.15|||实质审查的生效|||公开

IPC分类号:

G06F12/14; G06F12/16

主分类号:

G06F12/14; G06F12/16

申请人:

深圳市中兴通讯股份有限公司南京分公司

发明人:

王芳; 李贤平; 樊永宁

地址:

210012江苏省南京市雨花台区紫荆花路68号

优先权:

专利代理机构:

北京三友知识产权代理有限公司

代理人:

王一斌

PDF下载: PDF下载
内容摘要

本发明提供一种具有内存保护功能的内存管理方法,在具有MMU功能的CPU上进行内存管理;在需要保护的内存两端添加保护页;当有操作访问到所述保护页所在的区域时,实时操作系统确认所述操作为非法修改所述内存的操作,并报告内存访问异常。所述保护页的属性为不可访问。本方法可以在不降低内存访问效率的基础上,提供基于页保护的内存保护功能,并且能够解决因保护内存而引起的浪费内存的问题。由于本方法基本上不降低系统运行效率,同时又不会产生内存浪费,因此可以在设备实际的运行环境中发挥作用,在第一时间捕获到内存越界操作,并保留现场以帮助排错。

权利要求书

1: 一种具有内存保护功能的内存管理方法,是在具有内存管理单元的 CPU上进行内存管理;其特征在于:在需要保护的内存两端添加保护页,所 述保护页的属性为不可访问;当有操作访问到所述保护页所在的区域时,实 时操作系统确认所述操作为非法修改所述内存的操作,并报告内存访问异常。
2: 根据权利要求1所述的一种具有内存保护功能的内存管理方法,其特 征在于,所述的在需要保护的内存两端添加保护页是指:在系统中获取一块 物理内存,利用映射表的对应关系,将该块物理内存映射至虚拟地址空间; 其中:通过所述的映射,可使得在物理地址内存空间中连续的内存块, 在虚拟地址内存空间中是不连续的。
3: 根据权利要求1所述的一种具有内存保护功能的内存管理方法,其特 征在于,所述的在需要保护的内存两端添加保护页是指:在系统中获取一块 物理内存,利用映射表的对应关系,将该块物理内存映射至虚拟地址空间; 其中:通过所述的映射,可使得物理地址内存空间中不连续的内存块, 在虚拟地址内存空间中是连续的。
4: 根据权利要求2或3所述的一种具有内存保护功能的内存管理方法, 其特征在于:只有对映射了实际物理地址的虚拟地址的操作是有效的,而对 未映射的虚拟地址的操作都是无效的。
5: 根据权利要求2所述的一种具有内存保护功能的内存管理方法,其特 征在于,在所述的虚拟地址空间中,将映射了物理内存的地址空间用来存放 数据,而在该地址空间两端留有保护带地址空间进行隔离。
6: 根据权利要求5所述的一种具有内存保护功能的内存管理方法,其特 征在于,两个数据块在物理内存空间中地址是连续的;在虚拟地址空间中所 述两个数据块之间有保护带,地址是不连续的。
7: 根据权利要求6所述的一种具有内存保护功能的内存管理方法,其特 征在于,所述保护带的内存大小在虚拟地址空间中是可以设置为多页的,且 保护带的内存不与实际的物理内存映射。
8: 根据权利要求6所述的一种具有内存保护功能的内存管理方法,其特 征在于包括以下具体步骤: 步骤一:对操作系统进行初始化,即: 获取支持内存管理单元的CPU中提供的进行地址映射操作的数据; 确定尚未映射物理地址的虚拟地址范围; 建立初始化时未映射物理地址的虚拟地址空间的数据结构; 步骤二:封装对虚拟地址空间进行基本操作的接口,即: 封装一套用于获取各级表的表项的接口; 封装一套用于创建各级表项的接口; 封装一套用于对各级表项的各个域进行设置的接口; 步骤三:对系统中数据资源进行保护,即: 创建一个管理虚拟地址数据对象; 在未映射物理地址的虚拟地址空间中申请一块地址空间; 将数据资源所在虚拟地址空间和实际的物理地址空间进行映射; 给用户返回操作该数据资源的起始地址。
9: 根据权利要求8所述的一种具有内存保护功能的内存管理方法,其特 征在于: 步骤一所述的获取支持内存管理单元的CPU中提供的进行地址映射操作 必需的数据是指:根据CPU的硬件寻址方式,获取一个基址,而虚拟地址提 供了偏移;所述寻址为多级寻址; 步骤一所述的确定尚未映射物理地址的虚拟地址范围是指:需根据所述 CPU的内存大小、系统外部存储器或者外部输入输出设备的访问地址空间映 射在CPU地址空间的情况来确定尚未映射物理地址的虚拟地址范围; 步骤一所述的建立初始化时未映射物理地址的虚拟地址空间的数据结构 是指:将系统中未映射物理地址的虚拟地址空间组织起来;该数据结构需要 包含的信息: 所操作的虚拟地址空间的起始地址; 所操作的虚拟地址空间的大小; 所操作的虚拟地址空间的状态,该虚拟地址空间的状态包含虚拟地址空间 中各个最小单元大小的虚拟地址的状态; 步骤二所述的封装一套用于获取各级表的表项的接口是指:第n级的表项 是从第n-1级的表项中获取第n级表的基址,再和虚拟地址中表示第n级表 的偏移部分组合得到表项的地址,再从该地址获取第n级表项,其中n大于 等或等于1; 步骤二所述的需要封装一套用于创建各级表项的接口是指:第n级表项的 创建是根据第n级表的基址和虚拟地址中第n级表项偏移,获取第n级表项 的位置,并在此位置上按照第n级表项的格式,填入第n+1级表的基址,并 将表项设置成有效,此时如果该表项对应的第n+1级表不存在,需要申请一 块内存用于第n+1级表的存放,并将此块内存的首地址作为第n+1级表的基 址填入该表项中; 步骤二所述的需要封装一套用于对各级表项的各个域进行设置的接口是 指:设置虚拟地址到物理地址的对应关系,设置的过程为:根据虚拟地址中 提供的各级表项的偏移和各级表的基址,索引到预设的表项,并将该表项中 的域设置为期望的值; 步骤三所述的创建一个管理虚拟地址数据对象是指:该数据对象的数据 类型就是所述步骤1中建立的数据结构,用于记录数据资源所在虚拟地址空 间的起始地址,地址空间大小和地址空间中各单元是否映射了实际物理地址; 步骤三所述的在系统未映射物理地址的虚拟地址空间中申请一块地址空 间是指:申请的虚拟地址空间的起始地址应该大于等于所述步骤1中确定的 系统中尚未映射物理地址的虚拟地址的起始地址;申请的虚拟地址空间的大 小满足下式:CurGetSize=RealNeedSize+2*ProtectSize;其中预设保护带大 小应该是系统地址映射的最小单元大小的整数倍,并在相应管理虚拟地址数 据对象中记录申请得到的虚拟地址空间起始位置和地址空间大小记录,并记 录该段虚拟地址为未映射物理地址状态; 步骤三所述的将数据资源所在虚拟地址空间和实际的物理地址空间进行 映射是指:从系统实际的物理地址空间申请一块内存,该内存的大小需要大 于等于数据资源所占内存的大小,并且是系统地址映射最小单元大小的整数 倍;数据资源所在虚拟地址空间起始地址取申请的虚拟地址空间起始地址向 后偏移预设保护带大小,从起始地址开始,映射数据资源所占内存大小的虚 拟地址空间到刚才从系统中申请的物理地址上;并在相应的管理虚拟地址数 据对象中记录该段虚拟地址空间状态为已经映射了物理地址的状态; 步骤三所述的给用户返回操作该数据资源的起始地址是指:返回给用户 操作该数据资源的起始地址可以是从映射了物理地址的虚拟地址空间的后边 界处向前偏移实际数据资源大小处的地址。

说明书


一种具有内存保护功能的内存管理方法

    【技术领域】

    本发明涉及一种内存管理方法;尤其是涉及通讯领域中支持内存管理单元(MMU:Memory Management Unit)的CPU上的内存保护和管理。

    背景技术

    在通讯产品中,很多实时操作系统运行的代码都是C代码,而C代码中指针是比较有特点的一种数据类型,它虽然能给C语言中代码的设计带来一定的灵活性,但同时也带来了一些隐患。例如,在系统运行的过程中经常出现系统故障,这种故障通常的表现是:因某段内存的内容被修改而导致系统运行异常,可又无法定位是谁修改了这段内存。然而只要使用指针,这种问题几乎就是无法彻底解决的。因为对于指针来说,只要指向的内存是可写的,就可以任意更改所指的内存中的内容。为此人们可以做到的,仅是尽量缩小这种问题的定位范围,以便更快地找到系统运行异常的原因。对于各种不同地实时操作系统,人们最多想到的就是把一个系统中各个运行实体的访问地址范围隔离起来。

    在通常的嵌入式系统中,对内存几乎是没有保护的。如图1所示,A区是指针的安全操作区,本不应该写到B区,但是由于A区和B区地址相连,在A区操作的指针不经意地写到了B区,由于是无保护的情况,所以B区是可写的,结果B区中的B1部分内容被改写了。这样当系统需要读取B区的内容,如果在B1部分读取,就读到了脏数据到C区,有可能导致系统异常。其中标号1代表写操作,标号2代表读操作。

    所以系统可能经常表现出各种各样的无法定位的问题。比如说,某个变量突然变成了一个不期望的值,最后只能靠审查代码,凭着经验来大致确定可能出错的代码,然后用一些数据结构记录一些信息,进行大量的分析,找到引发问题的原因,很明显,这种方法的缺点就是错误定位周期长,延缓了产品开发进度。

    当人们意识到系统中必须进行内存保护之后,出现了在某些隔离内存中写入特殊值,在系统运行过程中,检查这些隔离内存的内容是否被覆盖,以判断系统中是否有内存越界访问的问题。如图2所示,在A区和B区之间增加了内存保护带C区,C区是被设置为不可写属性的内存区,这样当在A区操作的指针如果连续越界,就会写到C区,此时系统会检测到这个非法操作,报出异常。用户从B区读取到D区的数据是正确的。这种事后分析的方法使得内存越界访问类型之问题的确定变的相对容易一些,但是其局限性也很大,最关键的问题是无法在第一时间捕获到内存越界操作,当然也无法准确定位修改特殊值的操作的位置。

    【发明内容】

    本发明的目的在于,提供一种具有内存保护功能的内存管理方法,以在具有MMU功能的CPU上进行内存保护及高效的内存管理。本方法可以在不降低内存访问效率的基础上,提供基于页保护的内存保护功能,并且能够解决因保护内存而引起的浪费内存的问题。由于本方法基本上不降低系统运行效率,同时又不会产生内存浪费,因此可以在设备实际的运行环境中发挥作用,在第一时间捕获到内存越界操作,并保留现场以帮助排错。

    本发明的技术方案为:

    提供一种具有内存保护功能的内存管理方法,在具有MMU功能的CPU上进行内存管理;在需要保护的内存两端添加保护页;当有操作访问到所述保护页所在的区域时,实时操作系统确认所述操作为非法修改所述内存的操作,并报告内存访问异常。所述保护页的属性为不可访问。

    本发明所述的方法包括以下步骤:获取一块物理内存,利用映射表的对应关系,将该块物理内存映射至虚拟地址空间;其中:通过所述的映射,使得在物理地址内存空间中连续的内存块,在虚拟地址内存空间中是不连续的。

    本发明所述的方法包括以下步骤:获取一块物理内存,利用映射表的对应关系,将该块物理内存映射至虚拟地址空间;其中:通过所述的映射,使得物理地址内存空间中不连续的内存块,在虚拟地址内存空间中是连续的。

    本发明的有益效果为:原来在物理内存中紧挨着的数据,可以在虚拟地址中将其隔离开来,并且可以在CPU虚拟地址空间表达范围允许的前提下,根据系统设计需要对不同的数据设置不同的保护带的大小。内存保护带地址空间可以看作越界操作敏感区,由于大部分的越界操作都是在数据资源所在区域边界处发生的,所以在此处暴露越界的概率最大,当然,如果越界的指针越过了保护带,进入了另一个可写内存区域,这种情况,仍然无法捕捉。另外,值得注意的是,内存保护带仅仅占用了虚拟地址空间,没有占用系统可用内存空间,所以内存保护带的大小,是不会造成内存的浪费的。采用本发明所述方法,与现有技术相比,取得了突破性进步,达到了及时检测到内存访问越界问题的效果,节省了系统可用内存空间,提高了系统的稳定性。

    【附图说明】

    图1为无保护的内存越界访问示意图; 

    图2为基本MMU保护的内存越界访问示意图;

    图3为本发明中在基本MMU保护基础上的内存越界访问示意图;

    图4为内存保护总体流程图;

    图5为总体流程图中初始化部分流程图;

    图6为总体流程图中封装虚拟地址空间基本操作接口部分流程图;

    图7为总体流程图中系统数据资源保护流程图;

    图8为各级表项的索引过程以及虚拟地址到物理地址的转换过程;

    图9为中央处理单元CPUX86中页目录表项的定义格式;

    图10为CPUX86中页表项的定义格式。

    【具体实施方式】

    下面结合附图说明本发明的具体实施方式:

    在具有″页″的概念的CPU中,页表是一个不可缺少的重要元素,它和硬件寻址紧密相关。内存保护的实现简单的说,就是在需要保护的重要内存两端,添加若干保护页,这些保护页的属性为不可访问,当有操作访问到保护页所在区域,可认为该操作就有非法修改重要内存的企图,同时,实时操作系统可以很快的发现并报告内存访问异常,便于及时的发现异常隐患。为了减少系统内存浪费,设计了一套虚拟内存管理方案如下:

    该设计是基于32位总线系统的,所以其虚拟地址空间是4G,但是通常,一个实时系统的物理内存一般很难达到这么大。本发明就是充分利用了没有实际物理内存对应的虚拟地址空间,将这部分虚拟地址空间管理起来,达到了既有效地保护了重要内存,又降低了系统内存的浪费。从系统中获取一块物理内存,利用映射表的对应关系,将这块物理内存映射至虚拟地址空间,由于程序指令的操作,都是按照虚拟地址进行的,所以程序中看似是对虚拟地址所指的内存操作,实际上是对其映射的物理内存操作。同时,通过这种映射方式,可以使得在物理地址内存空间中连续的内存块,在虚拟地址内存空间中是不连续的,同样,也可以使得物理地址内存空间中不连续的内存块,在虚拟地址内存空间中是连续的。只有对映射了实际物理地址的虚拟地址的操作是有效的,而对未映射的虚拟地址的操作都是无效的。按照这种思路,保护带的内存大小,在虚拟地址空间中,是可以设置为多页的,而且保护带的内存由于没有与实际的物理内存关联,所以是不消耗任何系统内存的。在虚拟地址空间中,将映射了物理内存的地址空间用来存放重要数据,而在该地址空间两端留有几页保护带地址空间进行隔离。即使两个重要数据块在物理内存空间中地址是连续的,由于在虚拟地址空间中,两个重要的数据块之间有保护带,所以在虚拟地址空间中,地址是不连续的,这样,程序中对一块重要数据的操作,如果不小心越界,也不会破坏另一块重要数据的内容。这样就起到了保护的作用。

    为了便于开发,可生成一套虚拟内存操作接口,使得应用无需关心底层细节而方便的使用虚拟内存。另外,还扩展开发了一套对系统页表操作的接口,可以方便的进行页表的创建,删除,切换。在多进程系统中,可以通过页表对各个进程可见的内存范围进行控制,从而达到一个进程不可见另一个进程的私有数据。从某种角度上来说,也就是对进程的私有内存区域进行了隔离和保护。

    本发明核心步骤在于:

    第一步:进行必要的初始化工作。

    1)获取支持MMU的CPU中提供的进行地址映射操作必需的数据。

    对于硬件上支持MMU的CPU,运行在其上的操作系统初始化工作主要是根据CPU的硬件寻址方式,为了能够访问已经存在的物理地址,建立一套机制。比较典型的过程就是指定一个基址,而虚拟地址提供了偏移。寻址可以分为多级寻址,如果系统的寻址需要分为n(n>=1)级,系统就需要建立n级表进行寻址,第n-1级表提供第n级表的基地址,虚拟地址也需要分为n段,各段对应于各级表的偏移,直至寻址到实际的物理内存地址。需要获取第一级表的基址,大部分的CPU会将其存放在一个特定的地址或者寄存器里,这个要参考CPU的硬件手册。

    2)确定系统中尚未映射物理地址的虚拟地址范围。

    目前使用的CPU大部分都是32位的系统总线,所以一个系统的虚拟地址空间的大小可达4G,而系统中尚未映射的物理地址的虚拟地址范围根据硬件设计的不同而不同,主要取决于该CPU的内存大小,另外还要考虑到在有些系统中,会将一些外部存储器或者外部IO(输入输出)设备的访问地址空间映射在CPU地址空间的情况。

    3)建立组织和管理系统初始化时未映射物理地址的虚拟地址空间的数据结构。

    建立的数据结构主要是用于将系统中未映射物理地址的虚拟地址空间组织起来。该数据结构需要包含的信息:

    a)所操作的虚拟地址空间的起始地址。

    b)所操作的虚拟地址空间的大小。

    c)所操作的虚拟地址空间的状态,用于表示虚拟地址空间是否被映射了实际的物理地址。由于各个CPU具有地址空间访问属性设置的最小单元,所以此处虚拟地址空间的状态要可以表示包含虚拟地址空间中各个最小单元大小的虚拟地址的状态。

    第二步:封装对虚拟地址空间进行基本操作的接口。

    1)需要封装一套用于获取各级表的表项的接口。

    第1级表项的获取是将第一步中获取的第1级表的基址和虚拟地址中表示第1级表的偏移部分组合得到表项的地址,从该地址取出第1级表项。

    第n(n>=2)级的表项是从第n-1级的表项中获取第n级表的基址,再和虚拟地址中表示第n级表的偏移部分组合得到表项的地址,再从该地址获取第n级表项。

    2)需要封装一套用于创建各级表项的接口。

    由于对于支持MMU的CPU,其上运行的操作系统一般只是创建了和实际物理地址对应的各级表项,而对于未使用的虚拟地址空间,是没有相应的各级表项的,这就需要进行创建。

    第n(n>=1)级表项的创建是根据第n级表的基址和虚拟地址中第n级表项偏移,获取第n级表项的位置,并在此位置上按照第n级表项的格式,填入第n+1级表的基址,并将表项设置成有效。此时,如果该表项对应的第n+1级表不存在,需要申请一块内存用于第n+1级表的存放,并将此块内存的首地址作为第n+1级表的基址填入该表项中。

    3)需要封装一套用于对各级表项的各个域进行设置的接口。

    第n(n>=1)级表的表项中的各个域的设置直接影响了第n级表项的有效性以及第n+1级表的访问属性。而对表项中各个域中的值进行设置的目的,也就是为了设置虚拟地址到物理地址的对应关系。设置的过程:根据虚拟地址中提供的各级表项的偏移和各级表的基址,索引到想要设置的表项,并将该表项中的域设置为期望的值。需要说明的是,各级表项中,各个域表达的含义根据CPU的不同会不同,所以设置的期望值应当遵循各个CPU硬件手册上的赋值规则。

    a)虚拟地址到物理地址的映射操作。

    第n(n>=1)级表项中通常包含指示第n+1级表的基址的信息,根据各级表的基址和虚拟地址提供的各级表项的偏移,级级关联组成了虚拟地址到物理地址的映射关系,可以通过修改表项中基址域中的值来设定虚拟地址到物理地址的映射。通常最后一级表项中提供虚拟地址映射的物理地址所在最小单元的基址,简单的做法,可以将最后一级表项中物理地址的基址设置为期望的物理地址所在最小单元的基址,进行虚拟地址到物理地址的映射。

    b)虚拟地址到物理地址的解除映射操作。

    第n(n>=1)级表项中通常包含第n级表项是否有效的信息,根据虚拟地址提供的各级表项的偏移,索引到最后一级表项,将该表项设置为无效,就可以解除虚拟地址到对应的物理地址之间的映射关系。

    c)虚拟地址对应的物理地址的访问属性的设置。

    第n(n>=1)级表项中通常包含第n+1级表的访问属性,根据虚拟地址提供的各级表项的偏移,索引到最后一级表项,该表项中包含虚拟地址对应的物理地址所在最小单元大小的内存的访问属性,通过对该属性的设置,可以将内存的访问属性设置为只读、读写、只写或者不可访问。

    第三步:对系统中数据资源进行保护。

    对系统中数据资源的保护可以看作两个方面,一个是防止对其他数据的操作不当导致对数据资源本身的破坏,一个是防止数据资源本身的操作不当导致对其他数据的破坏。

    1)创建一个管理虚拟地址数据对象。

    该数据对象的数据类型就是第一步中建立的数据结构,用于记录数据资源所在虚拟地址空间的起始地址,地址空间大小和地址空间中各单元是否映射了实际物理地址。

    2)在系统未映射物理地址的虚拟地址空间中申请一块地址空间。

    申请的虚拟地址空间的起始地址应该大于等于第一步中确定的系统中尚未映射物理地址的虚拟地址的起始地址。申请的虚拟地址空间的大小是:数据资源所占内存的大小+(2*预设保护带大小),如果设:申请的虚拟地址空间的大小为:CurGetSize,数据资源所占内存的大小为:RealNeedSize,预设保护带大小为:ProtectSize,则有:

    CurGetSize=RealNeedSize+2*ProtectSize。

    由于对内存属性的设置只能对内存大小为系统地址映射最小单元大小的整数倍的内存空间进行,所以申请的地址空间的大小必须是系统地址映射的最小单元大小的整数倍,其中预设保护带大小也应该是系统地址映射的最小单元大小的整数倍。并在相应管理虚拟地址数据对象中记录申请得到的虚拟地址空间起始位置和地址空间大小记录,并记录该段虚拟地址为未映射物理地址状态。

    3)将数据资源所在虚拟地址空间和实际的物理地址空间进行映射。

    从系统实际的物理地址空间申请一块内存,该内存的大小需要大于等于数据资源所占内存的大小,并且是系统地址映射最小单元大小的整数倍。数据资源所在虚拟地址空间起始地址取申请的虚拟地址空间起始地址向后偏移预设保护带大小,从起始地址开始,映射数据资源所占内存大小的虚拟地址空间到刚才从系统中申请的物理地址上。并在相应的管理虚拟地址数据对象中记录该段虚拟地址空间状态为已经映射了物理地址的状态。

    4)给用户返回操作该数据资源的起始地址。

    考虑到越界操作大部分是向后越界,返回给用户操作该数据资源的起始地址可以是从映射了物理地址的虚拟地址空间的后边界处向前偏移实际数据资源大小处的地址。

    通过此种方式,原来在物理内存中紧挨着的数据,可以在虚拟地址中将其隔离开来,并且可以在CPU虚拟地址空间表达范围允许的前提下,根据系统设计需要对不同的数据设置不同的保护带的大小。

    内存保护带地址空间可以看作越界操作敏感区,由于大部分的越界操作都是在数据资源所在区域边界处发生的,所以在此处暴露越界的概率最大,当然,如果越界的指针越过了保护带,进入了另一个可写内存区域,这种情况,仍然无法捕捉。另外,值得注意的是,内存保护带仅仅占用了虚拟地址空间,没有占用系统可用内存空间,所以内存保护带的大小,是不会造成内存的浪费的。

    图3是表示将A区映射到A1区,B区映射到B1区,可以看出本来物理地址相连的A区和B区经过映射之后,在虚拟地址空间中的地址已经不连续了,中间隔了一个C1区,和图2不同的是,C1区是没有映射物理地址的内存区,当在A1区操作的指针连续越界的时候,就会写到C1区,此时,系统就会检测到C1无法访问,同样也会报告系统异常。其中标号3代表映射方向。

    图8表示了各级表项的索引过程以及虚拟地址到物理地址的转换过程。图6中的各部分接口可以依据此图,索引的相应的表项,并通过修改表项中的值来实现各个接口的功能。

    现以CPUX86为例,对技术方案的实施作进一步的详细描述:

    CPUX86中的寻址过程如下:1、隐含寻址部分,这部分在系统初始化后,就已经完成了,隐含寻址部分主要是通过以段选择子为偏移,在描述表里索引到相应的段选择子,在段选择子中获取段基址。虚拟地址就作为段偏移,与段基址相加,获得的值称之为线性地址。此处的段基址,在系统中就是0,所以从数值上看,虚拟地址和线性地址是相等的,所以本例不对虚拟地址和线性地址加以区分。2、显式寻址部分,这部分分成两级实现,就存在两级表的概念,一级是页目录表,一级是页表。页目录表提供了页表的基址,页表提供了物理地址的基址。虚拟地址的第22位到第31位是页目录表的索引,虚拟地址的第12位到第21位是页表的索引,虚拟地址的第0位到第11位是物理地址偏移。

    本例的运行环境是VxWorks操作系统,

    第一步:进行必要的初始化工作。

    1)获取支持MMU的CPU中提供的进行地址映射操作必需的数据。

    CPUX86的第1级表是页目录表,页目录表的基址存放在页目录基础寄存器(PDBR:Page Directory Base Register)中,首先从该寄存器中读取到页目录表的基址,以此作为以后索引表项和地址映射的基础,这里用PageDbase表示。

    2)确定系统中尚未映射物理地址的虚拟地址范围。

    在单板上配置的是512M的内存,并且没有外设和外部存储器需要映射到内存的寻址空间中,所以取未映射物理地址的虚拟地址范围的起始地址为0×20000000,起始地址用VirAddrStart表示。

    3)建立组织和管理系统初始化时未映射物理地址的虚拟地址空间的数据结构。

    现定义一个双向链表数据结构如下:

    typedef struct tagVmemRecord

    {

        WORD32 dwStartPage;      /*本虚拟地址节点起始页*/

        WORD32 dwPageNum;        /*本虚拟地址节点的页块数*/

        BYTE  *pbyPageState;   /*本虚拟地址节点中页状态*/

        struct tagVmemRecord *ptPrev;  /*后向指针*/

        struct tagVmemRecord *ptNext;  /*后向指针*/

    }TVmemRecord;

    其中pbyPageState可以表示dwPageNum个页的状态。PbyPageState指向一块dwPageNum个字节的内存空间,每个字节表示其中1页大小的虚拟地址空间状态(映射或者没有映射实际物理地址)。

    第二步:封装对虚拟地址空间进行基本操作的接口。

    1)需要封装一套用于获取各级表的表项的接口。

    比如获取第二级表——页表的表项,该接口输入必须包含的信息:页目录表的基址,虚拟地址。输出就是页表的表项。接口中实现如下:取虚拟地址的第22位到第31位,作为页目录表的偏移PdOffset,从地址(PageDbase<<12|PdOffset)处获取页目录表项PdEntry,从PdEntry中获取页表的基址PageTBase;取虚拟地址的第12位到第21位,作为页表的偏移PtOffset,从地址(PageTBase<<10|PtOffset)处获取页表项。这里用GetPageTableEntry表示该接口。

    2)需要封装一套用于创建各级表项的接口。

    比如创建第二级表——页表的表项,前提是该页表表项没有相应的内存存放,一般是由于相应页表不存在导致,所以表项的创建,实际上就是完成表的创建。接口的输入包含的信息:页目录的基址,虚拟地址。根据虚拟地址。输出就是新创建的页表。接口的实现如下:首先使用获取表项的接口,获取相应的页目录表的表项,此时,此表项一定是无效的;在系统中申请一块存放新页表的内存,并将申请的内存起始地址(该地址一定要是页边界对齐的),起始地址的第12位到第31位作为页表基址填入到页目录表项中,页目录表项定义的格式见图9,将页目录表项中表示页表存在的位P(Present)置1,其他各个域可以根据用户的需求填入有效值。在新页表的对应于虚拟地址的页表项处,根据用户的需求,填入各个域的值,页表项定义的格式见图10,其中的P位表示虚拟地址是否有实际的物理地址对应,如果没有,则需要将P位置为0。(页基址:Page Base Address;页表基址:Page-Table BaseAddress)

    3)需要封装一套用于对各级表项的各个域进行设置的接口。

    接口的输入包含信息:页目录表基址,虚拟地址。接口的输入就是用户期望的表项,接口的实现如下:根据页目录表基址和虚拟地址找到相应的表项,根据CPUX86手册中规定的表项的格式,根据用户的需求,填入期望值。

    第三步:对系统中数据资源进行保护。

    1)创建一个管理虚拟地址数据对象。

    申明一个类型为TvmemRecord的数据对象,用tVmemRecord表示。

    2)在系统未映射物理地址的虚拟地址空间中申请一块地址空间。

    根据数据资源的大小和预设的保护带的大小,在大于等于VirtAddrStart的地方CurrentVAddr保留一块空间,假设空间的大小为PageNum页,将CurrentVAddr,PageNum记录到tVmemRecord中,同时申请一块PageNum个字节的内存,赋给tVmemRecord的pbyPageState,并将页的状态都标志为未映射状态。

    3)将数据资源所在虚拟地址空间和实际的物理地址空间进行映射。

    申请一块存放数据资源的内存,假设该物理内存的地址为PhyAddr,将CurrentVAddr向后偏移一个预设保护带的大小,假设为ProtectSize,根据虚拟地址(CurrentVAddr+ProtectSize),如果存在,则直接索引到相应的表项,否则需要创建表项,将其中物理地址域填成PhyAddr的第12位到第31位,并置表项的P位为1,其他域的赋值略。

    4)给用户返回操作该数据资源的起始地址。

    前面提到,申请的存放数据资源的内存的大小(假设为CurGetSize)是大于等于实际数据资源所占内存的大小(假设为RealNeedSize)的,将地址(CurrentVAddr+ProtectSize+CurGetSize-RealNeedSize)返回给用户使用。

    可见数据资源存放的位置,在虚拟地址空间中,其两侧是未映射物理地址的,而对于未映射物理地址的空间进行任何操作,操作系统会检测出来,并立即作为异常报出。此时,对该数据资源从返回的地址开始进行写操作,写的范围超过RealNeedSize,就可以看见操作系统报Page Fault异常。

    采用本发明所述方法,与现有技术相比,取得了突破性进步,达到了及时检测到内存访问越界问题的效果,节省了系统可用内存空间,提高了系统的稳定性等。

    以上具体实施方式仅用于说明本发明,而非用于限定本发明。

一种具有内存保护功能的内存管理方法.pdf_第1页
第1页 / 共23页
一种具有内存保护功能的内存管理方法.pdf_第2页
第2页 / 共23页
一种具有内存保护功能的内存管理方法.pdf_第3页
第3页 / 共23页
点击查看更多>>
资源描述

《一种具有内存保护功能的内存管理方法.pdf》由会员分享,可在线阅读,更多相关《一种具有内存保护功能的内存管理方法.pdf(23页珍藏版)》请在专利查询网上搜索。

本发明提供一种具有内存保护功能的内存管理方法,在具有MMU功能的CPU上进行内存管理;在需要保护的内存两端添加保护页;当有操作访问到所述保护页所在的区域时,实时操作系统确认所述操作为非法修改所述内存的操作,并报告内存访问异常。所述保护页的属性为不可访问。本方法可以在不降低内存访问效率的基础上,提供基于页保护的内存保护功能,并且能够解决因保护内存而引起的浪费内存的问题。由于本方法基本上不降低系统运行。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1