物理内存的映射和读写方法

文档序号:6603999阅读:2019来源:国知局
专利名称:物理内存的映射和读写方法
技术领域
本发明涉及一种物理内存的读写方法,特别涉及一种可以使应用程序对物理内存直接访问的方法。
背景技术
在计算机系统中,物理内存(Physical Memory)是非常重要的,所有应用程序和大部分的设备驱动程序都要用到它。正是由于它的重要性,所以操作系统就将其保护起来,使其经常处于保护模式下,以避免用户对它有意或无意的破坏。
但是,这样做也会带来一些不便,在这种情况下,用户申请的内存地址不是物理地址而是虚拟内存的地址,而虚拟内存是由物理内存和硬盘上的一部分空间组成的。例如,对于物理内存是0xFEC71的内存单元,我们访问它的时候,不能在程序中直接访问0xFEC71,因为这时候的地址被看作虚拟地址,我们真正要访问的是对它进行映射后的地址。
按照传统的方法,内存访问通过申请大块地址来实现的,这样做不仅效率低,而且不能控制申请地址的位置,因为,我们向系统申请一块内存空间时,系统将这部分空间相对应的虚拟内存的起始地址返回来,完成我们的需求,它只包括应用程序层。这种方法,在某些应用中,例如测试内存的时候,就存在比较大的缺陷。
请参阅表1,为物理内存地址区块示意图。

表1
假定某物理内存地址由地址块1-5组成,如果采用现有的申请内存空间的方法用于某些应用,如用于测试内存,则存在如下问题首先,我们不知道我们申请的内存在物理内存中所处的位置,即无法确定占用的物理内存是地址块1还是地址块2,这就造成了申请内存空间的不确定性;其次,由系统分配的虚拟内存表面上看是连续的,而实际上却可能分成若干个小块分散在物理内存中,即有可能占用地址块1和3而不是地址块1和2,这就造成内存测试的不连贯性;最后,当我们多次申请内存空间的时候,系统每一次分配的物理内存区域有可能重复,即第一次占用地址块1和2,而第二次占用了地址块1和3而不是我们希望的地址块3和4,这就造成测试的重复和不全面。

发明内容
本发明所要解决的技术问题是提供一种物理内存的映射和读写方法,可以通过对物理内存的映射,而实现按照需要的地址位置,对物理内存进行准确的直接访问。
为实现上述目的,本发明提供一种物理内存的映射和读写方法,至少包括如下步骤初始化驱动程序;调用读写函数,从应用程序中传进一个结构体;根据结构体参数,驱动程序对地址进行映射,并将映射后的地址返回应用程序;按照返回的地址进行内存读写;及取消地址映射,释放虚拟地址。
本发明为一种物理内存的映射和读写方法,这种访问物理内存的方法简单易行而且很安全,避免了许多无法预料的错误,可以准确的访问指定的内存空间的地址以及长度,效率很高,使用起来也很灵活。本发明可适用于任何需要读写内存的模块,例如应用于内存的测试中,可以实现准确、连续、不重复和全面的测试效果。
为使本发明的目的、特征及其功能有进一步的了解,配合附图详细说明如下


图1为本发明物理内存的映射和读写方法的应用环境示意图;及图2为本发明物理内存的映射和读写方法流程图。
其中,附图标记说明如下10--用户,20--读写内存模块,21--应用程序层,22--驱动程序层,步骤301--初始化驱动程序,步骤302--调用读写函数,从应用程序中传进一个结构体,步骤303--根据结构体参数,驱动程序对地址进行映射,并将映射后的地址返回应用程序,步骤304--按照返回的地址进行内存读写,步骤305--取消地址映射,释放虚拟地址。
具体实施例方式
本发明适用于任何需要读写内存的模块。请参见图1,本发明的应用环境示意图。用户10可以通过接口函数指定包括起始地址、长度和数据缓冲区(Buffer)等读写函数参数。在读写内存模块20中,包括应用程序层21和驱动程序层22。应用程序层21负责初始化、卸载驱动程序,传递功能代码和参数,以及读写内存的工作。驱动程序层主要负责映射特定位置和大小的内存块,返回当前进程的线性地址。
请参阅图2,本发明物理内存的映射和读写方法流程图。首先,初始化驱动程序(步骤301);然后,调用读写函数,从应用程序中传进一个结构体(步骤302);根据结构体参数,驱动程序对地址进行映射,并将映射后的地址返回应用程序(步骤303);按照返回的地址进行内存读写(步骤304);最后,取消地址映射,释放虚拟地址(步骤305)。
在上述步骤之后,最好再执行一卸载驱动程序的步骤。虽然其不是必需的,但卸载驱动程序后可以释放驱动程序所占用的内存,节省了资源。
上述驱动程序是事先创建好的一个处于内核模式(Kernel Mode)的驱动,其功能在于实现地址的映射。用户可以通过封装的类来管理驱动,而数据的读写是调用类的公共成员函数来完成。
上述初始化驱动程序的步骤,其作用是加载驱动程序,包括删除旧版本驱动、安装驱动、和激活驱动等动作,如果加载成功就进行下一步。
上述调用读写函数的步骤,可供选择的读写函数有多种,主要区别在于读写的长度不同。读写函数的参数包括起始地址、长度和数据缓冲区,这些参数可由用户自己指定。
上述从应用程序中传进的结构体中,包括需要映射的物理内存起始地址、地址的长度和映射后的地址三个基本数据。
读写函数将用户提供的起始地址和长度传递给驱动程序,在驱动程序中对地址进行映射并将映射后的地址返回给应用程序。这个地址和应用程序访问的普通虚拟地址一样,使用普通的内存访问方法就可以读写数据。
读写结束后,需要取消映射,目的是释放我们占用的虚拟地址,将它归还给系统继续使用。
虽然本发明的实施例公开如上所述,然其并非用以限定本发明,任何熟习相关技艺者,在不脱离本发明的精神和范围内,可作进一步的更动与润饰,因此本发明所要保护的权利范围应以权利要求书所要求保护的范围为准。
权利要求
1.一种物理内存的映射和读写方法,其特征在于包括如下步骤初始化驱动程序;调用读写函数,从应用程序中传进一个结构体;根据结构体参数,驱动程序对地址进行映射,并将映射后的地址返回应用程序;按照返回的地址进行内存读写;及取消地址映射,释放虚拟地址。
2.如权利要求1所述物理内存的映射和读写方法,其特征在于在取消地址映射,释放虚拟地址步骤之后,可包括一卸载驱动程序的步骤。
3.如权利要求1所述物理内存的映射和读写方法,其特征在于所述驱动程序是处于内核模式,用于实现地址的映射。
4.如权利要求1所述物理内存的映射和读写方法,其特征在于所述初始化驱动程序的步骤,包括删除旧版本驱动、安装驱动和启动驱动等动作。
5.如权利要求1所述物理内存的映射和读写方法,其特征在于所述调用读写函数的步骤,读写函数的参数包括起始地址、长度和数据区。
6.如权利要求5所述物理内存的映射和读写方法,其特征在于所述读写函数的参数可由用户指定。
7.如权利要求1所述物理内存的映射和读写方法,其特征在于所述从应用程序中传进的结构体,包括需要映射的物理内存起始地址、地址的长度和映射后的地址三个基本数据。
全文摘要
一种物理内存的映射和读写方法,通过对物理内存的映射,实现按照需要对物理内存进行准确的直接访问,包括如下步骤初始化驱动程序;调用读写函数,从应用程序中传进一个结构体;根据结构体参数,驱动程序对地址进行映射,并将映射后的地址返回应用程序;按照返回的地址进行内存读写;取消地址映射,释放虚拟地址。这种访问物理内存的方法简单易行而且很安全,避免了许多无法预料的错误,可以准确的访问指定的内存空间的地址以及长度,效率很高,使用起来也很灵活。
文档编号G06F12/06GK1508695SQ0215781
公开日2004年6月30日 申请日期2002年12月19日 优先权日2002年12月19日
发明者刘文涵, 宋建福, 萧晟, 王震 申请人:英业达股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1