在Linux上模拟实现Windows堆管理的方法技术

技术编号:8655850 阅读:177 留言:0更新日期:2013-05-01 23:30
本发明专利技术为一种在Linux上模拟实现Windows堆管理的方法,应用程序初始化时,使用brk命令从Linux虚拟地址中开辟出一块连续空间用作类Windows虚存管理,然后构建数据结构,将应用程序的Windows操作行为转化为Linux操作的表达形式,在Linux上,不可增长堆和可增长堆通过将内存块以链表连接方式来模拟实现,不可增长堆要保留最大大小的空间。本发明专利技术方法在Linux上实现了堆的固定地址再分配功能,在不修改Linux内核的情况下,在Linux上重新构建Windows的内存管理机制,实现虚存管理和堆管理,以便使得Windows应用程序可以无缝迁移至Linux操作系统上运行。

【技术实现步骤摘要】

本专利技术属于应用软件跨平台迁移领域,具体是一种。
技术介绍
应用程序的运行不能直接访问底层的系统资源,它们对系统资源的访问都必须遵循操作系统所规定的方式,由此可见操作系统所扮演的重要角色。不同的操作系统由于立足点的不同,因此在设计思想上有着本质的区别,从而导致其在设计架构以及最终实现上所呈现的差异性。这些差异性具体反映在其所规定的系统资源访问方式上。因此基于某种特定操作系统开发的应用程序往往只能在这种特定的操作系统上运行。然而如果能让应用程序摆脱对操作系统的依赖,不论从应用程序提供商还是用户来说,这都是非常有意义的。目前已有的迁移技术大致分为两大类,一类是核内差异核内补,典型的例子是浙大网新提出的“龙井(Longene)”项目,其主要是通过将Linux内核扩充成一个既支持Linux应用也支持Windows应用的兼容内核,使得用户可以直接在Linux操作系统上运行Windows应用程序。对内核的修改并不适合商业化的Linux操作系统,理由是,Linux商业化过程中,为实现商业目的,或多或少对其中采用的Linux内核进行了修改,再次的改动很难避免与之前改动不发生冲突,亦或使得改动更为复杂,增加改动引入错误的风险,因此限制了它的适用范围;另一类是核内差异核外补,典型的例子是WINE项目,WINE通过WINE服务进程来虚拟Win32进程,而应用程序作为客户端进程,两者之间通过socket和pipe通道,连接相应的动态链接库Winelib,以协作运行。WINE项目实质上是通过操作指令的翻译/转换来弥补Windows和Linux之间的差异,然而两个操作系统在系统资源访问方式的实现上粒度是不一样的,因此操作指令的翻译/转换在很大范围内难以保持一致。这两种方式都有其一定局限性,需要尝试通过对机制的重新构建来解决应用程序跨平台迁移问题。内存管理是应用程序跨平台迁移中极为重要的一部分,因为几乎每一个应用程序都要涉及到内存操作。在Windows中,内存管理强调了虚存管理和堆管理的两层结构,而在Linux中却并没有突出这一点。并且Linux中不能通过其堆管理的系统调用实现Windows的“堆的固定地址再分配”的功能。因此用Linux的现有机制不能完全实现Windows的内存管理机制。
技术实现思路
本专利技术要解决的技术问题是如何在不修改Linux内核的情况下,在Linux上重新构建Windows的内存管理机制,实现虚存管理和堆管理。针对该问题,本专利技术提供了一种。本专利技术提供的一种,具体步骤如下步骤一应用程序初始化时,使用brk命令从Linux虚拟地址中开辟出一块大小为dwSize的连续空间,用作类Windows虚存管理,并记录该空间的起始地址,设置从起始地址开始每页的状态、每页的访问权限以及锁定状态;步骤二 构建数据结构,用于将用户需求的Windows操作行为转化为Linux操作的表达形式;步骤三对于堆操作,判断堆的类型,若为不可增长堆,转入步骤四;若为可增长堆,转入步骤五;在Linux上,不可增长堆和可增长堆通过将内存块以链表连接方式来模拟实现;步骤四堆保留最大大小的空间,提交初始大小的空间进行分配。当初始大小的空间消耗完时,转入步骤六;步骤五堆提交初始大小的空间进行分配,当初始大小的空间消耗完时,转入步骤七;步骤六堆从保留的空间中继续提交一段页面来满足分配需求,直到所保留的空间不能满足分配需求为止;步骤七系统通过VirtualAllocO另辟新的空间来满足分配需求,直到系统内存不能满足分配需求为止。步骤四和步骤五中进行空间按分配时,在Linux上实现了堆的固定地址再分配,步骤是步骤11 :获取指定的内存块的起始地址,标记该内存块为bl ;步骤12 :判断内存块bl是否满足再分配所需空间的大小,若不满足,转入步骤13 ;否则,转入步骤15;步骤13 :在堆中寻找空闲块,当寻找到一个空闲块时,进行步骤14 ;步骤14 :判断寻找到的所有空闲块与内存块bl的大小之和是否满足再分配所需空间的大小,若不满足,转入步骤13,继续寻找下一个空闲块;若满足,转入步骤15 ;步骤15 :合并内存块bl与所有寻找到的空闲块;步骤16 :分割出用于再分配的内存块,所分割的内存块的起始地址为内存块bl的起始地址。本专利技术的优点与积极效果在于(I)在应用程序初始化时从虚拟地址中开辟出一块连续的空间作为“类Windows虚存管理空间”,限定了应用程序的内存访问范围,与虚拟地址中其它空间之间不相互影响;(2)构建关键数据结构,用于Windows的操作行为转化为Linux的表达形式,以便使得Windows应用程序可以无缝迁移至Linux操作系统上运行;(3)在Linux上分别实现了 Windows的可增长堆管理和不可增长堆管理,实现了相应的堆创建、堆分配、堆销毁以及堆再分配等功能,以便使得Windows应用程序可以无缝迁移至Linux操作系统上运行;(4)解决了 Linux中不能通过堆管理的系统调用实现Windows的“堆的固定地址再分配”功能的问题;(5)本专利技术方法在Linux平台上模拟实现Windows的虚存管理和堆管理,在功能一致的基础上保证了原理一致,有效地满足了 Windows应用程序至Linux上源代码级的无缝迁移的要求。附图说明图1是本专利技术提供的的步骤流程图;图2是类Windows虚存管理实现的示意图;图3是为类Windows不可增长堆和可增长堆的管理实现示意图;图4是在Linux上实现堆的固定地址再分配的流程图。具体实施例方式下面将结合附图和实施例对本专利技术作进一步的详细说明。本专利技术提出了一种,用以在不修改Linux内核的前提下,实现对Windows虚存管理和堆管理的模拟,使得Windows应用程序可以无缝迁移至Linux操作系统上运行,扩大应用程序的适用范围。本专利技术方法包括两部分,第一部分是Windows虚存管理在Linux上的模拟实现。思路是在Linux虚拟地址中开辟出一块连续的空间作为“类Windows虚存管理”的范围。本专利技术方法在程序初始化时使用brk命令留出一大块新的空间,然后所有的虚存管理函数只在这片新空间上进行操作。第二部分是Windows堆管理在Linux上的模拟实现,堆管理的实现是建立在虚存管理之上的。思路是将内存块通过链表链接,对于Windows的不可增长堆,所有分配和未分配的页面都位于堆初始地址之后同一段连续的页面之中。堆提交初始大小空间,保留最大大小空间。随着堆空间的分配,当初始大小的提交页面用完后,堆继续提交一段页面来满足分配需求,直到保留页面不能满足分配需求。对于Windows的可增长堆,保留并提交初始大小的页面。当这些页面不能满足分配需求时,则通过虚存管理(使用VirtualAlloc)另寻一块空间来满足分配需求,直到系统内存不能满足分配需求。如图1所示,本专利技术提供的,具体实现步骤如下。步骤一应用程序初始化时,使用“brk”命令从Linux虚拟地址中专门开辟出一块大小为dwSize的连续空间,用作“类Windows虚存管理”。dwSize的值可根据需求灵活指定。在Windows中,进程的虚拟内存按照页大小来划分,每一页有空闲(free)、保留(reserved)和提交(committed)三种状态。空闲的本文档来自技高网
...

【技术保护点】
一种在Linux上模拟实现Windows堆管理的方法,其特征在于,包括如下步骤:步骤一:应用程序初始化时,使用brk命令从Linux虚拟地址中开辟出一块大小为dwSize的连续空间,用作类Windows虚存管理,并记录该空间的起始地址,设置从起始地址开始每页的状态、每页的访问权限以及锁定状态;步骤二:构建数据结构,将应用程序的Windows操作行为转化为Linux操作的表达形式;步骤三:对于堆操作,判断堆的类型,若为不可增长堆,转入步骤四;若为可增长堆,转入步骤五;Linux上不可增长堆和可增长堆通过将内存块以链表连接方式来模拟实现;步骤四:堆保留最大大小的空间,提交初始大小的空间进行分配,当初始大小的空间消耗完时,转入步骤六;步骤五:堆提交初始大小的空间进行分配,当初始大小的空间消耗完时,转入步骤七;步骤六:堆从保留的空间中继续提交一段页面来满足分配需求,直到所保留的空间不能满足分配需求为止;步骤七:系统通过VirtualAlloc()另辟新的空间来满足分配需求,直到系统内存不能满足分配需求为止;步骤四和步骤五中进行空间按分配时,在Linux上实现了堆的固定地址再分配,步骤是:步骤11:获取指定的内存块的起始地址,标记该内存块为a1;步骤12:判断内存块a1是否满足再分配所需空间的大小,若不满足,转入步骤13;否则,转入步骤15;步骤13:在堆中寻找空闲块,当寻找到一个空闲块时,进行步骤14;步骤14:判断寻找到的所有空闲块与内存块a1的大小之和是否满足再分配所需空间的大小,若不满足,转入步骤13,继续寻找下一个空闲块;若满足,转入步骤15;步骤15:合并内存块a1与所有寻找到的空闲块;步骤16:分割出用于再分配的内存块,所分割的内存块的起始地址为内存块a1的起始地址。...

【技术特征摘要】
1.一种在Linux上模拟实现Windows堆管理的方法,其特征在于,包括如下步骤: 步骤一:应用程序初始化时,使用brk命令从Linux虚拟地址中开辟出一块大小为dwSize的连续空间,用作类Windows虚存管理,并记录该空间的起始地址,设置从起始地址开始每页的状态、每页的访问权限以及锁定状态; 步骤二:构建数据结构,将应用程序的Windows操作行为转化为Linux操作的表达形式; 步骤三:对于堆操作,判断堆的类型,若为不可增长堆,转入步骤四;若为可增长堆,转入步骤五;Linux上不可增长堆和可增长堆通过将内存块以链表连接方式来模拟实现;步骤四:堆保留最大大小的空间,提交初始大小的空间进行分配,当初始大小的空间消耗完时,转入步骤六; 步骤五:堆提交初始大小的空间进行分配,当初始大小的空间消耗完时,转入步骤七;步骤六:堆从保留的空间中继续提交一段页面来满足分配需求,直到所保留的空间不能满足分配需求为止; 步骤七:系统通过VirtualAlloc O另辟新的空间来满足分配需求,直到系统内存不能满足分配需求为止; 步骤四和步骤五中进行空间按分配时,在Linux上实现了堆的固定地址再分配,步骤是: 步骤11:获取指定的内存块的起始地址,标记该内存块为al ; 步骤12:判断内存块al是否满足再分配所需空间的大小,若不满足,转入步骤13 ;否贝IJ,转入步骤15 ; 步骤13:在堆中寻找空闲块,当寻找到一个空闲块时,进行步骤14 ; 步骤14:判断寻找到的...

【专利技术属性】
技术研发人员:李睿杨南君吕江花马世龙
申请(专利权)人:北京航空航天大学
类型:发明
国别省市:

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

1