不同进程对应相同的虚拟地址,在 TLB(快表) 是如何区分的?

大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家访问。

一、前言

从虚拟地址到物理地址需要进行多级的页表转换,64位操作系统一般是3~5级,如果每次都要进行这个页表转换那会带来性能上的消耗。
如果我们将已知的虚拟地址和物理地址映射关系存到一个缓存表中,那么如果再次用到这个映射关系就能直接查表来找到虚拟地址对应的物理地址了,这就是TLB表,也叫快表。

但是会发生一个歧义,就是两个进程有相同的虚拟地址,但是映射到了不同的物理地址,到时候查表的时候就会发生歧义

二、页表查找简述

我们知道MMU是将虚拟地址转换为物理地址,然后其中的映射关系存储到页表中,而页表又是分级的。


64位操作系统一般有3~5级页表,这里我们以4级页表为例,分别是PGD、PUD、PMD、PTE四级页表。在硬件上有一个页表基地址寄存器,它存储PGD页表的首地址,MMU根据这个寄存器从PGB表开始查,最后查到PTE,然后生成最后的物理地址。


这个就是相当于找你家的具体位置一样,先找你的省份,然后是市级…。当下次再找你家的具体位置时,还要这么来一次,这非常的麻烦。但是如果第一次查完之后,把你的信息记录下来,比如说一个名字对应你家的具体位置,下次找的时候直接查表就行了。但是如果遇到同名的咋办,这就遇到了歧义,解决办法下面我再说。

三、TLB本质

TLB本质就是一个告诉缓存。TLB缓存虚拟地址和其映射的物理地址。


TLB根据虚拟地址查找cache,也只能根据虚拟地址查找。硬件存在TLB后,虚拟地址转到到物理地址的过程发生了变化。


虚拟地址首先传给TLB确认是否命中cache,如果cache hit就直接可以得到其对应的物理地址。否则,就是一级一级的查页表。
TLB1.webp
(操作系统虽然是64位,64位是非常大的一个数,我们目前一般用不多这么多,所以硬件厂商为了设计简单或节约成本,所以64位CPU寻址范围并不是64位,这里以48位的进行举例)

四、解决TLB中的歧义

在进程切换的时候我们可以将整个TLB失效,切换的进程肯定不会命中TLB,但是会导致性能损失,如果我们进程切换的非常频繁,可能TLB表就没咋用。


怎么尽可能避免flush TLB(这里的flush理解成使无效的意思)呢。如果我们能区分不同的进程TLB表就好了。


Linux操作系统为了区分不同的进程,会给每个进程一个独一无二的进程ID,我们也可以除了通过虚拟地址查表外,通过对比一个ID来区分不同进程的TLB表项。


所以,TLB添加一项ASID(Address Space ID)的匹配。ASID就类似进程ID一样,用来区分不同进程的TLB表项。这样在进程切换的时候就不需要flush TLB。但是仍然需要软件管理和分配ASID。
TLB2.webp

五、管理ASID

ASID和进程ID是不一样的。ASID一般是8或16 bit,所以只能区分256或65536个进程,但是进程ID的取值范围非常的大。我们不能将ASID和进程ID一一对应,我们必须给每个进程分配一个ASID。


Linux管理进程,每个进程会有个tast_struct结构,这里存储的进程的基本信息,我们可以把分配给这个进程的ASID存储到这里。页表基地址寄存器如果有空闲位也可以用来存储ASID。


当进程切换时候,可以将页表基地址和ASID(可以从task_struct获得)共同存储在页表基地址寄存器中。当查找TLB的时候,可以对比虚拟地址和ASID和TLB表中的是否一样来区分不同进程TLB表。 如果TLB miss就需要查页表了,然后再缓存到TLB中,同时缓存当前的ASID。

六、up

内核空间和用户空间是分开的,并且内核空间是所有进程共享的。


内核空间是共享的,那么进程A切换进程B的时候,如果进程B访问的地址位于内核空间,我们完全可以用进程A缓存的TLB表。但是现在因为ASID不一样,所以导致TLB miss。


我们针对内核空间这种全局共享的映射关系称为global映射。针对每个进程的映射成为non-global映射。 所以,我们在最后一级页表引入一个bit(non-global(nG)bit)代表是不是global映射。


当映射关系缓存到TLB的时候,将nG bit也缓存下来。这时候,我们的TLB表中有虚拟地址和物理地址的映射关系、ASID、nG bit。当判断是否命中TLB时,先比较虚拟地址,当找到表中的虚拟地址后,然后再看是不是global映射,如果是,就直接TLB hit,这时候就不用比较ASID了。如果不是global映射,最后还需要比较ASID。
TLB3.webp

参考文章:小林coding–面试官:不同进程对应相同的虚拟地址,在 TLB 是如何区分的?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
虚拟地址和物理地址是计算机系统中用来访问内存的两种地址形式。 虚拟地址是由CPU生成的,它是在逻辑上存在的地址,用于表示进程访问内存的位置。每个进程都有自己的虚拟地址空间,这使得每个进程都认为自己在独占地使用整个内存。虚拟地址可以通过多级页表转换为物理地址。虚拟地址的使用可以提供更大的地址空间,并且使多个进程可以同时运行而不相互干扰。 物理地址是实际的硬件地址,它对应于内存中的位置。物理地址是由内存管理单元(MMU)将虚拟地址转换为的地址。MMU使用页表将虚拟地址映射到物理地址。物理地址可以直接用于访问内存中的数据和指令。 TLB(Translation Lookaside Buffer)是一种高速缓存,用于加速虚拟地址到物理地址的转换。它存储了最近使用的页表项,避免了每次访问内存都要查询页表的开销。TLB通常位于CPU内部,具有快速的访问速度。当CPU访问虚拟地址时,它首先查找TLB来获取对应的物理地址,如果TLB中没有对应的映射,则需要从页表中获取,并将结果存入TLB以供下次使用。 Cache是一种高速缓存,用于存储最近使用的数据和指令。Cache位于CPU内部,具有比主内存更快的访问速度。Cache的目的是减少CPU访问主内存的次数,提高系统性能。当CPU需要访问内存中的数据或指令时,它首先查找Cache,如果Cache中有对应的数据,则可以直接使用,称为命中;如果Cache中没有对应的数据,则需要从主内存中获取,并将结果存入Cache以供下次使用,称为未命中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐锦桐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值