现代操作系统将可执行文件加载后,创建一个进程,进程中的每个指令和数据都被分配一个虚拟地址,中央处理器在获得这个虚拟地址后,在访问指令和数据之前,需要将其转换为内存的物理地址。本文的重点是物理地址的虚拟地址翻译过程和实践,因此分为两部分
1.如何将虚拟地址转换为物理地址?
2.举例练习?
如何将虚拟地址转换为物理地址?当CPU第一次访问虚拟地址时,虚拟地址所在的虚拟页不在内存中,虚拟页表条目也不在内存中(PTE)TLB因此,需要执行许多步骤,如下图所示
首次访问虚拟地址
一处理器将虚拟地址(VA)邮寄MMU(内存管理单元)
虚拟地址格式
如上图所示,虚拟地址长度为n,虚拟页偏移量长度为p。
2.MMU进入虚拟地址虚拟页码(VPN),然后将虚拟页码发送到TLB(翻译备份NicholasTse设备),TLB来自虚拟页码TLB映射表中等查询PTE(页面表格条目)。
PTE(页面项目)
3.TLB(翻译备份NicholasTse)将查询结果返回给MMU(内存管理单元)
4.MMU(内存管理单元)分析查询结果是否PTE(页面输入),找到PTE无效,错过,所以MMU根据页表基址寄存器(ptbr)plus中页表的起始地址虚拟页码(VPN)以获取虚拟页表项的物理地址PTEA(即页表条目地址),然后将这个物理地址发送到高速缓冲(L1)。
5.高速缓冲(L1)根据PTEA查询内部NicholasTse映射表,发现没有找到PTEA的映射内容,即PTE(页面表项),然后请求内存PTEA满足于。
6.记忆会PTEA满足于PTE,发送给高速列车缓冲(L1),他在PTEA和PTE之间建立了映射关系。
7.高速缓冲(L1)根据PTEA再次查询缓冲的内部映射表,这次找到了,然后将PTE发送到TLB。
8~9.TLB我明白了PTE建国后虚拟页码(VPN)和PTE的映射(8),然后将PTE发送到MMU。
10.MMU我明白了PTE之后,检查PTE的有效位,看看虚拟页面是否在内存中。
11.MMU检查PTE之后,发现虚拟页不在内存中,因此它向CPU发送缺页中断,CPU开始执行缺页中断处理程序。
12.根据页面替换算法,缺失页面中断处理程序选择一个已被NicholasTse替换的虚拟页面作为牺牲页面(如果虚拟页面发生更改,它将被更新到磁盘),然后PTE的有效位设置为0,表示牺牲页内存不足。
13.缺失页面中断处理程序将缺失页面从磁盘切换到可用物理内存,将缺失虚拟页面的PTE的有效位设置为1,并更新物理编号。
14.执行缺页中断处理程序后,跳转到出现缺页的指令,然后CPU重新执行该指令,重新向MMU发出虚拟地址,跳转到1,并开始下一个周期。
当CPU第二次访问同一虚拟地址时,虚拟地址所在的虚拟页面已经在内存中,虚拟页面表条目(PTE)也在TLB中,因此要执行的步骤要少得多,如下图所示
第二访问虚拟地址
一处理器将虚拟地址(VA)邮寄MMU(内存管理单元)
2.MMU进入虚拟地址虚拟页码(VPN),然后将虚拟页码发送到TLB(翻译备份NicholasTse设备),TLB来自虚拟页码TLB映射表中等查询PTE(页面表格条目)。
3.TLB(翻译备份NicholasTse)将查询结果返回给MMU(内存管理单元)
4.MMU(内存管理单元)分析查询结果是否PTE(页面输入),找到PTE如果有一个值,它就会命中。然后检查PTE的有效位,发现有效位为1,因此没有缺页。根据PTE中的物理数和虚拟地址中的VPO(PA)计算指令或数据的物理地址,并将PA发送给高速NicholasTse(L1)
5.高速缓冲(L1)根据小马查询内部NicholasTse映射表,发现找不到PA映射的内容,即指令或数据,然后从内存请求小马满足于。
6.记忆会小马内容被发送给高速尼古拉斯·谢(L1),后者在PA和内容之间建立映射关系。
7.高速NicholasTse(L1)根据PA再次查询内部NicholasTse映射表,这次找到了,然后将代码或指令发送给数据总线,在从数据总线接收到数据后,CPU叹息说它终于得到了数据。
当CPU第三次访问同一虚拟地址时,与第二次不同的是,虚拟地址对应的物理地址的数据已映射到高速NicholasTse(L1),因此不再从内存中查询。
描述了虚拟地址转换为物理地址的整个过程。让我们以一个具体的例子来实践!
以实践为例前一部分是将虚拟地址转换为物理地址的过程。现在,在实践中,我们将在实践之前普及TLB和缓冲这两个概念。
TLB
TLB的全名叫缓冲。这是一个映射表。它在虚拟页码(VPN)和页面表项(PTE)之间建立映射关系。每次访问虚拟地址时,都需要找到与虚拟地址对应的页表项。每次你进入内存,都需要几十甚至几百个时钟周期。虽然pagetable的项缓冲在高速时落后于缓冲,但消耗的周期可以减少到1-2个周期,但在TLB之后,缓冲几乎不需要消耗时钟周期。它几乎与CPU同步,类似于登记。
那么,如何通过TLB的页面表项(PTE)映射虚拟地址呢?让我们来看看TLB。我们说TLB是一个映射表。让我们看看映射表的样子,如下图所示
如上图所示,TLB由M组成TLB组组成:每个TLB组下有n个条目,每个条目由PTE和标记位组成。
标签位是一个数字,每个TLB组的标签位不能重复。因此,在songZuying组中,可以根据该标记位定位项目。
每个组都有一个唯一的编号,称为组号。
因此,TLB就是其中之一二维阵列,知道组号和标记位后,可以找到唯一的PTE(页面表项)。
虚拟地址中的虚拟页码(VPN)可分为两部分,即组号和标记位。假设一个n位长度的虚拟地址,如下图所示
TLB部分虚拟地址
从上图可以看出,VPN由标签位(TLBT)和组号(也称为标签索引(TLBI))组成。组号占用t位,标记位占用虚拟页码的剩余位。
如果TLB有4个组,总共64个条目,每组16个条目,VPN中的组号占2位(2=4的幂),标签位占4位(2=16的幂)。
高速缓冲
高速的缓冲通常采用SRAM(静态随机存取存储器)用于存储,比内存DRAM(动态随机存取存储器)快几十倍甚至几百倍。因此,为了加快CPU获取数据的速度,最近访问的数据存储在高速NicholasTse中。
高速NicholasTse内部有一个映射表,它建立了内存物理地址PA与内存物理地址下内容的映射关系,如下图所示
高速Nicholas-Tse映射表
如上图所示,映射表分为m组。每组由标记位、有效位和N个块组成。有效位1表示缓冲尚未过期,有效位0表示缓冲已过期。
物理地址由组号+标记位+块号组成,如下图所示
物理地址的组成
从上图可以看出,物理地址为m位,块号占用P位,组号占用t位,剩余位为标签位占用的位。
我们可以根据物理地址的组号在映射表中定位一个组,然后查看该组下的有效位是否为1。如果不是1,则表示该组的内容无效,无需进行比较。因此,缓冲错过了比赛。如果为1,则将该组下的标记位与物理地址的标记位进行比较。如果不相等,那就是小姐。如果它们相等,则根据物理地址中的块号继续查找该组的相应块号。如果你找到了数据,就意味着你击中了,否则缓冲就错过了。
假设一个高速NicholasTse有16个组,每个组有4个块,那么物理地址中的组号占用的空间是4位(2的4次方等于16),块号占用的位数是2位(2的2次方等于4),剩余的位数是标签位占用的位数。
好吧,在这个概念普及之后,让我们正式开始举例
第一个假设
1.内存由字节寻址,每个字是一个字节(32位系统通常为4个字节)。
2.虚拟地址的长度为14位。假设页表有256个页表条目,虚拟页码(VPN)占用的位数为8,虚拟偏移量(VPO)为6。
3.物理地址的长度为12位。
4.页面大小为64字节(P=64)
5.TLB分为4组,每组4项,共16项
6.高速缓冲(L1)有16组,每组有4个街区。
7.采用一级页表(多级页表比较复杂,但原理相似)。
首先看虚拟地址和物理地址的格式,如下图所示:
虚拟地址
从上图可以看出,组号(TLBI)占2位,因为我们假设TLB有4个组,标记位占6位。
物理地址
从上图可以看出,组号(CI)占4位,因为我们假设高速NicholasTse有16个组,每个组下有4个块,所以块号(CO)占2位,其余6位为标记位(CT)。
假设高速公路的TLB和缓冲的地图如下:
TLB映射表
高速Nicholas-Tse映射表
页面表中有256项。我们列出了前16项,如下图所示
页面表格前16项
一切都准备好了。假设CPU访问的虚拟地址是0x03d4,其二进制的是16位,即0000001111010100,虚拟地址只有14位,所以上面的2位被丢弃,如下图所示
0x03d4虚拟地址分布图
从上图可以看出,组号(TLBI)为11,即0x03,标签位(TLBT)为000011,即0x03。发现它是从TLB映射表中命中的,如下图所示
TLB
从上图中,我们找到了红色部分的标记位。PTE中的PPN=0x0d,有效位为1。我们根据PPN添加虚拟页面偏移量,如下图所示
虚拟地址
由上图可知,虚拟页偏移量(VPO)为010100=0x14,虚拟页偏移量(VPO)=物理页偏移量(PPO),即PPO=0x14,PPN与PPO之间的连接为物理地址PA,即001101100=0x354,如下图所示
物理地址
根据上图,组号为0101,即0x05,区块号(CO)为00,即0x00,标记位为001101,即0x0d。通过组号+标记位+区块号,可以找到高速公路缓冲的0x36号数据,如下图所示
物理地址命中数据
找到与物理地址对应的数据并返回给CPU。当然,也可能出现其他情况,如TLB的失误、缓冲的高速失误、缺页等。这些读者可以自己练习。
虚拟地址翻译的过程和实践。在介绍之后,我们来谈谈下一个话题。
最新评论