文档详情

10-2 Linux操作系统 - 存储管理.ppt

发布:2017-06-21约5.63千字共31页下载文档
文本预览下载声明
进程页面必定属于某个vm_area_struct结构,但是属于vm_area_struct结构的页面不一定在页表中有数据项 2. 进程空间的相关系统调用 exec调用会抛弃原来的地址空间并根据可执行文件内容生成相应的新的地址空间。 fork系统调用,通常情况下: (1)子进程会拷贝一份父进程的地址空间,包括父进程的vm_area_struct结构以及页目录、页表均会被拷贝 (2)写时拷贝(COPY ON WRITE) 父进程页表项所标识的有效物理页帧并不会立即拷贝,而是为子进程和父进程共享,即父进程和子进程的同一页表项指向同一个物理页帧,并且页表项的相应标志位均标记位“只读”, 写入该页帧时就会引发页面异常进一步处理。 好处是:(1)节省了开销, (2) 懒惰策略,分散式复制的效果相比起一次性集中复制即时响应效果更好。 系统调用brk()用来改变堆的大小,增大进程空间。 exit()结束进程并销毁进程空间。 mmap()创建文件的内存映象,扩展进程空间,而munmap()行为与之相反。 shmat()创建一个共享内存区而shmdt()则释放共享内存区. 三、 页面异常的处理 导致页面异常的原因有: (1)编程错误 可分为内核程序错误和用户 程序错误。 (2)操作系统故意引发的异常 操作系统合理利用硬件机制在适当时间触发异常, 使得该异常的处理程序被调用以达到预期目的。如缺页 页面异常的处理程序是do_page_fault()函 数,该函数有两个参数 一个是指针,指向异常发生时寄存器值存放的地址。 另一个错误码,由三位二进制信息组成 第0位 访问的物理页帧是否存在 第1位 写错误还是读错误或执行错误 第2位 程序运行在核心态还是用户态 do_page_fault()函数的执行过程如下: (1)首先得到导致异常发生的线性地址,对于X86该地址放在CR2寄存器中。 (2)检查异常是否发生在中断或内核线程中,如是,则进行出错处理。 (3)检查该线性地址属于进程的某个vm_area_struct区间。如果不属于任何一个区间,则需要进一步检查该地址是否属于栈的合理可扩展区间。一但是用户态产生异常的线性地址正好位于栈区间的vm_start前面的合理位置,则调用expand_stack()函数扩展该区间,通常是扩充一个页面,但此时还未分配物理页帧。 至此,线性地址必属于某个区间。 (4)根据错误码的值确定下一个步骤: 如果错误码的值表示为写错误,则检查该区间是否允许写,不允许则进行出错处理。如果允许就是属于前面提到的写时拷贝。如果错误码的值表示为页面不存在,这就是所谓的按需分页(demand paging)。 写时拷贝的处理过程 首先改写对应页表项的访问标志位表明其刚被访问过,这样在页面调度时该页面就不会被优先考虑。 如果该页帧目前只为一个进程单独使用,则只须把页表项置为可写。 如果该页帧为多个进程共享,则申请一个新的物理页面并标记为可写,复制原来物理页面的内容,更改当前进程相应的页表项,同时原来的物理页帧的共享计数减一。 按需分页的处理过程: 第一种情况页面从未被进程访问,这种情况页表项的值全为0。 (a)如果所属区间的vm_ops-nopage不为空,表示该区间映射到一个文件并且vm_ops-nopage指向实现页面装入的函数,此时调用该函数装入该页面。 (b)如果vm_ops或vm_ops-nopage为空,则该调用do_anonymous_page()申请一个页帧; 另一种情况是该页面被进程访问过,但是目前已被写到交换分区, 页表项的存在标志位为0,但其它位被用来记录该页面在交换分区中的信息。调用do_swap_page()函数从交换分区调入该页面 * * 10.2 存储管理 内容: 物理内存的管理 虚拟存储空间的管理 10.2.1 物理内存的管理 内存用途 存储内核映像 其它可动态加载内核模块内存需求 进程用户页面的需求 缓冲需求 功能要求 快速响应请求 尽可能地利用内存同时减少内存碎片 解决方案 基于区域的伙伴系统及slab分配器 用户虚空间 对应固定物理内存 8M 4 ………………. 动态分配用(可以DMA) 静态内核使用 ? 动态分配用 进程虚地址空间 物理内存 硬件使用 mem_map[](数组大小为页帧数) 896M 空间 0 3G 4G-1 0 16M 896M 页帧 物理内存以页帧为基本单位,页帧的大小固定为4K。 区域:物理内存分成如下三个区域: DMA ZONE 低于16MB的内存,是DMA方式能够访问的物理内存。一般用于I/O缓冲区 NORMA
显示全部
相似文档