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

35
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 实实实实

description

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 的虚拟内存地址是内核态空间,存放仅供内核态访问的代码和数据。. - PowerPoint PPT Presentation

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

Page 1: 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 缓冲机制

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

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

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

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

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

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

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

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

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

数据结构 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;

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

/* 按地址分叉的 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;/* 用于共享内存 * /

数据结构 vm_area_struct 描述 (2)

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

数据结构 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;};

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

进程任务结构task_struct

m m

内存管理结构mm_struct

mmappgd

虚存段结构vm_area_structvm_structvm_nextvm_op页 目 录 表 pgd

页表 PTE 页表 PTE

页框 PF 页框 PF

vm_area_structvm_next

vm_area_struct

*open*close*swapout..

进程虚存管理数据结构

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

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

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

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

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

next0 ptev map

next1 ptevmapnext2 ptevmap

...

free_areabitmap

每 位 对应 20页每 位 对应 21页每 位 对应 22页。。

1 页 1 页

2 页 2 页

4 页 4 页

mem_map_tbitmap 与free-area 的关系

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

内存的共享和保护 (3)• 对进程的虚拟地址空间实施保护操作是对 vma 段的 vm_flags重置 PROT_R

EAD 、 PROT_WRITE 和 PROT_EXEC参数,并重新设定 vm_page_prot 属性。同时,对虚拟地址范围内所有页表项的访问权限也做调整,保护操作由系统调用 mprotect 实施。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

swap cache(2)

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

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

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

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

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

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