存储管理

存储管理

TLB基本原理

TLB实际上是操作系统中页表的Cache

TLB主要负责完成用户空间到物理空间的转化

  • 一般与Cache访问同时进行
  • TLB内容:虚地址(Cache的Tag),物理地址(Cache的 Data),保护位(Cache的状态)
  • TLB失效处理 • TLB失效时需要把相应页表内容从内存取到TLB
  • TLB失效时硬件(如X86的page walker)和软件(如MIPS的特殊例外)来填充TLB

TLB例外类型

  • Refill :

    • 如果查找TLB没有找到一个虚地址匹配(VPN2+ASID/G)

    • 例外入口:80000000 (除非exl=1) (由于TLB失效比较频繁,这里是一个单独的例外入口,不用查找,比较快

  • TLB invalid

    • 如果找到一个虚地址匹配项,但其v=0(无效)
    • 例外入口:80000180
    • 细分为两种:TLBL for loads, TLBS for stores
  • TLB modify :

    • 如果找到一个虚地址匹配项,其v=1,但D=0且访问为store

    • 例外入口80000180

mips tlb

TLB一项对应两个连续的物理地址(一个虚拟地址对应两项)

image-20240113204657916

TLB例外次数计算

1
Array=(int*)malloc(0x1000)

执行上面的语句后, 用户程序malloc(0x1000)返回虚地址0x450000

操作系统在该进程的vma_struct链表中记录地址范围0x450000-0x4501000为已 分配地址,可读可写。此时分配了虚拟地址但是物理地址还没有分配。

1
For (I=0;I<1024;I++) Array[i] = 0

用户程序试图写0x450000,TLB查找失败,引起一次 tlb refill例外

Tlb refill从相应页表位置取入页表内容填入TLB。但该页表还没初始化

例外返回到用户程序,重新开始访问 :TLB表项找到,但是无效,发生TLB Invalid例外

操作系统查找vma_struct,判断该地址已分配,处于可写状态,因此为它分配物理页面,并将物理地址填入页表,更新TLB ,例外返回,写操作再次重试,成功。

用户程序继续写0x450004,008…,因为TLB项已经存在,将全速运行,除非中间 发生进程切换导致其TLB项被换出。如果发生被换出的情况,再次运行时将发生 refill例外从页表取得有效内容,不会再发生invalid例外(refill例外频率>>invalid))

为什么要分成两次例外

因为TLB更容易失效,而内存(比较大)相对不容易失效。

TLB verilog简单实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
module tlb_cam(vpn_in, pfn_out, hit, valid_out); 

input [33:0] vpn_in;
output [25:0] pfn_out;
output hit;
output valid_out;

reg[60:0] cam_content [63:0];//[60:60] valid [59:34] pfn [33:0] vpn
wire [63:0] entry_hit;

assign entry_hit[0] = (vpn_in==cam_content[0][33:0]);
assign entry_hit[1] = (vpn_in==cam_content[1][33:0]);
……
assign entry_hit[63] = (vpn_in==cam_content[63][33:0]);

assign hit = |entry_hit;

assign pfn_out = {26{entry_hit[ 0]}} & cam_content[0][59:34] |
{26{entry_hit[ 1]}} & cam_content[1][59:34] |
……
{26{entry_hit[63]}} & cam_content[63][59:34];

assign valid_out = entry_hit[ 0] && cam_content[ 0][60] ||
entry_hit[ 1] && cam_content[ 1][60] ||

entry_hit[63] && cam_content[63][60];
endmodule