分页:快速地址转换(TLB)

Wednesday, October 30, 2019

分页:快速地址转换(TLB)

前面我们已经了解到,地址映射信息一般存储在物理内存里,要拿到实际物理地址,要进行多一次内存访问,这样每次进行内存操作的时候都需要额外读一次内存,大幅度降低效率。

所以我们可以增加一个硬件来帮忙,这就是地址转换旁路缓冲存储器(TLB),每次访问内存,先检查 TLB 是否存在符合的映射,如果有就直接完成转换,没有再去访问页表。

TLB 的基本算法

首先从虚拟地址中提取虚拟号,然后放到 TLB 中去查找是否有命中,如果命中了则直接返回物理帧号,加上偏移量就是实际的物理地址了。

如果没命中,则由硬件去访问页表,并进行地址转换,更新 TLB,当 TLB 更新成功后,系统会重新尝试该指令,这次TLB有了 这个转换映射,访问速度会很快。

我们需要做的就是,尽量避免 TLB 未命中。

另外,页的大小也会对命中结果产生较大的影响,如果页比较大,一页就可以存多项数据,这样 TLB 会有更高的命中率,典型的页大小一般是4KB,所以对于密集的,基于数组的访问会实现极好的 TLB 性能,每页访问只会遇到一次未命中。

谁处理 TLB 未命中

一般来讲,复杂指令集的硬件(CISC)是由硬件全权处理 TLB 未命中的,为了做到这一点,硬件必须知道页表在内存中的确切位置(通过页表基址寄存器),以及页表的确切格式。

而精简指令集(RISC)有软件管理 TLB,发生 TLB 命中时,硬件系统会抛出一个异常,然后将转为内核模式,跳转至陷进处理程序(trap handler),交给操作系统去处理。软件管理的方法主要优势是灵活,操作系统可以用任意数据结构来实现页表,不需要改变硬件。

TLB的内容

典型的 TLB 有32,64,128项,是全相联的,意味着一条地址映射可能存在 TLB 中的任意位置,硬件会并行的查找 TLB。

一条 TLB 项可能是这样的: VPN | PFN | 其他位

TLB 通常有一个有效位,来标记是否有效的地址映射,还有保护位,标识是否有访问权限。

上下文切换对 TLB 的处理

我们知道,TLB 里面的内存转换,都是只对当前进程有效的,如果进行了进程切换,该怎么处理呢。

简单点的方法就是,每次切换,都把 TLB 清空,但是这样性能太低了。

我们可以在 TLB 中添加一个 ASID 空间标识符,用来标识该项是属于哪个进程,这样就解决了上述的问题。

OS19.1

TLB替换策略

具体来说,就是当 TLB 插入新项时,需要替换掉旧的,那么该替换哪一个?

常见的策略比如最近最少使用 LRU,随机策略等。

OS

分页:较小的表

分页