内存管理(一)硬件篇

一.经典存储结构图

avatar

L0(寄存器)->CPU 寄存器保存来自高速缓存的字
L1(SRAM)->高速缓存取自L2高速缓存行
L2(SRAM)->高速缓存取自L3高速缓存的高速缓存行
L3(SRAM)->高速缓存保存自内存的高速缓存行
L4(内存)->内存保存自磁盘缓存的磁盘块
L5(磁盘缓存)->磁盘缓存保存取自磁盘的磁盘块
L6磁盘

cpu从磁盘中加载数据,放到内存,之后再放到告诉缓存

二.虚拟地址和物理地址

在旧的手机中,内存可能只有1G,但是每个进程在执行的时候都仿佛手机有4g内存;
物理地址(Physical Address):CPU地址总线传来的地址,由硬件电路控制其含义。物理地址中有很大一部分是留给内存条中的内存的但也常被映射到其他存储器上如显存,BIOS等),在没有使用虚拟存储器的机器上,虚拟地址被直接送到内存总线上,使具有相同物理存储器被读写;而在使用了虚拟存储器的情况下,虚拟具体地址不是被直接送到内存地址总线上,而是送到存储器管理单元MMU,把虚拟地址映射为物理地址;我们把上面实际的1G内存叫做:物理地址
虚拟地址(Virtual Address):是逻辑地址到物理地址变换之间的中间层;进程访问到的叫做虚拟地址;
虚拟内存有以下几个作用:
1.内存访问保护
有虚拟内存,我们可以通过设置段界限或页表想来设定软件运行时的访问空间,确保软件运行使不越界;
2.按需分页(lazy load技术)
可以让软件在没有访问某虚拟内存地址时,不分配虚拟地址,在实际访问的时候,在动态分配物理内存
建立虚拟内存到物理内存的页映射关系;
3.页换入换出(page swap in/out)
把不经常访问的数据所占的内存空间临时写到硬盘上,这样可以腾出更多的空闲空间出来给到经常访问的数据;当cpu访问到不经常访问的数据时,再把数据从硬件读入到内存中;
4.写时复制(copy on write)
两个虚拟页的数据相同时,可只分配一个物理页框,这样如果对两个虚拟页的访问是只读方式,这两个虚拟页可以共享页框,节省空间;如果当CPU对其中一个虚拟页进行了写操作,那么这两个虚拟页的数据内容不同,需要分配一个新的物理页框,并将物理页框标记为可写,这样两个虚拟页面将映射到不同的物理页帧,确保整个内存空间的正确访问。

二.页,页表,MMU

在讲虚拟地址到物理地址之中再补充几个概念:
页(page)
把APP的虚拟地址切分程若干个大小相等(4K)的片,每一片就是我们说的页
页框(frame)
*把物理内存页按“页”的大小切分为若干大小相等的片,每一片,就是我们所说的页框

三.cpu寻找页面过程

CPU获取数据主要有两步:
a.通过虚拟地址获取物理地址
b.根据物理地址获取数据

获取物理地址

获取物理地址
[a].CPU向MMU发送虚拟地址
[b].MMU查询快表TLB
块表命中:从块表中获取物理地址,由MMU继续根据物理地址匹配数据页步骤[a]
块表不命中:查询页表步骤[c]
[c]:从高速缓存查询页表
“高速缓存”缓存页框,而页表存储于页框中,因此读取页表实际上也是读页(页表的物理地址有单独的寄存器保存)
高速缓存命中:从高速缓存获取物理地址,并更新快表,进入[步骤a]
高速缓存不命中:查询内存中的页表[步骤d]
[d]从内存中查询页表
页表保存了所有虚拟地址的映射关系,而不管页是否有映射物理页框。因此从内存页表中肯定能“命中”页。从页表获取虚拟地址的映射关系后,进入步骤e
[e]把查询的页表想记录到高速缓存
[f]MMU从高速缓存中获取页表项
虚拟地址有分配物理页框;转换物理地址并更新块表,由MMU继续根据物理地址匹配数据页
虚拟地址没分配物理页框:触发缺页中断
[g]进入缺页中断处理程序
[h]为虚拟页分配物理页框
如果无空闲物理页框,则根据LRU算法选择需要淘汰的页,要淘汰的页如果是脏数据就回刷,否则直接丢弃或置换到磁盘的交换分区中
然后,从磁盘中获取页信息更新到物理页框,更新内存页表
[i]缺页中断处理的最后
修改CPU寄存器,使得重新启动导致缺页的指令,返回[步骤a]重新执行

根据物理地址获取实际数据

获取数据
[A]MMU获取到物理地址后,根据物理地址查询高速缓存
高速缓存命中:CPU直接从高速缓存获取数据
高速缓存不命中:查询物理内存[步骤B]
[B]根据物理地址,获取物理内存中的数据
[C]硬件实现把数据页记录到高速缓存中
[D]cpu直接从高速缓存中获取数据