2024年6月12日发(作者:)
(19)中华人民共和国国家知识产权局
(12)发明专利说明书
(21)申请号 CN2.9
(22)申请日 2005.10.08
(71)申请人 浙江大学
地址 310027 浙江省杭州市西湖区浙大路38号
(72)发明人 陈纯 卜佳俊 周晨枫 柯化成 戚凌杰
(74)专利代理机构 杭州求是专利事务所有限公司
代理人 林怀禹
(51)
G06F12/08
G06F9/455
(10)申请公布号 CN 1746866 A
(43)申请公布日 2006.03.15
权利要求说明书 说明书 幅图
(54)发明名称
操作Linux内核页表加速模拟
PowerPC体系结构的方法
(57)摘要
本发明公开了一种操作Linux内核
页表加速模拟PowerPC体系结构的方法。
本发明方法通过截取对内核页表区域的读
写操作,并将其进行缓冲队列管理,充分
利用计算机科学中的时间,空间局部性的
原理,对频繁的内核页表读写进行控制,
提高系统cache命中率,弥补了PPCLinux
本身的缺憾,从而达到模拟效率的提高。
法律状态
法律状态公告日
法律状态信息
法律状态
权 利 要 求 说 明 书
1一种操作Linux内核页表加速模拟PowerPC体系结构的方法,其特征在于:
1)针对Linux操作系统,从硬件的角度来管理PowerPC软页表的部分模拟技术;
2)首先进入地址监控模块,对操作系统的读写请求地址进行监控分发;当虚拟机侦
测到对操作系统内核页表所在物理地址的读写操作,则进入相应的管理模块,否则
按一般的读写操作对待;
3)其次组织关于内核页表所在物理页的数据,根据读写请求的地址来判断其操作目
标页是一级页表或是二级页表,从而进行具体的读写模块的操作;
4)然后处理对内核页表的读和写操作;
处理读操作时,当所访问的页为脏时,将该页写操作队列中的请求完成;当读缓冲
中含有所需的数据时,直接返回,否则进行被模拟操作系统的访存操作;
处理写操作时,对内核页表页的写操作采取延后策略,即对每个页表所在页维持一
个写请求队列,当对应页的写请求到来时,首先将该页标志为脏页,然后将此请求
加入该队列;
6)内核页表所在物理页的监控模块,该模块相当一个守护进程,主要有两个作用:
首先,每隔一段时间,对达到一定长度的内核页表页的写请求队列进行刷新;其次,
由于操作系统会频繁的对内核页表页进行开辟和释放的操作,为了保证和虚拟机维
护的页表页缓冲达到数据的一致,每隔一定时间,对一级页表进行监测,当某一项
由0变为非0时,二级页表则增加了一页,这时就相应的增加一个缓冲让虚拟机来
维护,反之则去调一个缓冲,从而减少主机的内存资源占用。
说 明 书
技术领域
本发明涉及计算机虚拟技术,特别是涉及一种操作Linux内核页表加速模拟
PowerPC体系结构的方法。
背景技术
随着嵌入式设备普及,例如个人数字助手(PDA),手机等,基于便携移动设备的应
用大量涌现。而嵌入式设备上的应用程序一般都在与目标平台异构的机器环境下开
发,而且嵌入式设备又非常的昂贵,因此采用软件仿真模拟是一种必要的手段。
计算机系统模拟器技术是在某种架构的计算机中通过模拟目标架构计算机的硬件特
征和其指令执行的过程,从而实现在一台计算机上虚拟出多台计算机的技术。流行
的计算机系统模拟器例如:Bochs,可以在多种体系结构的机器上模拟多台
Intel 80×86体系的计算机,并运行Linux、freebsd等操作系统的Intel80×86版本;
armulator,可以在Intel 80×86体系结构的机器上模拟ARM体系的计算机,并运行
ucLinux的ARM移植版本等。
为了在模拟器上高效的运行操作系统,传统的全系统模拟有一定的局限性,为了突
破瓶颈,必然要采用部分虚拟技术,即从硬件的角度看,他知道运行其上的是那种
操作系统,并知晓这种操作系统的一些特性和细节,从而进行优化管理,达到提高
运行效率的目的。
PowerPC体系结构与传统的X86体系结构不同的一点是其采取的是虚页表,即硬
件并不知道页表的格式,更不会去操作页表,。硬件只知道TLB的存在,而通过
访问页表进行TLB的更新全部是软件行为。
操作系统访问页表是一个特别频繁的过程,而对与Linux操作系统,内核页表更是
频繁被访问,因为所有进程进入内核态都采用同一个页表,因此采用传统的模拟方
法必然会导致模拟效率的低下。
发明内容
本发明的目的在于提供一种操作Linux内核页表加速模拟PowerPC体系结构的方
法,从硬件的角度对其进行管理和优化访问必然会提高模拟的效率。
本发明采用的技术方案其步骤如下:
1)针对Linux操作系统,从硬件的角度来管理PowerPC软页表的部分模拟技术;
2)首先进入地址监控模块,对操作系统的读写请求地址进行监控分发;当虚拟机侦
测到对操作系统内核页表所在物理地址的读写操作,则进入相应的管理模块,否则
按一般的读写操作对待;
3)其次组织关于内核页表所在物理页的数据,根据读写请求的地址来判断其操作目
标页是一级页表或是二级页表,从而进行具体的读写模块的操作;
4)然后处理对内核页表的读和写操作;
处理读操作时,当所访问的页为脏时,将该页写操作队列中的请求完成;当读缓冲
中含有所需的数据时,直接返回,否则进行被模拟操作系统的访存操作;
处理写操作时,对内核页表页的写操作采取延后策略,即对每个页表所在页维持一
个写请求队列,当对应页的写请求到来时,首先将该页标志为脏页,然后将此请求
加入该队列;
6)内核页表所在物理页的监控模块,该模块相当一个守护进程,主要有两个作用:
首先,每隔一段时间,对达到一定长度的内核页表页的写请求队列进行刷新;其次,
由于操作系统会频繁的对内核页表页进行开辟和释放的操作,为了保证和虚拟机维
护的页表页缓冲达到数据的一致,每隔一定时间,对一级页表进行监测,当某一项
由0变为非0时,二级页表则增加了一页,这时就相应的增加一个缓冲让虚拟机来
维护,反之则去调一个缓冲,从而减少主机的内存资源占用。
本发明与背景技术相比,具有的有益的效果是:首先在于从硬件的角度对软件掌控
的资源进行管理和优化,充分利用计算机科学中的时间,空间局部性的原理,对频
繁的内核页表读写进行控制,提高系统cache命中率,弥补了PPCLinux本身的缺
憾,从而达到模拟效率的提高;其次,并不需要修改操作系统源代码,具有充分的
移植性和高度的可易用性。
附图说明
附图是发明的操作流程图。
具体实施方式 在某PowerPC的模拟器中,已经实现了指令的解释执行以及对MMU的模拟,并 准备运行PPCLinux-2.4.25。 1)首先进入地址监控模块(如附图所示),对操作系统的读写请求地址进行监控分发; 当操作系统的访存请求到来时,首先根据地址确定是否是对Linux内核空间的访问, 即访问地址要大于PAGE_OFFSET,往往是3G,因为内核页表以及普通进程的页 表都是存储在内核空间的。如果经检测访问属于内核空间,则进行进一步的地址检 测,否则将其视为一般的读写请求;接下来进一步根据地址判断是否是对页表的访 问[address_dispatch()],由于内核的global pagetable是静态定义在数据段中的(声明 在asm-ppc/pgtable.h:extern pgd_tswapper_pg_dir[PTRS_PER_PGD]),其起始地址 可从通过命令”grepswapper_pg_dir ”得到,而二级页表的地 址在一级页表的表项中,即起始地址后的每四个字节的值即一个二级页表的起始值, 从pgd_offset()得到。当虚拟机侦测到对操作系统内核页表所在物理地址的读写操 作,则进入相应的管理模块,否则按一般的读写操作对待。 2)其次组织关于内核页表所在物理页的数据,根据读写请求的地址来判断其操作目 标页是一级页表或是二级页表,从而进行具体的读写模块的操作;PPCLinux的一 级页表占两张物理页,共8K,一共有2048项即一级和二级页表最多占2048+2= 2050页,即维护一个含2050项的静态数据,每项是对应页读写缓冲的数据结构的 指针。当读写地址大于swapper_pg_dir并且小于swapper_pg_dir+8k时,是对一级 页表的访问,否则是对二级页表的访问,然后轮询一级页表的每个非零表项,从而 确定访问的具体是哪一张二级页表。根据读写地址便可分发到对应页的缓冲,进行 读写操作[handle_pgt_read(),handle_pgt_write()]。 3)处理读请求时,当所访问的页为脏,即其dirty_flag=true时,将该页写操作队列 中的请求完成[flush_write_queue()],即将先前写请求数据刷新到虚拟机系统的对应 内存区域中;当读缓冲中含有所需的数据时,直接将该值返回,否则进行被模拟操 作系统的访存操作,并将访存返回后的数据存储在维护该页表的缓冲区中; 4)处理写请求时,采取的是延后写操作策略。首先将该页标志为脏页,即置该页的 dirty_flag=true,然后将此请求加入该页写请求队列[addto_write_queue()],并未真 正的对虚拟机系统的对应内存区进行写更新操作。 5)同时,还有一个对页表页进行监控的守护进程在工作,每隔一段时间(2分钟左右, 过长导致内存数据一致性较差,过短又加重系统负荷),对达到一定长度(80~100 请求数)的内核页表页的写请求队列进行刷新[flush_write_queue()];其次,由于操 作系统会频繁的对内核页表页进行开辟和释放的操作,为了保证和虚拟机维护的页 表页缓冲达到数据的一致,每隔一定时间(5~8分钟),对一级页表进行监测,当某 一项由0变为非0时,二级页表则增加了一页,这时就相应的增加一个缓冲 [add_page_buffer()]让虚拟机来维护,反之则去调[del_page_buffer()]一个缓冲,从而 减少主机的内存资源占用。


发布评论