虚拟地址空间:虚拟内存管理方案给每个用户进程分配的一个虚拟的地址空间,由PCB中的虚拟内存管理数据结构mm_struct中的VM_area_数据结构描述。
虚拟内存:
是一种操作系统的内存管理方案,由MMU硬件单元和操作系统软件单元合作完成。
简单的过程描述:
CPU发出虚拟地址------------》》》MMU硬件进行地址映射过程的计算-------------》》》》
软件是内核提供页目录地址,页表地址,各种寄存器提供计算的数据和计算的地址
有以下优点特点:
第一、虚拟内存管理的方式由它来置换页面到交换分区。
第二、为每个程序提供4G的虚拟地址空间。
第三、保证了每个进程的地址空间是隔离的。每个虚拟地址空间是一样的,只有通过地址映射到物理内存中才不一样。隔离了物理地址和进程内存,分配由操作系统来保证系统安全。
交换分区:用于页面置换的磁盘空间,根据LRU算法最近最久未使用页面置换算法一个队列出队入队的过程将该页面交换到该磁盘中。脏页就是被修改过的数据,修改信息存放在页表项的低十二位。
程序执行时./a.out时根本不开辟物理内存,执行代码时,发出逻辑地址进行地址映射。只有当页面异常时,MMU出现缺页异常,地址映射发生错误时检测到页目录未分配,缺页异常处理程序处理异常写入页目录,重启MMU地址映射。虽然复杂但是程序运行具有局部性原理,一个页面4K再次访问还是非常大可能在这个页面,再次页面映射的概率还是比较低。并且映射过程的计算都是由MMU硬件完成,不占用CPU时间。
中断有中断服务程序,中断有中断指令。
MMU产生缺页异常由于页表项或者页目录不完整产生。有异常处理程序,处理程序完成后。把当前的指令重新执行,重新MMU地址映射。
缺页中断发生时:
当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:
1、检查要访问的虚拟地址是否合法
2、查找/分配一个物理页
3、填充物理页内容(读取磁盘,或者直接置0,或者啥也不干)
4、建立映射关系(虚拟地址到物理地址)
重新执行发生缺页中断的那条指令
如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。
内存分配的原理:
从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。
1、brk是将数据段(.data)的最高地址指针_edata往高地址推;
2、mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。
这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。