早期有固定地址方式 有交换式
交换式就是假设系统有ABC的进城分配特定大小 然后不用就交换到磁盘,但是经过多次会出现a回收的可能被其他大小使用会出现内存碎片 浪费资源
另外就是这种方式还有最大值限制 就是真实物理内存
问题本质是不同进程大小不一 那么如何避免碎片 那就是让空间固定大小分配 页式管理就是固定大小 它的本质是固定大小 具体页大小有的4k 有的64k 根据需求确定
于是页式内存管理应运而生,核心是解决交换系统的内存碎片问题
让虚拟空间和物理空间按照相同页大小分配 然后结合交换就能解决空间不够问题
空间大小限制问题本质解法是引入虚拟内存概念,并且把 虚拟内存和物理内存解绑 从而获得无限空间
有了虚拟内存到物理内存的映射 并且物理内存管理按照页管理 就需要地址转换 就需要一个内存管理单元mmu做地址转换
后来多进程为了都有自己的独立的全量地址空间,也需要不同进程有自己的地址翻译 并且增加了映射页表数量需求
采用页表方式,缺点就是页表太大,32b的需要2^20 也就是1M=100w的页表项,而且这还只是一个进程空间。再加上不同进程页表数量巨大 为了节约RAM空间就增加了多级页表,类似页表方式,让顶级页表常驻内存,比如2^10=1k,让二级页表存入磁盘,页表项也到磁盘上去。
需要用的时候先一级页表,根据访存地址一级地址 获取到二级页表存储位置,然后二级页表地址偏移获取到三级页表地址 然后偏移得到物理地址
缺点就是需要3步拿到pa
后来为了加速又打了个补丁,tlb translation lookaside buffer快表,cpu将查询过的存到tlb中 下次用先在tlb中查询 这样比较快,而且还有程序的空间集合属性 同时访问的挨着的
tlb是硬件实现的并行比较器 一次指令全部比较所以快
cpu访问虚拟地址流程是 先tlb查询是否有 有就访问了,没有就根据va的高10b 从cr寄存器获取一级页表基地址 加上10b的偏移 获取二级页表地址。
然后根据二级页表偏移获取 页表物理地址 再加上偏移查看物理地址。
如果查看不在内存在磁盘 就出发缺页中断 中断将访问的地址映射到内存 然后填写pa 然后可访问
总结就是
- 页表管理本质是分配固定大小管理 避免碎片提高资源利用率
- 多级页表是为了节约ram空间