虚拟内存
操作系统需要管理的就是各个进程的内存,对于进程,需要存储代码、堆、栈等信息,如果让程序员直接来操控物理内存管理进程的话,难度会更大,需要考虑进程在哪个位置分配、会不会冲突等问题,那么操作系统提供了虚拟内存给程序员使用,背后的实现这些脏活累活都交给操作系统去完成了,对于虚拟内存,有一些追求的目标:
-
透明:每个进程看上去都有自己的内存,从0地址开始
-
效率:在虚拟内存转换到物理内存的时候兼顾时间(TLB哈希表)和空间(多级页表懒加载)
-
保护:每个进程是隔离的
除了硬件的底层实现,同时也需要有一些上层的策略(如可用内存如何管理、内存不够哪些内存可以释放)
硬件的地址转换
硬件的地址转换也可以叫做虚拟内存和物理内存的联系:物理内存 == 虚拟内存 + 基址寄存器的值,界限寄存器用来保证访问不越界。
这两个寄存器是CPU的重要部分,具体来说是CPU的内存管理单元MMU的重要部分,MMU是操作系统在进程上下文切换用来临时保存将要执行的进程的信息,而对于首次运行的进程,需要从进程列表(保存所有的进程信息)中的进程结构PCB拿出进程信息恢复到MMU,然后返回用户态执行进程。
对于越界访问的进程,界限寄存器会判断并跳转到内核态的异常处理程序。
分段
对于进程内部的虚拟内存,栈和堆之间有很大一块空闲空间,我们可以通过分段把这块空闲空间放到进程外部,把进程内存细分为几个段(如代码段、堆段、栈段),每个段有自己独立的基址寄存器和界限寄存器,也就是说MMU里面有多个寄存器对,进程上下文切换的时候需要恢复多个寄存器对。
我们如何才能知道访问到哪个段?还是这个:物理内存 == 虚拟内存 + 基址寄存器的值。将虚拟地址切割,前两位表示哪个段(对应使用哪个寄存器对),后几位表示段内偏移量,还有几位表示保护位(规定进程的访问权限,用于进程共享时检查)。
标签:操作系统,MMU,简单,了解,内存,寄存器,进程,虚拟内存 From: https://blog.csdn.net/xtrans/article/details/136801581