windows内核(5)——TLB
今天来学习一下TLB的一些细节
TLB简介
TLB(Translation Lookaside Buffer,转换后援缓冲器),是一个硬件单元,它用于保存每个进程虚拟地址到物理地址的映射,这里做的对进程的区分大概是使用 CR3 区分的,这个点看很多文章都没有提到,但是仅仅保存线性地址到物理地址的映射是必然不够的,因为不同的进程的同一线性地址不一定对应相同的物理页,但是猜测大概是这样的。
TLB 做了指令和数据的区分,ITLB专门存放指令页(可执行页),DTLB专门存放数据页(不可执行)
而根据大页与小页的区别,又可分为大页 TLB 和小页 TLB。将线性地址右移一定位数(页内偏移的位数,小页12,2-9-9-12大页为 21,10-10-12 大页为 22)
这里就可以分为四种了。
- 第一组:缓存一般页表(4K字节页面)的指令页表缓存(Instruction-TLB);
- 第二组:缓存一般页表(4K字节页面)的数据页表缓存(Data-TLB);
- 第三组:缓存大尺寸页表(2M/4M字节页面)的指令页表缓存(Instruction-TLB);
- 第四组:缓存大尺寸页表(2M/4M字节页面)的数据页表缓存(Data-TLB)
TLB 的结构可以视为一张表格
虚拟页帧 | 物理页帧 | 属性 | 命中次数 |
---|---|---|---|
0x1234 | 0x1010 | r-x | 5 |
0x1111 | 0x1000 | r-x | 3 |
上表为例,假设是 ITLB,小页,那么这里有两个条目,分别是:
- 线性地址 0x1234000 对应了物理地址 0x1010000。
- 线性地址 0x111000 对应了物理地址 0x1000000。
这里的属性不一定只有读写属性,可能还有一系列的其它属性。
这里有以下注意的点
- 不同的CPU,TLB大小不同。
- 只要 CR3 发生变化,TLB立即刷新,一核一套TLB。
- G位只对大页 PDE 和 PTE 有效,当 G 位为 1 时,刷新 TLB 将不会刷新 PTE。
- G位为1的页,当TLB写满时,根据命中次数的字段计算访问频率,将最近一段时间内未被访问的条目驱逐。
TLB探测
其实很简单,尝试分配两个页,一个写 a,一个写 b,先将 a 的物理页挂到 0 地址,读取;再将 b 的物理页挂到 0 地址,再次读取,如果读取得到的值一样,就证明了缓存是存在的。
参考文献
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 xia0ji233's blog!