发明内容
因此,针对上述现有技术中存在的问题和需求做出本发明。
本发明实施例的目的是提供一种内存映射方法和内存映射模块,其能够通过使得在用户态中操作线性地址空间等效于在内核态操作页表项,而减少进入内核态查询页表项所对应的物理页框号的次数,从而减少在内核态和用户态之间的切换所造成的时间延迟。
根据本发明实施例的一个方面,提供了一种内存映射方法,用于将物理内存页映射到用户态中的线性地址空间,其中,通过将所述物理内存页的页框号填入所述线性地址空间对应的页表项来将物理内存页映射到线性地址空间,所述方法包括:在用户态中分配第一线性地址空间;在用户态中查询所述第一线性地址空间对应的第一页表项;在内核态中查询所述第一页表项对应的第一物理页框号;在用户态中分配对应于所述第一页表项的第二线性地址空间;在用户态中查询所述第二线性地址空间对应的第二页表项;以及在内核态中将第一物理页框号填入所述第二页表项中,以使得在用户态中操作第二线性地址空间等效于在内核态操作第一页表项。
在上述内存映射方法中,所述在用户态中查询所述第一线性地址空间对应的第一页表项的步骤具体包括:利用所述第一线性地址空间的分段索引规则计算出所述第一页表项线性地址;以及所述在用户态中查询所述第二线性地址空间对应的第二页表项的步骤具体包括:利用所述第二线性地址空间的分段索引规则计算出所述第二页表项线性地址。
在上述内存映射方法中,所述在内核态中查询所述第一页表项对应的第一物理页框号的步骤具体包括:调用系统函数查询第一页表项线性地址对应的物理页框号。
在上述内存映射方法中,所述将第一物理页框号填入所述第二页表项中的步骤之后进一步包括:当接收到新的物理页框号数组时,根据接收到的物理页框号数目在用户态第一线性地址空间中分配第三线性地址空间;在用户态中将所述新的物理页框号填入映射到所述第二线性地址空间的第一页表项中,以将新的物理内存页映射到所述第三线性地址空间中。
在上述内存映射方法中,在接收到多个物理页框号数组时,所述第一线性地址空间循环使用。
根据本发明实施例的另一方面,提供了一种内存映射模块,用于将物理内存页映射到用户态中的线性地址空间,其中,通过将所述物理内存页的页框号填入所述线性地址空间对应的页表项来将物理内存页映射到线性地址空间,所述模块包括:第一分配单元,配置为在用户态中分配第一线性地址空间;第一查询单元,配置为在用户态中查询由所述第一分配单元分配的第一线性地址空间所对应的第一页表项;第二查询单元,配置为在内核态中查询与由所述第一查询单元查询的第一页表项对应的第一物理页框号;第二分配单元,配置为在用户态中分配与由所述第一分配单元分配的第一页表项对应的第二线性地址空间;第三查询单元,配置为在用户态中查询由所述第二分配单元分配的第二线性地址空间对应的第二页表项;以及第一映射单元,配置为在内核态中将由所述第二查询单元查询的第一物理页框号填入由所述第三查询单元查询的第二页表项中,以使得在用户态中操作第二线性地址空间等效于在内核态操作第一页表项。
在上述内存映射模块中,所述第一查询单元具体配置为:利用由所述第一分配单元分配的第一线性地址空间的分段索引规则计算出所述第一页表项线性地址;以及所述第三查询单元具体配置为:利用由所述第二分配单元分配的第二线性地址空间的分段索引规则计算出所述第二页表项线性地址。
在上述内存映射模块中,所述第二查询单元具体配置为:调用系统函数查询与由所述第一查询单元查询的第一页表项的线性地址对应的物理页框号。
在上述内存映射模块中,进一步包括:第三分配单元,配置为当接收到新的物理页框号数组时,根据接收到的物理页框号数目在用户态中由所述第一分配单元分配的第一线性地址空间中分配第三线性地址空间;以及第二映射单元,配置为在用户态中将所述新的物理页框号填入映射到所述第二线性地址空间的第一页表项中,以将新的物理内存页映射到所述第三线性地址空间中。
在上述内存映射模块中,在接收到多个物理页框号数组时,所述第一线性地址空间循环使用。
通过根据本发明实施例的内存映射方法和内存映射模块,可以仅进入内核态一次来查询页表项所对应的物理页框号,从而显著减少了将物理内存页映射到线性地址空间的时间,提高了物理内存的访问速度,实现了高效的数据共享。
具体实施方式
下面,将结合附图详细描述根据本发明实施例的内存映射方法和内存映射模块。
由于进程的页表项本身处于操作系统工作集的线性地址空间的内核空间中,因此,设置页表项需要内核态组件辅助是不可避免的。但是,相比于每映射一组物理页框号都进入内核态进行页表项的填写的现有方案,根据本发明实施例的内存映射方法寻求将内核态中的页表项映射到用户态中的线性地址空间中,从而使得在用户态中操作线性地址空间就等效于在内核态中操作页表项。
具体地说,在根据本发明实施例的内存映射方法中,在启动该高速内存映射方案时,首先进行初始化,以在操作系统工作集中一次性地申请较大长度的线性地址空间供循环利用,并且仅进入一次内核态查找该段固定线性地址空间的第一页表项及其所对应的物理页框号,并在用户态中分配第一页表项所对应的另一段线性地址空间,这样,通过将上述物理页框号填入该另一端线性地址空间所对应的第二页表项中,就可以完成第一页表项从内核态中的线性地址空间到用户态中的该段固定线性地址空间的映射。之后,在具体工作过程中,用户态中的内存映射模块每次接收到传入的物理页框号数组,都可以通过在用户态中将该组物理页框号填入第一页表项所映射到的该段固定线性地址空间来快速完成页表项的填写,从而实现线性地址空间与物理内存页的高速映射。
根据本发明实施例的一个方面,提供了一种内存映射方法,用于将物理内存页映射到用户态中的线性地址空间,其中,通过将物理内存页的页框号填入所述线性地址空间对应的页表项来将物理内存页映射到线性地址空间,所述方法包括:在用户态中分配第一线性地址空间;在用户态中查询所述第一线性地址空间对应的第一页表项;在内核态中查询所述第一页表项对应的第一物理页框号;在用户态中分配对应于所述第一页表项的第二线性地址空间;在用户态中查询所述第二线性地址空间对应的第二页表项;在内核态中将第一物理页框号填入所述第二页表项中,以使得在用户态中操作第二线性地址空间等效于在内核态操作第一页表项。
图1是示出根据本发明实施例的内存映射方法的示意性流程图。根据本发明实施例的内存映射方法用于将物理内存页映射到用户态中的线性地址空间,其中,通过将物理内存页的页框号填入所述线性地址空间对应的页表项来将物理内存页映射到线性地址空间。如图1所示,该方法包括:S100,在用户态中分配第一线性地址空间;S101,在用户态中查询所述第一线性地址空间对应的第一页表项;S102,在内核态中查询所述第一页表项对应的第一物理页框号;S103,在用户态中分配对应于所述第一页表项的第二线性地址空间;S104,在用户态中查询所述第二线性地址空间对应的第二页表项;S105,在内核态中将第一物理页框号填入所述第二页表项中,以使得在用户态中操作第二线性地址空间等效于在内核态操作第一页表项。
通过根据本发明实施例的内存映射方法,可以仅在该高速内存映射方案的初始化进程中,也就是在该方案的准备阶段进入内核态一次,以完成内核态中的页表项到用户态中的线性地址空间的映射。这样,在其后的工作过程中,每次接收到新的物理页框号数组时,仅需要将该组新的物理页框号在用户态中填入页表项所映射到的线性地址空间,就可以完成物理内存页到线性地址空间的映射,而不需要再次进入内核态中进行操作。
因此,对于现有的用户态物理内存页映射方法来说,如图2所示,每次进行物理内存页到线性地址空间的映射,都需要进入内核态一次,并调用系统函数来查询该线性地址空间所对应的页表项线性地址所对应的物理页框号,这里,假设调用系统函数的查询时间为IoControlTime,且将物理页框号填入到页表项的映射时间为MappingTime,则完成n次映射所需要的时间为n×(IoControlTime+MappingTime),如图2所示。
而在根据本发明实施例的内存映射方法中,仅需要在准备阶段进入内核态一次,并调用系统函数来查询页表项线性地址所对应的物理页框号,从而将物理页框号填入页表项中,此后,每次需要进行物理内存页到线性地址空间的映射时,仅需要在用户态中将物理页框号填入到页表项所对应的线性地址空间中即可。这样,同样完成n次映射,根据本发明实施例的内存映射方法所需要的时间为IoControlTime+(n+1)×MappingTime,如图3所示。这里,图2是示出现有内存映射方法所需要的时间的示意图,且图3是示出根据本发明实施例的内存映射方法所需要的时间的示意图。
通过在一台运行Window XP的测试机上进行运行时间的测试,在进入内核态查询页表项所对应的物理页框号时,例如调用一次DeviceIoControl函数大约需要58微妙,而将物理页框号填入页表项以进行映射时,例如,直接填写4字节内存数据,即一个物理页框号的数据重复1000次仅需要1微妙。所以,可以看到MappingTime<<IoControlTime。所以,由于在根据本发明实施例的内存映射方法中,显著减少了调用系统函数查询页表项对应的物理页框号的次数,可以显著减少在用户态和内核态之间切换所造成的时间延迟,从而实现高速内存映射。
在上述内存映射方法中,所述在用户态中查询所述第一线性地址空间对应的第一页表项的步骤具体包括:利用所述第一线性地址空间的分段索引规则计算出所述第一页表项线性地址;所述在用户态中查询所述第二线性地址空间对应的第二页表项的步骤具体包括:利用所述第二线性地址空间的分段索引规则计算出所述第二页表项线性地址。
图4是示出根据本发明实施例的线性地址空间的分段索引规则的示意图。本领域技术人员可以理解,根据如图4所示的32位线性地址-高11位索引页目录或者32位线性地址-高20位索引页表可以计算出线性地址所对应的页表项线性地址,这里为了简明的缘故便不再赘述。
在上述内存映射方法中,所述在内核态中查询所述第一页表项对应的第一物理页框号的步骤具体包括:调用系统函数查询第一页表项线性地址对应的物理页框号。
具体地说,在根据本发明实施例的内存映射方法中,通过用户态中线性地址空间的分段索引规则来计算出页表项在内核态中的线性地址。例如,当在用户态中分配对应于第一页表项的第二线性地址空间时,通过第一线性地址空间的分段索引规则计算出第一页表项在内核态中的线性地址,并且在用户态中分配与第一页表项在内核态中的线性地址相等大小的第二线性地址空间,以使得可以将第一页表项映射到第二线性地址空间中。而在分配了用于映射第一页表项的第二线性地址空间之后,则利用该第二线性地址空间的分段索引规则计算出第二页表项的线性地址,也将第一物理页框号填入该第二页表项的线性地址,从而完成第一页表项到第二线性地址空间的映射。此外,通过调用系统函数,例如如上所述的DeviceIoControl函数来查询第一页表项线性地址所对应的物理页框号。如上所述,在内核态中将物理页框号填入页表项的操作中,调用系统函数来查询物理页框号所需的时间远大于将物理页框号填入页表项所需的时间。因此,在根据本发明实施例的内存映射方法中,将第一页表项从内核态的线性地址空间映射到用户态中的线性地址空间时,并不是使得将物理页框号填入页表项的时间本身缩短,而是减少了在内核态中调用系统函数来查询页表项所对应的物理页框号所需的时间。
图5是示出根据本发明实施例的内存映射方法中地址空间分配的示意图。如图5中所示,在用户态中分配用于映射物理内存页的第一线性地址空间和用于映射第一线性地址空间所对应的第一页表项的第二线性地址空间。这里,由于在准备阶段过后的实际工作过程中,对第一线性地址空间进行循环利用以映射物理内存页,由此,优选地向第一线性地址空间分配较大的地址长度,从而满足物理内存页的映射的需要。在根据本发明实施例的内存映射方法中,一个物理内存页的大小通常为4K字节,因此需要根据实际映射的物理内存页的数目来设置较大的地址长度。而对于用于映射第一页表项的第二线性地址空间,因为其仅需要具有将接收的新的物理页框号数组填入其的容量,因此并不需要设置为具有很大的地址长度,在根据本发明实施例的内存映射方法中,如上所述,填入一个物理页框号需要4字节的空间大小。因此,在一个物理页框号对应于一个物理内存页的情况下,对于每个物理内存页,需要分配4K字节的第一线性地址空间,而仅需要分配4字节的第二线性地址空间即可。在实际过程中,可以将该第二线性地址空间设置为与在内核态中查询到的第一页表项的线性地址相同的地址长度。此外,因为用户态中映射第一页表项的线性地址空间的地址长度要小于用户态中映射物理内存页的线性地址空间的地址长度,因此相应地在内核态中,第一页表项的线性地址长度也会大于第二页表项的线性地址长度。本领域技术人员可以理解,在图5中,仅是示意性地示出了各个线性地址空间,而并不意在对于各个线性地址空间的地址长度进行任何定量的限制。
在上述内存映射方法中,所述将第一物理页框号填入所述第二页表项中的步骤之后进一步包括:当接收到新的物理页框号数组时,根据接收到的物理页框号数目在用户态第一线性地址空间中分配第三线性地址空间;在用户态中将所述新的物理页框号填入映射到所述第二线性地址空间的第一页表项中,以将新的物理内存页映射到所述第三线性地址空间中。
在根据本发明实施例的内存映射方法中,为了描述的方便,可以划分为准备阶段和工作阶段,如上所述,在准备阶段中,是将需要填入物理页框号的内核态中的第一页表项映射到用户态中的第二线性地址空间中,这样,在工作阶段中,当需要将物理页框号填入页表项已将物理内存页映射到线性地址空间时,就不需要再进入内核态中将物理页框号填入页表项,而仅需要将新的物理页框号填入到映射到的用户态中的第二线性地址空间的第一页表项中即可。这样,就将新接收到的物理内存页映射到了在准备阶段中在用户态中分配的第一线性地址空间中。并且,每次接收到新的物理页框号数组,都可以在预先分配的第一线性地址空间中分配用于映射该新的物理内存页的第三线性地址空间,从而实现物理内存页到线性地址空间的映射。
并且,例如,第一线性地址空间可在映射物理内存页时循环使用。具体地说,当在多次接收到物理页框号数组从而完成了多组物理内存页到线性地址空间的映射之后,第一线性地址空间中剩余的线性地址空间不足以映射接下来要接收到的物理内存页,此时可以释放首次接收到的第一组物理内存页所对应的第一线性地址空间,从而将该部分线性地址空间用于接下来要接收到的物理内存页。当将第一线性地址空间设置得足够大时,如果出现上述情况,则释放的第一线性地址空间将是很多次映射之前所占用的线性地址空间,可以基本保证用户已经通过该线性地址空间完成了对内存的访问,从而释放该段第一线性地址空间不大可能影响到用户当前对内存的及时和正确的访问。所以,在根据本发明实施例的内存映射方法中,将第一线性地址空间设置得越大,显然越能够保证用户对内存的及时和正确的访问,但同时不可避免地会出现部分线性地址空间闲置,从而造成存储空间的浪费。通过采取较小长度的线性地址空间的循环使用,可以保证存储空间的使用效率。因此,在根据本发明实施例的内存映射方法中,可以按照实际情况来决定第一线性地址空间的大小,本发明实施例并不意在对此进行任意限制。
在根据本发明实施例的内存映射方法中,物理页框号实际上是物理内存页的索引,每一个或一组物理内存页具有唯一的物理页框号,从而可以通过物理页框号找到具体的物理内存页。因此,物理页框号便代表着实际的物理内存页,可以将其看作是每个物理内存页的编号。如上所述,在每个物理内存页中,通常存储4K字节的内存数据,而该物理页框号本身占据4K字节,即32位,如图4所示的。在接收到新的需要映射的物理内存页时,因为通常不会是仅映射一个物理内存页,因此接收到的时物理页框号的数组,例如,物理页框号1-10,物理页框号10-20等等。
在将一组物理页框号填入了映射到第二线性地址空间的第一页表项,即将该组物理页框号的数据存储到第一页表项所对应的第二线性地址空间之后,便实际上将该组物理内存页映射到了在第一线性地址空间中为该组物理内存页分配的第三线性地址空间。这里,第三线性地址空间是根据接收到的物理页框号的数目确定的,如上所述,因为每个物理内存页通常存储4K字节的内存数据,因此如果接收到的物理页框号的数目是10,例如物理页框号1-10,则分配大小为40K字节大小的第三线性地址空间。并且,通过将该第三线性地址空间的起始线性地址返回给用户,用户便可以通过对该40K字节的第三线性地址空间的访问来实现及时和正确的对上述10个物理内存页的访问,即用户通过访问线性地址空间来实现对实际的物理内存的访问,从而实现高效的数据共享。
这样,通过根据本发明实施例的内存映射方法,可以使得在用户态中操作线性地址空间等效于在内核态操作页表项,而减少进入内核态查询页表项所对应的物理页框号的次数,从而减少在内核态和用户态之间的切换所造成的时间延迟。
并且,在根据本发明实施例的内存映射方法中,向操作系统进程工作集申请线性地址空间和释放线性地址空间都可以采用标准处理,且物理内存页的映射操作也可以自主完成,这使得系统的运行相对稳定。
根据本发明实施例的另一方面,提供了一种内存映射模块,用于将物理内存页映射到用户态中的线性地址空间,其中,通过将所述物理内存页的页框号填入所述线性地址空间对应的页表项来将物理内存页映射到线性地址空间,所述模块包括:第一分配单元,配置为在用户态中分配第一线性地址空间;第一查询单元,配置为在用户态中查询由所述第一分配单元分配的第一线性地址空间所对应的第一页表项;第二查询单元,配置为在内核态中查询与由所述第一查询单元查询的第一页表项对应的第一物理页框号;第二分配单元,配置为在用户态中分配与由所述第一分配单元分配的第一页表项对应的第二线性地址空间;第三查询单元,配置为在用户态中查询由所述第二分配单元分配的第二线性地址空间对应的第二页表项;以及第一映射单元,配置为在内核态中将由所述第二查询单元查询的第一物理页框号填入由所述第三查询单元查询的第二页表项中,以使得在用户态中操作第二线性地址空间等效于在内核态操作第一页表项。
图6是示出根据本发明实施例的内存映射模块的示意性框图。根据本发明实施例的内存映射模块100用于将物理内存页映射到用户态中的线性地址空间,其通过将物理内存页的页框号填入线性地址空间对应的页表项来将物理内存页映射到线性地址空间。如图6所示,该内存映射模块100包括:第一分配单元101,配置为在用户态中分配第一线性地址空间;第一查询单元102,与第一分配单元101连接,配置为在用户态中查询由第一分配单元101分配的第一线性地址空间所对应的第一页表项;第二查询单元103,与第一查询单元102连接,配置为在内核态中查询与由第一查询单元102查询的第一页表项对应的第一物理页框号;第二分配单元104,与第一分配单元101连接,配置为在用户态中分配与由第一分配单元101分配的第一页表项对应的第二线性地址空间;第三查询单元105,与第二分配单元104连接,配置为在用户态中查询由第二分配单元104分配的第二线性地址空间对应的第二页表项;以及第一映射单元106,与第二查询单元103和第三查询单元105连接,配置为在内核态中将由第二查询单元103查询的第一物理页框号填入由第三查询单元105查询的第二页表项中,以使得在用户态中操作第二线性地址空间等效于在内核态操作第一页表项。
在上述内存映射模块中,所述第一查询单元具体配置为:利用由所述第一分配单元分配的第一线性地址空间的分段索引规则计算出所述第一页表项线性地址;以及所述第三查询单元具体配置为:利用由所述第二分配单元分配的第二线性地址空间的分段索引规则计算出所述第二页表项线性地址。
在上述内存映射模块中,所述第二查询单元具体配置为:调用系统函数查询与由所述第一查询单元查询的第一页表项的线性地址对应的物理页框号。
在上述内存映射模块中,进一步包括:第三分配单元,配置为当接收到新的物理页框号数组时,根据接收到的物理页框号数目在用户态中由所述第一分配单元分配的第一线性地址空间中分配第三线性地址空间;以及第二映射单元,配置为在用户态中将所述新的物理页框号填入映射到所述第二线性地址空间的第一页表项中,以将新的物理内存页映射到所述第三线性地址空间中。
在上述内存映射模块中,在接收到多个物理页框号数组时,所述第一线性地址空间循环使用。
通过根据本发明实施例的内存映射方法和内存映射模块,可以仅进入内核态一次来查询页表项所对应的物理页框号,从而显著减少了将物理内存页映射到线性地址空间的时间,提高了物理内存的访问速度,实现了高效的数据共享。
本发明已经参考具体实施例进行了详细说明。然而,很明显,在不背离本发明的精神的情况下,本领域技术人员能够对实施例执行更改和替换。换句话说,本发明用说明的形式公开,而不是被限制地解释。要判断本发明的要旨,应该考虑所附的权利要求。