22/8/25 深入理解计算机系统第九章 虚拟内存
9.7 案例:Intel Core i7/Linux 内存系统
见书576
9.8 Linux虚拟内存系统
| 与进程相关的数据结构 (比如:页表、task和mm结构、内核栈) | 对每个进程不同 |
| 物理内存 | 内核虚拟内存 |
| 内核代码和数据 | 对每个进程一样 |
| 用户栈 | 进程虚拟内存 |
| 共享库的内存映射区域 | |
| 运行时堆(malloc分配) | |
| 未初始化数据(.bss) | |
| 已初始化数据(.data) | |
| 代码(.text) |
每个存在的虚拟页面都保存在某个区域中,这样可以允许虚拟内存有间隙,内核不用记录不存在的虚拟页。
内核为系统中每个进程维护一个单独的任务结构(task_struct)。任务结构中的元素包括或者指向内核运行该进程所需要的全部信息。(PID,指向用户栈的指针,可执行文件的名字,程序计数器等)
mm_struct 描述了虚拟内存的当前状态:
其中pgd指向第一级页表的基址
mmap指向vm_area_structs的链表。每个vm_area_structs都描述了当前虚拟地址空间的一个区域。
vm_area_structs包含以下字段:
vm_start:指向这个区域的起始处
vm_end:指向这个区域的结束处
vm_prot:描述这个区域内包含的所有页的读写许可权限
vm_flags:描述这个区域的页面是和其他区域共享的,还是私有的。
vm_next:指向链表中下一个区域结构。
linux缺页异常处理
- 缺页处理程序会先判断虚拟地址是否合法,通过和每个区域结构中的vm_start和vm_end比较判断,如果是不合法的,就会触发段错误。
- 判断试图进行内存访问是否合法,如果不合法就会触发一个保护异常。
- 选择一个牺牲页面,如果这个页面修改过就交换,换入新的页面并更新页表,然后重启引起缺页中断的指令。
浙公网安备 33010602011771号