1 / 35

4.8 实例研究: Linux 虚拟存储管理

4.8 实例研究: Linux 虚拟存储管理. 4.8.1 Linux 存储管理概述 4.8.2 进程的虚拟地址空间 4.8.3 Linux 物理内存空间的管理 4.8.4 用户态内存的申请与释放 4.8.5 内存的共享和保护 4.8.6 交换空间、页面的换出和调入 4.8.7 缓冲机制. 4.8.1Linux 虚拟存储管理概述 (1). Linux 用户进程可访问 4GB 线性地址空间。从 0 从 3GB 的虚拟内存地址是用户空间。 3GB 到 4GB 的虚拟内存地址是内核态空间,存放仅供内核态访问的代码和数据。.

manning
Télécharger la présentation

4.8 实例研究: Linux 虚拟存储管理

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 4.8实例研究:Linux虚拟存储管理 • 4.8.1 Linux存储管理概述 • 4.8.2 进程的虚拟地址空间 • 4.8.3 Linux物理内存空间的管理 • 4.8.4 用户态内存的申请与释放 • 4.8.5 内存的共享和保护 • 4.8.6 交换空间、页面的换出和调入 • 4.8.7 缓冲机制

  2. 4.8.1Linux虚拟存储管理概述(1) • Linux用户进程可访问4GB线性地址空间。从0从3GB的虚拟内存地址是用户空间。 • 3GB到4GB的虚拟内存地址是内核态空间,存放仅供内核态访问的代码和数据。

  3. Linux虚拟存储管理概述(2) 页表分为三层: •页目录PGD、中间页目录PMD和页表PTE。 •Pentium计算机上被简化成两层,PGD和PMD合二为一。 •每个进程有一个页目录,存储该进程所使用的内存页面情况

  4. Linux虚拟存储管理概述(3) 使用fork()创建进程时,分配内存页面的情况: • 进程控制块1页;内核态堆栈1页;页目录1页;页表若干页。 使用exec()系统调用时,分配内存页面的情况: • 可执行文件的第1页;用户堆栈的1页或几页。

  5. 4.8.2Linux进程的虚拟地址空间 • 进程虚拟地址空间由许多个连续虚地址区域构成,采用虚存段vma及其链表来表示。 • 一个vma是某个进程的一段连续虚存空间,这段虚存里的所有单元拥有相同特征,如属于同一进程、相同的访问权限、同时被锁定、同时受保护。

  6. 数据结构vm_area_struct描述(1) struct vm_area_struct{ struct mm-struct *vm_mm;/*虚存段参数*/ unsigned long vm_start;/*虚存段始*/ unsigned long vm_end;/*虚存段末址*/ pgprot_t vm_page_prot; unsigned short vm_flags;

  7. 数据结构vm_area_struct描述(2) /*按地址分叉的vma的AVL树*/ shrot vm_avl_height; struct vm_area_struct *vm_avl_left; struct vm_area_struct *vm_avl_right; /*按地址分叉的vma链接指针*/ struct vm_area_struct *vm_next; /*或是在一个结点区双向环链表中,或在共享内存区映射表中,或未用*/ struct vm_area_struct *vm_next_share; struct vm_area_struct *vm_prev_share; /*用于共享内存*/

  8. 数据结构vm_area_struct描述(3) struct vm_operations_struct vm_ops; /*封装的操作如open, close*/ unsigned long vm_offset;/*相对文件中共享内存起点的位移*/ struct inode *vm_inode; /*指向文件inode 或NULL*/ unsigned long vm_pte; };

  9. 进程任务结构 task_struct 内存管理结构 mm_struct 虚存段结构 vm_area_struct vm_struct mmap vm_next pgd vm_op 页目录表pgd vm_area_struct vm_next vm_area_struct *open *close *swapout . . m m 页表PTE 页表PTE 页框PF 页框PF 进程虚存管理数据结构

  10. 4.8.3Linux物理内存空间的管理 • 物理内存以页框为单位,长度为4KB。 • 对物理内存的管理通过mem_map表描述, • men-map是由men-map-t组成的数组,每个men-map-t描述一个物理页框。

  11. typedef struct page主要内容 • page前后向链接指针 • page页cache和ha指针 • page访问进程的计数 • page状态位和修改标记 • 页帧内存放代码或数据所属文件的inode • 页帧年龄,越小越先换出 • 页帧作为缓冲区,则指示地址 • 页帧在mem_map表中的下标

  12. mem_map_t free_area bitmap next 0 ptev map 每位对应20页 1页 1页 每位对应21页 next 1 ptev map 每位对应22页 2页 2页 。 。 next 2 ptev map 4页 4页 . . . bitmap与free-area的关系

  13. 页面分配和回收(1) • 所有的空闲物理页帧组织成NR_MEM_LISTS的双向链表,存储在free_area数组中。每个链表节点的包括三个数据向:next和prev是链表指针,map指向bitmap表。

  14. 页面分配和回收(2) • 采用buddy算法分配空闲块。当请求分配长度为2i个页帧的块时,从free_area数组的第i条链表开始受搜索,如找不到,搜索第i+1条链表,以此类推。 • 如果找到的空闲块正好等于需求,直接把它从来链表中删除,返回首地址。如果找到的空闲块大于需求,则需要把它一分为二,前半部分插入前一条链表,取后半部分。如果还大,则继续对分,取一半留一半,直至相等。同时,bitmap表页必须相应调整

  15. 页面分配和回收(3) • 回收空闲块时,根据bitmap表中的对应组,判断回收块的前后是否为空闲块。若是则合并,并调整bitmap表对应位,从free_area的相应空闲链表中取下该空闲块并归还。这是一个递归过程,直到找不到空闲块邻居,将最大的空闲块插入free_area的相应空闲链表。

  16. 4.8.4用户态内存的申请与释放(1) • 用户进程使用vmalloc()和vfree()函数申请和释放大块存储空间,分配的存储空间在进程的虚地址空间中是连续的,但它对应的物理页框仍需缺页中断后,由缺页中断处理例程分配,所分配的页框也不是连续的。

  17. 用户态内存的申请与释放(2) • vmalloc( )和vfree( )函数,其执行如下:申请时需给出申请的长度,调用set-vm-area内部函数向vmlist索取虚存空间。如果申请成功,将会在vmlist中插入一个vm-struct结构,并返回首地址,当申请到虚地址空间后更改页目录和页表。

  18. 用户态内存的申请与释放(3) • 释放时需给出虚拟空间首地址,沿着vmlist搜索要释放的区域,找到表示该虚拟内存块的vm-struct结构,并从vmlist表中删除,同时清除与释放虚存空间有关的目录项和页表项。

  19. 4.8.5内存的共享和保护(1) • 内存共享以页共享的方式实现,共享该页的各个进程的页表项直接指向共享页,这种共享不需建立共享页表,节省内存,但效率较低。当共享页状态发生变化时,共享该页的各进程页表均需修改,要多次访问页表。

  20. 内存的共享和保护(2) • 对进程的虚拟地址加锁或保护,实质是对vma段的vm_flags属性与VM_LOCKED进行或操作。 • 虚存加锁后,对应的物理页框驻留内存,不再被页面置换程序换出。 • 加锁操作有4种:对指定的一段虚拟空间加锁或解锁;对进程所有的虚拟空间加锁或解锁。

  21. 内存的共享和保护(3) • 对进程的虚拟地址空间实施保护操作是对vma段的vm_flags重置PROT_READ、PROT_WRITE和PROT_EXEC参数,并重新设定vm_page_prot属性。同时,对虚拟地址范围内所有页表项的访问权限也做调整,保护操作由系统调用mprotect实施。

  22. 4.8.6交换空间、页面换出和调入 1、交换空间 • Linux采用两种方式保存换出页面。一是使用块设备,如硬盘的一个分区,称作交换设备 • 另一种是使用文件系统的一个文件,称作交换文件。两者统称为交换空间。

  23. 交换设备和交换文件的内部格式(1) • 前4096个字节是以字符串“SWAP_SPACE”结尾的位图。位图的每位对应一个交换空间的页面,置位表示对应的页面可用于换页操作。 • 第4096字节后是存放换出页面的空间。每个交换空间最多可以容纳(4096-10)*8-1=32687个页面,最多允许管理MAX_SWAPFILES(缺省值为8)个交换空间。

  24. 交换设备和交换文件的内部格式(2) • 交换设备中,属于同一页面的数据总是连续存放的,第一个数据块地址一经确定,后续的数据块可按顺序读出或写入。 • 交换文件中,同一页面的数据虽然逻辑上是连续的,但实际的物理存储是零散的,交换这样的页面,必须多次访问磁盘扇区,意味着磁头的反复移动、寻道时间的增加和效率的降低。

  25. 2 页交换进程和页面换出(1) • 当物理页面不够用时,存储管理必须释放部分物理页面,把它们的内容写到交换空间。内核态交换线程kswapd完成这项功能。 • Kswapd不仅能够把页面换出到交换空间,也能保证系统中有足够的空闲页面以保持存储管理系统高效的运行。

  26. 页交换进程和页面换出(2) • Kswapd在系统初启时由init创建,调用init_swap_timer()函数设定,并转入睡眠。 • 每隔10ms响应函数swap_tick()被周期性激活,它察看系统中空闲页面是否太少,依次从三条途径缩减物理页面: (1)缩减page cache和buffer cache; (2)换出SYSTEM V共享内存占用页面; (3)换出或丢弃进程占用页面。

  27. 3 缺页中断和页面换入(1) • 当进程访问了一个还没有有效页表项的虚拟地址时,处理器将产生缺页中断,通知操作系统,并把缺页的虚拟地址(保存在CR2寄存器中)和缺页时访问虚存的模式一并传给缺页中断处理程序。

  28. 缺页中断和页面换入(2) • 根据控制寄存器CR2传递的缺页地址,必须找到表示出现缺页的虚拟存储区的vm_area_struct结构,如果没有找到,说明进程访问了非法存储区,系统发出信号告知进程出错。 • 系统检测缺页时访问模式是否合法,如果进程对该页的访问超越权限,系统也将发出信号,通知进程的存储访问出错。

  29. 缺页中断和页面换入(3) • 通过以上两步检查,可以确定缺页中断是否合法,进而进程进一步通过页表项中的位P来区分缺页对应的页面是在交换空间(P=0且页表项非空)还是在磁盘中某一执行文件映像的一部分。最后进行页面调入操作。

  30. 4.8.7缓冲机制 虚存管理的缓冲机制主要包括: • kmalloc cache • swap cache • page cache

  31. 1 swap cache(1) • 如果被调出到交换空间的页面由于进程再次访问而调入物理内存,只要该页面调入后未被修改过,它的内容与交换空间中内容是一样的,交换空间中的备份是有效的。该页再度换出时,就不要执行写操作。 • 采用swap-cache表描述的swap cache来实现这种思想。swap cache实质上是关于页表项的一个列表。

  32. swap cache(2) • 每一物理页框都在swap-cache中占有一个表项,表项的总数就是物理页框总数。 • 若该页框内容是新创建的;或虽曾换出过;但换出后,该页框已被修改过时,则该表项清0。 • 内容非0的表项,正好是某个进程的页表项,描述了页面在交换空间中的位置。 • 当一个物理页框调出到交换空间时,它先查swap cache。如果其中有与该面对应有效的页表项,那就不需要将该页写出,因为原有空间中内容与待换出的页面是一致的。

  33. 2 page cache(1) • 页缓冲的作用是加快对磁盘文件的访问速度。文件被映射到内存中,每次读取一页,而这些页就保存到page cache中,用hash表page-hash-table来访问page cache,它是指向由page类型节点组成的链表指针。

  34. page cache(2) • 每当需要读取文件一页时,总是先通过page cache读取。如果所需页面就在其中,就通过指向表示该页面的mem-map-t的指针;否则必须从申请一个页框,再将该页从磁盘文件中调入。

  35. 3 kmalloc cache • 进程可用kmalloc()和kfree()函数向系统申请较小的内存块,而这两个函数共同维护了一个称作kmalloc cache的缓冲区,其主要目的是加快释放物理内存的速度。

More Related