1006大设计翻译版虚拟机共享内存擦除技术分析与实现_第1页
1006大设计翻译版虚拟机共享内存擦除技术分析与实现_第2页
1006大设计翻译版虚拟机共享内存擦除技术分析与实现_第3页
1006大设计翻译版虚拟机共享内存擦除技术分析与实现_第4页
1006大设计翻译版虚拟机共享内存擦除技术分析与实现_第5页
免费预览已结束,剩余44页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

虚拟机共享内存擦除技 指导教师:肖利信息,从而对整个虚拟机系统的安全性产生一定的影响。KVM是现在广泛使用的虚拟机器。它作为Linux内核的模块进行加载,因此KVM虚拟机的内存管理由Linux内核的内存管理模块实我们Linux内核的内存管理模块进行研究,由此了解KVM虚拟机内存管理的机制。分析和研究了Linux内存管理的机制。首先从用户进程的管理入手,分析和研期,分析和研究Linux内存在这个过分配和回收的机制。最后,从地址机制、请求分页机制和页框回收机制三个方面对Linux内存管理的机制进行总结。LinuxLinux内核对进程进行内存分配和的内存擦除方案,有效避免信息的情况发生。creating,loadingprogram,runningandexiting.Then,followingthelifecycleofauserprocess,IyzeandresearchtheLinuxmemoryallocationandreclamationmechanismsinthisprocess.Finally,IsummarizeLinuxmemorymanagementmechanismfromthreeaspectsofaddressmapmechanism,demandpagedemandingmechanismandpageframereclamationmechanisms.(2)Accordingtotheresearchabove,IthestudyofthetimewhenLinuxkernelallocatepagestouserprocessandreclaimpagesfromuserprocess.Then,Iyzetherisksofinformationdisclosureinthesetimepoints.Finally,Idevelopaspecificmemoryerasuremethodtoeffectivelyavoidinformationdisclosure.:Virtualmachine,memorymanagement,sharedmemory,memory绪 课题背景及意 国内外研究状 虚拟机安全虚拟机安全的防御方 尚存问 课题研究内 分析和研究Linux内存管理机 研究共享内存擦除方 构 相关技术简 KVM原理简 KVM简 KVM内存虚拟 Linux操作系统简 ELF可执行文 ELF可执行文件简 ELF可执行文件格 SourceInsight软 本章小 Linux内存管理机制的分 Linux虚拟内存的实现结 地址机 进程地址空间描述 进程的地址空 请求分页机 缺页中断的处 请求页面分 请求页面换 页框的回 LRU链 PFRA具体实 进程的生命周 本章小 共享内存擦除方案的设计与实 共享内存擦除方案的设 内存分配的时间 共享内存擦除方案的实 共享内存擦除方案的验 本章小 结 工作总 展 致 参考文 虚拟化技术最早于20世纪60年代,是计算领域的一项传统技术。最早的虚拟化技术可以追溯到六十年代中期,IBM的开发了M44/44x项目。其目的虚拟内存和多线程编程来实现。几乎是同时,IBMVM/370[1]的操作系术的特性解决了此类问题,但是需要对其安全性做进一步研究。VMM的外部的目前针对VMM的外部主要有两种,一种是基于VM的Rootkit,另一种(1)VMBR[3]者利用Rootkit隐藏自己的踪迹通过保留root权限留下后门的程序集。么所有虚拟机系统都将在者的控制范围之内。目前比较出名的VMBR有Bluepill、Subvirt和virtriol等。(2)代码[4]者可以利用方法,虚拟机系统的管理技术大多是用HTTP/HTTPs来连接控制的,因此,VMM必须运行服务器来接受HTTP连接。那么者就可以利用HTTP的来进行代码的。VM对00具有管理其他VM的,VM到 0的体现在guest-to-host的来获取host的,而VMescape[5]就是这种模式的。VM通过应用程序,过VMM的而直接0,从而获取0的,而一旦获取到0的控制权后,就可以控制所有VM。这些是利用所发现的bug来实施的。另外,VM还可以利用共享内存通信方式对VMM进行分析。VM备份、快照及还原在虚拟机中,VMM提供了备份、快照和还原的功能,一旦系统了,可以通过这种机制使得VMs容易受到新的,因为许多安全是依赖于线性时间的,重新以前的系统状态会这些协议;DMA在虚拟中有一种数据传输不受VMM控制,这就是DMA传输。VM通过0毒文件等传入没有安全防范的目标机中,从而达到的目的。虚拟机安全的防御方针对VMBR的防CPU周期会比TPM[6]VMM的保护,通过启动过程的完整监测,可以防止坏VMM完整性的。针对网络的防针对虚拟机系统中存在的网络方面的Lakshmi[7]等人提出了一种新的I/O虚拟行通信,然后通过VMM监视每个VM的数据流,在防御诸如DMA的无控制和DoS等的同时,也可以提高网络性能。可信Perez[8]TPMTPMVM的可靠性。而Ruan[9]等人设计了一个一般的可信虚拟平台架构P,将控制域分为管理、、OS成员、通信五个域,每个域都完成相应的功能,从而达到了安全、负内存中的信息的。,由于物理机内存数量有限的制约,VMMGuestOS、GuestOSGuestOS之配和回收的机制。最后,从地址机制、请求分页机制和页框回收机制三个方面对Linux内存管理的机制进行总结。依据上述Linux内存管理机制的分析,研究Linux内核对进程进行内存分配和回收第一章绪论。介绍了虚拟化技术的发展历程,概括了在虚拟机安 方面的第二章相关技术简介。对本文工作中所涉及的相关技术和工具进行了简要介绍。第三章Linux内存管理机制分析。详细分析了Linux内存管理的机制,分别在地址第四章共享内存擦除方案的设计与实现。分析共享内存产生信息的位置和时KVM的基本工作原理,从整体上对虚拟机的运行机制进行阐述。其中KVMKVM在虚拟机内存管理方面主要负责的Linux内存管理机制进行的,因此在本章简要方便读者对后面章节中载入可执行文件时地址部分的理解。最后介绍了Linux内核代码查看工具SourceInsight。KVM的架构如图2.1所示[11]。KVM采用的是基于InVT技术的硬件模拟化方KVM虚拟虚拟机虚拟机Linux应用应用底层硬2.1KVMLinux设计之初没有针对虚拟化的支持,KVMLinux内核法认Linux已经是一Hypervisor,因此,KVMHypervisor模型。而KVM项目的发起人和人也倾向于认为KVM是Hypervisor模型。KVM的宿主操作系统必须是Linux,支持的客户操作系统包括Linux、Windows、不能运行在老式CPU上,新CPU如果不支持虚拟化扩展,也不能运行。功能。此外,作为开源软件,KVM的移植性也非常好。KVM引入一层新的地址空间,即客户机物理地址空间(GPA),这个地址空间并不是真的宿主机地址区间,如图2.2所示:2.2物理地址转换成宿主机虚拟地址(HVA,为此,KVMkvm_memory_slot数据(GFN址之间的转换,也即GPA到HPA的转换。要KVM介入,并由软件进行多次地址转换,其效率是非常低的。因此,为了提高GVA到HPA转换的效率,KVM提供了基于纯软件的实现方式,也即通过页表来实现客户由于宿主机MMU不能直接装载客户机的页表来进行内存,所以当客户机而通过页表,则可以实现客户机虚拟地址到宿主机物理地址的直接转换,如图2.32.3为客户机中的每个进程页表都要一套相应的页表。在客户机内存时,真正TLBCPU和缓存上缓存的是来自页表项与之相对应,如图2.4所示。页页项 页页 页项页页图2.4客户机页表和页页为了快速检索客户机页表所对应的的页表,KVM为每个客户机都了一个 和页表。在检索哈希表时,KVM把客 和页表的客户机物理地址低10位作为键值进行索引,根据其键值定位到对 和页表,说明KVM还没有为其建立,于是KVM就为其分配新的物理页并 当客户机切换进程时,客户机操作系统会把待切换进程的页表基址载入CR3,而KVM3.页表异常处理机异常是由客户机页表和页表不一致引起的异常。当缺页异常发生时,KVM首先截获该异常,然后对发生异常的客户机虚拟地址在异常的原因,进行相应的处理。如果该异常是由客户机本身引起的,KVM则直接把该页表数据结构,填充宿主机物理地址到页表的页表项,还要根据客户机页表项LinuxLinux是一套免费使用和自由的类Unix操作系统是一个基于POSIX和UNIXCPUUNIX工具软件、应用程序和网络协议。它3264位硬件。Linux继承Unix以网络为Linux操作系统诞生于1991年10月5(这是第一次正式向外的时间LinuxLinuxLinux内核。Linux可安装在各种计算ELFELFELF可执行文件是一种用于二进制文件和可执行文件的标准文件格式。它是UNIX系统(USL)作为应用程序二进制接口(ApplicationBinaryInterface,ABI)而开发和发布的,也是Linux的主要可执行文件格式。199986openx86架构上的类Unix操作系统的二进制文件标准格式,用来取代COFF。因其可扩展性与灵活性,ELF程的虚拟内存,另外文件中还包含有对内存布局的定义以及起始执行指令的位置。ELF2.5文件程序节头表…节头表程序段…程序段2.5ELF文件头:ELFELF文件结构,其信息大载相关信息包括:程序装入后开始执行的位置,程序头表偏移量,ELF头部长度等。SourceInsightSourceInsight是一个面向项目开发的程序编辑器和代码浏览器,它拥有内置的对C/C++C#Java等程序的分析。SourceInsight能分析你的源代码并在你工作的同时trees。SourceInsight提供了最快速的对源代码的导航和任何程序编辑器的源信息。KVM的虚拟机,因此在本章开头我们首先介绍了KVMKVM虚拟机的系统中ELF可执行文件的相关内容。最后介绍了Linux内核代码查看工具SourceInsight。LinuxKVMKVMLinuxLinux内核的一个可载入的模块。KVM本身并没有实现此可知,KVMLinux内核的内存管理机制实现的。我们的研究。接下来本章将对Linux内存的管理机制进行深入分析。Linux操作系统采用虚拟内存技术管理用户进程内存,因此所有进程之间以虚拟内Linux操作系统之所以要在进程地址空间内引入内存区域概念的原因是,每个进程可执行文件代码的内存可执行文件中已初始化的全局变量的内存可执行文件中未初始化的全局变量的内存用于进程用户空间栈的内存内存文件的内存。Linux对虚拟内存实现的总体结构[13]3.1系系统调用接结构特定模3.1Linux(mmap:地址到物理地址。(swap(core地址机Linux采用虚拟内存机制,从而使得每个进程都有属于自己的虚拟地址空间,这种空间依靠Linux系统到物理内存和磁盘文件。间有关的全部信息,vm_area_struct描述了虚拟地址空间中的一个内存区域有关的全部<linux/sched.h>mm_struct结构的描述如表3.1所示表3.1mm_struct描述符字段类字说structvm_area_struct地址空间中所有VMA存放VMA的structvm_area_struct存放最近用到的pgd_t全 struct用来所有的mm_strcut结unsignedstart_code,unsighedstart_data,unsignedstart_brk,unsignedarg_start,unsignedenv_start,unsignedunsignedvm_area_struct结构描述了进程地址空间的一个内存区域。内存将每个内存区域作为一个单独的内存对象来管理,每个内存区域都拥有同样的属性和操作。Linux在内存区域管理中采用了面向对象的方法,使得vm_area_struct结构体可以描述多种类型的内<linux/mm.h>vm_struct3.2表3.2vm_area_struct描述符字段类字说structmm_struct内存区域所属的unsignedunsignedstructvm_area_struct用来所有vm_area_struct结用于红-­­黑树structvm_area_struct用来文件内存区域的结structvm_area_structstructunsighedstructfile指向被的文unsignedvm_ar_trut由双向链表连接起来,每一个结构描述一个地址空间区域。之所以建立虚拟地空间区是因为个虚拟址间区域对象不,有的可文件,有的共享库,有的动态分配的内存区,并且根据对象的不同vm_op中vm_ops包含三个操作函数指针,分别为open()、close()和nopage()。系统会调用open()和cose()建立和删除一个内存区域。当系统进行缺页处理时,do_no_page函数可能会用nopage()函数来建立虚拟地址和物理地址的关系。大多数被的文件都会使用generic_file_vm_ops中的fiemap_nopage()函数来定位用来所需数据页面在高速缓存的位置,或从磁盘中所需数据。80x86架构的计算机为例,linux4G0~3G为的地址空间中。内核会将可执行文件中的代码段、数据段、bss段、堆和栈到用空间中。其具体位置如图3.2所内核命令行参数和栈动态堆3.2地址空间

当可执行文件到进程的地址空间时,将产生一组vm_area_struct结构来描述内存区间的起始位置和终止位置,每个vm_area_struct结构代表可执行文件的一部分,可来实现的。随着vm_area_struct结构的生成,这些结构所描述的内存区间上的标准操作函数也由Linux初始化。但要明确在这一步还没有建立从虚拟内存到物理内存的, 建立地址的关键函数为do_mmap(),下面对do_mmap()函数作详细的分析。首先检查区域的大小不会超过地址空间的总大小。然后调用do_mmap_pgoff()函数do_mmap_pgoff()函数的实现机制,函数调用图如图3.3图否被设置需要mmap的字节数必须大于0;保证的区域在用户空间部分;不会超过文件可能的最大大小;数量不超过最大值max_map_count。然后调用get_unmapped_area()函数获得一个为区域的起始地址。由于Lnux系统分配内存以页为单位进行分配。返回值必须是页长度的整数倍,否则返回错误信息。如果file结构指针不为0,则为文件的内存,需要根据是否可以共享检验文件权限如果内存为共享可写的则检查文件以可写方式打开,而不是以追加方式如果内存为私有的则检查文件是否以可读方式打开。否则file结构指针为0,则仅建立虚拟区域,不建立内存,修正标志位使调用函数find_vma_prepare()扫描所有vm_area_struct成的树,找到结do_munmap()函数移除找到的旧区域,因为新区域会覆盖这部分旧区域,如是非共享的,则调用vma_merge()函数将这两个虚拟区域合并,然后跳转到out调用Slab分配函数kmem_cache_alloc函数为新的虚拟区域分配一个 结构。然后对该结构的各个域进行填如果是文件被,首先检验该区域是否可扩展,但文件区域不可扩展。vm_filefile共享计数mmap()函数,也就是generic_file_mmap()函数。如果是,则由shmem_zero_setup()来创建。generic_file_mmap()filemap_nopage()函数作为其之后需要使用的nopage()函数,获取被文件的address_space,获取该address_space的inode更新mm_struct中的vma计数。检查该虚拟区域是否加锁,如果加锁则说明准备该区域,则调用make_pages_present()函数,建立虚拟页面到物理页面的。最后do_mmap()函数返回addrLinux利用请求调页机制来节约内存的使用,它仅仅把当前正在执行的程序要使用不会重新父进程的内存数据给程,程相应的虚拟地址区域是可写的,此时数的实现机制,函数调用图如图3.4所示。图3.4do_page_fault函数调do_page_fault对于引起异常的地址有两种情况:一种由编程错误产生的错误地址,物理页产生的异常地址,这部分的处理由good_area部分代码处理,下面将做详细从cr2寄存器中引起异常的地址,设置当前进调用find_vma函数查找与异常地址最近的vma区域。如果不存在vma则跳转bad_area部分处理;如果vma的起始地址在该地址前面,则说明是未物理页引good_areavmaexpand_stack()good_area部分,首先检查这个vma的读写权限与引起错误的类型是否匹配,如果匹配则调用handle_mm_fault()函数为进程分配物理页并建立。handle_mm_fault函数的实现机制,handle_mm_fault图3.5handle_mm_fault函数调检查address的页中 和页表是否存在调用pgd_offset()函数计算出address所在页的 中 项指针。调 ,调用pte_alloc分配新的页表调用handle_pte_fault()图3.6所示图3.6handle_pte_fault函数调检查PTE判断页是否在主存中,如果不存在进入步骤24。如果没有被填充过说明该页从未过,调用do_no_page()函数分配一个新的物理页并建立。针对该页不同的方式,将有两种装入所缺页的方法,do_no_page()函数分析中进行。如果该页之前过但不存在于内存中说明该页被交换到后援磁盘空间中,因此调用do_swap_page()函数将该缺页从后援磁盘空间中回来。do_wp_page()函数进行处理。函数返行。如果VMA的vm_ops提供了nopage()函数,说明这是一个文件页,由vm_ops->nopage()函数负责处理;否则,调用do_anonymous_page()进行页处理。do_no_page()的实现机制,do_no_page()37图3.7do_nopage()函数调检查vm_ops有没有提供no_page()函数,如果没有提供no_page(),程序继续进行;如果提供了no_page()则说明该页为非,进3对于,调 do_anonymous_page()函数进行处理充为0的页。这样做的原因是,由于页没有到任何文件中,因此这部没有意义的,给它一个全部为0的页比给它一个其它信息的页更安全。对lru_cache_add()将页面加入到LRU链表中,这样对于非,vma->vm_ops->nopage指向的回调函数,这个回调函数在可执行文件刚开始载入时,由建立虚拟地址空间区域到磁盘文件时设置,该函数为file_nopage()函数,负责从页面高速缓存或着磁盘中所缺页面。的实现机制,file_nopage() structfile,address_space,inode进入retry_all区域:调用page_hash()函数获得该磁盘文件时使用的页面高速缓存队形的hash表。retry_find区域:调用find_get_page()调用Page_Uptodate()函数检查页面是否是如果不是,跳转page_not_upate区域,进行步骤15;如果是程序继进入success区域:调用nopage_sequential_readhead()函数对文件进行预读。起始位置和终止位置。然后循环调用read_cluster_noblocking()函数,调度下一个预读窗口读入页面。read_cluster_noblocking()函数进一步循环调用page_cache_read()read_cluster_noblocking()函数继续执行,最后调用run_task_queue()I/O操调用mark_page_accessed()标记页面为已,该页会被移到active_list调用flush_page_to_ram()将该物理页面加入到进程页表中,函数返回该no_cached_page区域13。调用page_cache_read读入缺少页面。page_cache_read函数首先调用用map->readpage()函数从的文件中读入所缺的页,最后函数返回。跳转上述retry_find区域进入步骤3检查保证刚才的页面在高速缓存中page_not_update区域调用map的readpage()函数从磁盘中所需的文件数据,并产生一个判断的页面是否是的。如果是,该页面是的,跳转success区域,执行步骤7.;否则函数继续执行。明该页由页面换出程序换入到了后援器的交换区中或尚存在页面高速缓存区中,需do_swap_page()函数的执行机制,do_swap_page()函数的函数调用关系如图3.9所示。图3.9do_swap_page函数调用关调用pte_to_swp_entry()调用lookup_swap_cache()函数在交换高速缓存中查找该如果该页面不在高速缓存中,则调用swapin_readhead()从后援器中读入该swapin_readhead()读入请求页以后及其后的一些页到交换read_swap_cache_async()函数查找交换高速缓存,并从高速缓存中该页。inux内核采(PFRAPFRA目标是获得物理页并使之空闲。PFRA按照页框所包含的内容,以不同的方表3.3PFRA处理的页框类型说用户态地址空间的用户态地址空间的在必要时与磁盘镜像同步这些页物理内存以满足这种内存请求,这时候,操作系统就必须尽快进行页面回收操LRULRU属于进程用户态地址空间或者页高速缓存的所有页被分成两组:活动链表(tve链表)和非活动链表(inative链表。每个内存区域one描述符的tiv_lit和inatv_itrieriieru_lock为自旋锁。那些经常被的处于活跃状态的页面会被放在tive链表上,而那些虽然可能关联到一个或者多个进程,但是并不经常使用的页inative的活跃程度来判断应该把页面放到哪个链表上。页面可能会从tive链表上被转移到inativeinativetive链表上,但是,这种转移并不是每次页都发生,面的这转发生的间隔可能比长。那最近最少inative链表的尾部。进行页面回收的时候,inux操作系统会从inative链表的尾部开始进行回收。Linux引入了两个页面标志符PG_active和PG_referenced用于标识页面的活跃程度,从而决定如何在两个链表之间移动页面。PG_active用于表示页面当前是否是活跃的,如果该位被置位,则表示该页面是活跃的。PG_referenced用于表示页面最近是否被过,每次页面被,该位都会被置位。Linux必须同时使用这两个标志符来LinuxLinux中使用两个标志符mark_page_accessed():当一个页面被时,则调用该函数相应地修 PG_referencedPG_referencedPG_referenced位被置位,但是在一定时间内该页面没有被再次,那么该页面的PG_referenced位会被清除。activate_page()activeshrink_active_list():该函数将页面移动到inactive链表上去须遵照几条试探法则。PFRA的基本函数调用关系如图3.1所示: 定期回图3. 上文提到Linux中页面回收主要是通过两种方式触发的,一种是由“内存严重不到内存不足,就会触发页面回收操作。对于第一种情况,系统会调用函数try_to_free_pages()去检查当前内存区域中的页面,回收那些最不常用的页面。对于第二种情况,函数balance_pgdat()是函数。当内存区域空闲页低于一定值时,调用函数try_to_free_pages()的时候,该函数会反复调用shrink_zones()以及shrink_slab()释放一定数目的页默认值是32个页面。如果在特定的循环次数内没有能够成功释放32个页面,那么页面回收会调用OOMkiller选择并杀死一个进程,然后释放它占用的所有页面。函数shrink_zones()会对内存区域列表中的所有区域分别调用shrink_zone()函数,后者是从内存回收最近最少使用页面的函数。对于定期页面检查并进行回收的函数balance_pgdat()来说,它主要调用的函数是shrink_zone()和shrink_slab()。从上图中我们也可以看出,进行页面回收的两条代码路径最终汇合到函数shrink_zone()和函数shrink_slab()上。函数shrink_zone()是Linux操作系统实现页面回收的最函数之一,它实现了对shrink_active_list()active链表移inactive链表shrink_inactive_list()函数从inactive链表中选定一定数目的页将其放到shrink_page_list()的主要工作流程为:对于页面来说,在回收此类页面时,需要将其数据写入到交换区。如果尚page实例加入到交换区,这样,对该页面的处理就可以跟其如果该页面已经被到一个或者多个进程的页表项中,那么必须找到所有引Linux中通过调用fork()函数当前进程来建立新进程。在执行fork()之后,自己的程序和数据。execve()函数执行过需要定位可执行文件,然后装入运行它。inode节点装入当前进程的执行域中就可以执行Linux系统采用linux_binfmt数据结构来支持各种文件系统。每个已在linux系统中的文件系统均linux_binfmt结构的形式保存formats指针指向的链表结构中。在linux_binfmt结构中有两个域是指向函数的指针,一个是指向装入二进制代码的函数load_binary(),另一个是指向装入库函数的函数load_shlib()。以ELF格式的可执行文件load_elf_binary(structlinux_binprm*bprm,structpt_regs*regs);load_elf_library(intfd);structstructcharstructinode*inode;//可执行文件来自的节intargc,char*Linuxexecve()函数,下面介绍execve()系统调用execve()在内核的为sys_execve(structpt_regsregs)。参数pt_regs结针。sys_execve()getname()函数将可执行文件名由用户空间拷贝到内核空间。然后调用do_execve()函数完成execve()函数的工作。下面介绍do_execve()函intdo_execve(char*filename,char**argv,char**envp,structpt_regs首先,调用file结构指针。然后对linux_binprm结构的局部变量bprm的各个域进行初始化工作。然后调用prepare_binprm()函数将可执行文件文件头读入linux_binprm结构的buf缓冲区。然后调用copy_strings()函数将参数和环境变量从用户空间拷贝到内核空间的bprm变量中。最后调用search_binary_handler()函数完成最后的可执行文件装载工作,下面介绍该formats队列,直到找到一个匹配的可执行文件格式,调用该格式对应的load_binary()函数,并返回一个正数或着0。如果load_binary()函数执行失败或者没有找到相应的可执行文件格式,返回-ENOEXECformats队列结束后,当返回值是-ENOEXEC,如果内核支持动态安装模块,根据可执行温江的23个字节生成一个binfmt模块,通过request_module()函数将相应模块装入内核。然后再扫描一次formats队列。bss段和堆栈段到用户进程地址空间。后系统根据可执行文件文件头中的信息获取程序地址。此时程序的数据并没有载入的内存中,所以需要之前小节分析的请页机建立用户程序虚拟地址空间,将可执行文件的代码段、数据段、bss段和堆栈段到do_mmap函数完成。然后介绍了请求分页机制。在程序执行的开始,Linux内核并没有给进程分配物理内存页。当进程需要内存页的入机制重新获得物理页最后以ELF可执行文件为例介绍了Linux的程序运行过内在第三章中,我们对Linux内存管理机制进行了详细的分析。经过分析,我们明确了程序执行过,Linux内核对内存页的分配和回收的机制。从之前的分析可以看出,能够充分合理的利用所有物理内存,Linux内核总是试图推迟物理页的分配时间,直到求分页机制触发发生的时间段就是Linux对物理页进行分配的主要阶段。 filemap_nopage()中发生页面的位置主要在页高速缓存中不存在所缺页的情况下,也就是前面分析的no_cache_page的代码区域中,包括从磁盘中读入页面和对页面详细的分析,找到具体的页面分配函数,图4.1page_cache_read()调用find_page_lock()hash开始遍历以确定是否可以找调用page_cache_alloc()函数,分配一个物理页面a_ops->readpage()函数将可执行文件的数据填入到刚才分配的物理页中read_cluster_nonblocking()函数实现。该函数根据需要预读页面的数量循环调用page_cache_read()函数,对可执行文件进行预读。处当发生缺页中断时,检查出错的虚拟地址所在的地址区间的vm_area_struct的将虚拟地址直接到系统中预留的一个全零页面上如果是写则调用alloc_page()当发生缺页中断时,Linux内核首先检测所缺页面该进程以前是否过,如果进换区中,需要将其从后援器中换入到物理内存里。如果该页面不存在,则调用swapin_readahead()函数从交换区中读入页面,然后调用下面分析swapin_readahead()函数的实现机制,其中也包含了系如图图4.2swapin_readahead()调用valid_swaphandles()函数,获得页面换入的数目继续分析read_swap_cache_async()函数的实现机制调用add_to_swap_cache()函数将新分配的页面加入到交换高速缓存中memset函数原型为:void*memset(void*s,intch,size_tLinux内核对于内存的管理采用的是分页式的管理方式。Linux4KB页框大小page描述一个页框的状态信息,所有的页描述符均存放在全局的mem_map数组中,其数组的下标就是页框号。mem_mappage41图4.3mem_map数组与page

page_cache_alloc函数、do_anonymous_pagealloc_pageread_swap_cache_asyncalloc_page函pagepagememset函数page指针找到它描述的内存地mem_mappage结构描述的内存页面的Linux对内存的管理采用分页的形式,页面是Linux内核分配内存的最小单位,因此它的大小是固定的4KB,也就是4096字节,因此memset函数中的参数n的值为4096memset函数中剩余的参数ch为初始化值对应的ASCII对于值0所对应的memsetpage_cache_read()page_cache_alloc函数、do_anonymous_page()alloc_page函数和read_swap_cache_async()函数中的alloc_page函数之后便可完成内存页的擦除操作。符3,它对应的ASCII码为51。LinuxprintkLinux对于40964096个字符。我们在循环调用printk函数将该内存页中的数据全部打印到内核的控制台中。Linuxdmesg命令,它的作用是调出内核的控制台。我们在运行一个简单的可执行文件后,在控制台中输入dmesg命令,便可调出内核的控制台,查看printk函数输出的数据,如果输出的数据为字符3,则说明测试成功。4.14.4级初始化的工具函memset作为共享内存擦细介绍了如memset函数该块内存上的信息,这必然会导致上一台虚拟机信息的。针对这个问题本了大量的研究工作Linux内存管理的机制。我们从用户进程的管理入手,分析行过虚拟地址到物理地址之间的是如何建立的。我们还研究了Linux内核对内Linux对内存分配是在发生缺页异常时进行的。缺页异常的处理包括页面的第一次分配和过的页面的换入。之后,我们研究了linux对于页面回收的机制。Linux了一个LRU的链表,该链表保存了最近不常使用的页框,LinuxLinux内存Linux内存分配的具体时间点,以及在这些时间点上内存信息的具体原因。最后,我们设计了具体的共享内存擦除方案,即调用系统自带的内存初始化函数memset,在系统刚开始分配内存的时间点对该部分内存执行首先,我要感谢我毕业设计的导师肖利民教授。在进行本科毕业设计期间,我得选题、Linux内存管理机制的研究、完成,他们都给了我很大的帮助。在的作是Linux内存管理机制的研究,在阅读Linux内核代码过,有些代码难以理解,2014524CreasyRJ.TheOriginoftheVM/370Time-sharingSystem[J].IBMJournalofResearchandDevelopment,1981,25(5):483-490.GoldbergRP.SurveyofVirtualMachineResearch[J].Computer,1974,7(6):34-KingST,ChenPM.SubVirt:ImplementingMalwarew

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论