发明名称 在Linux上模拟实现Windows堆管理的方法
摘要 本发明为一种在Linux上模拟实现Windows堆管理的方法,应用程序初始化时,使用brk命令从Linux虚拟地址中开辟出一块连续空间用作类Windows虚存管理,然后构建数据结构,将应用程序的Windows操作行为转化为Linux操作的表达形式,在Linux上,不可增长堆和可增长堆通过将内存块以链表连接方式来模拟实现,不可增长堆要保留最大大小的空间。本发明方法在Linux上实现了堆的固定地址再分配功能,在不修改Linux内核的情况下,在Linux上重新构建Windows的内存管理机制,实现虚存管理和堆管理,以便使得Windows应用程序可以无缝迁移至Linux操作系统上运行。
申请公布号 CN103077076B 申请公布日期 2015.10.28
申请号 CN201310003729.X 申请日期 2013.01.06
申请人 北京航空航天大学 发明人 李睿;杨南君;吕江花;马世龙
分类号 G06F9/46(2006.01)I 主分类号 G06F9/46(2006.01)I
代理机构 北京永创新实专利事务所 11121 代理人 周长琪
主权项 一种在Linux上模拟实现Windows堆管理的方法,其特征在于,包括如下步骤:步骤一:应用程序初始化时,使用brk命令从Linux虚拟地址中开辟出一块大小为dwSize的连续空间,用作类Windows虚存管理,并记录该空间的起始地址,设置从起始地址开始每页的状态、每页的访问权限以及锁定状态;brk命令的功能是改变数据段空间分配;dwSize表示所要开辟的连续空间的大小;步骤二:构建数据结构,将应用程序的Windows操作行为转化为Linux操作的表达形式;步骤三:对于堆操作,判断堆的类型,若为不可增长堆,转入步骤四;若为可增长堆,转入步骤五;Linux上不可增长堆和可增长堆通过将内存块以链表连接方式来模拟实现;步骤四:堆保留最大大小的空间,提交初始大小的空间进行分配,当初始大小的空间消耗完时,转入步骤六;步骤五:堆提交初始大小的空间进行分配,当初始大小的空间消耗完时,转入步骤七;步骤六:堆从保留的空间中继续提交一段页面来满足分配需求,直到所保留的空间不能满足分配需求为止;步骤七:系统通过VirtualAlloc()另辟新的空间来满足分配需求,直到系统内存不能满足分配需求为止;VirtualAlloc()为Windows API函数,功能是在调用进程的虚地址空间,预定或者提交一部分页;步骤四和步骤五中进行空间按分配时,在Linux上实现了堆的固定地址再分配,步骤是:步骤11:获取指定的内存块的起始地址,标记该内存块为a1;步骤12:判断内存块a1是否满足再分配所需空间的大小,若不满足,转入步骤13;否则,转入步骤15;步骤13:在堆中寻找空闲块,当寻找到一个空闲块时,进行步骤14;步骤14:判断寻找到的所有空闲块与内存块a1的大小之和是否满足再分配所需空间的大小,若不满足,转入步骤13,继续寻找下一个空闲块;若满足,转入步骤15;步骤15:合并内存块a1与所有寻找到的空闲块;步骤16:分割出用于再分配的内存块,所分割的内存块的起始地址为内存块a1的起始地址。
地址 100191 北京市海淀区学院路37号