一.实验目的
地址翻译是计算机工作的重要组成部分。所谓地址翻译,就是将处理器发出的虚拟地址转换成用以访问存储器的物理地址的过程,其中涉及TLB、页表和高速缓存等众多复杂结构。本实验目的在于对于给定的虚拟地址以及相关数据,利用Excel自动完成TLB和Cache相关数据的计算。
二.实验内容
1.输入的参数和数据(括号内的内容代表在Excel表格中的单元格位置):
虚拟地址位数(C1)、虚拟地址VA(16进制)(A6)、物理地址位数(C2)、页大小(字节)(F1)、TLB组数(F3)、Cache块大小(字节)(I3)、Cache组数(I2)
此外还有TLB PPN(16进制)(D6),原理上来说它是通过虚拟地址从页表或TLB中读出的,但因为不方便模拟,就直接作为输入
2.输出(统一以16进制输出):
TLB Tag(B6)、TLB Index(C6)、页内偏移VPO(E6)、物理地址PA(F6)、Cache Tag(G6)、Cache Index(H6)、Cache块偏移(I6)
3.使用到的Excel函数:
(1)LEFT(text,[num_chars]):从文本字符串的第一个字符开始返回指定个数的字符。text为提取的字符对象,num_chars为要提取的字符数量,必须≥0,如果大于文本长度,则返回全部文本,如果省略则默认其值为1。
(2)RIGHT(text,[num_chars]):用法同Left,只是取数方向相反,从右侧开始取数。
(3)MID(text, start_num, num_chars):从指定位置开始提取特定数目的字符,text为提取的字符对象,start_num为文本中要提取第一个字符的位置(从1开始计数),num_chars为提取的字符个数。
(4)BASE(Number,Raxid,[Min_length]):将数字转换为具备给定基数的文本表示。Number必须是10进制数,且属于[0,2^53),Raidx是要转换成的数字的基数,Min_length可选,是返回的字符串的最小长度,若不给出,结果会省略前导零。
(5)DECIMAL(text,radix):按给定基数将数字的文本表示形式转换成十进制数。text是待转换文本,radix是该文本的基数。
(6)LOG(number,radix):根据指定底数返回数字的对数。number为想要计算的正实数,radix是对数的底。
(7)ROUNDUP(number,num_digits):朝着远离 0(零)的方向将数字进行向上舍入。number为待计算的任意实数,num_digits为将数字舍入到的位数,若取零,则该函数作用为向上取整。
(8)CONCATENATE(text1, [text2], ...):将两个或多个文本字符串联接为一个字符串。可以是文本值、数字或单元格引用。
4.原理:(图片摘自《深入理解计算机系统》P573-P574)
注意:图中的位数是以书上的例子为基础,具体位数划分应根据输入的数据和参数决定。
5.方法:
相信给出了上述函数和原理图,大家也都知道具体该怎么做了。这里有一个难点需要解释一下,Excel本来是有直接进行16进制和2进制转换的函数的(HEX2BIN和BINWHEX),但这两个函数有一个问题,就是转换后的文本最多只能是10位,否则会报#NUM!错,因此我用的方法是用10进制作为中间桥梁,就能解决这个问题。
在计算要求的输出之前,我们先计算出VA的10进制和2进制数值VA_DEC、VA_BIN,并分别放入单元格K6和L6中,便于计算:
VA_DEC = DECIMAL(A6,16)
VA_BIN = BASE(K6,2,C1)
(1)TLB Tag = BASE(P6,16,ROUNDUP((C1-LOG(F1,2)-LOG(F3,2))/4,0))
其中,P6单元格是TLB Tag的10进制值
TT_DEC = TDECIMAL(LEFT(L6,C1-LOG(F1,2)-LOG(F3,2)),2)
(2)TLB Index = BASE(Q6,16,ROUNDUP(LOG(F3,2)/4,0))
其中,Q6单元格是TLB Index的10进制值
TI_DEC = DECIMAL(MID(L6,C1-LOG(F1,2)-LOG(F3,2)+1,LOG(F3,2)),2)
(3)页内偏移VPO = BASE(R6,16,ROUNDUP(LOG(F1,2)/4,0))
其中,R6单元格是VPO的10进制值
VPO_DEC = DECIMAL(RIGHT(L6,LOG(F1,2)),2)
(4)物理地址PA:
在计算16进制PA前,先计算出2进制PA放入单元格T6
PA_BIN = CONCATENATE(BASE(DECIMAL(D6,16),2,C2-LOG(F1,2)),RIGHT(L6,LOG(F1,2)))
再计算出10进制PA放入单元格S6
PA_DEC = DECIMAL(T6,2)
则PA = BASE(S6,16,ROUNDUP(C2/4,0))
(5)Cache Tag = BASE(X6,16,ROUNDUP((C2-LOG(I3,2)-LOG(I2,2))/4,0))
其中,X6单元格是Cache Tag的10进制值
CT_DEC = DECIMAL(LEFT(T6,C2-LOG(I3,2)-LOG(I2,2)),2)
(6)Cache组 = BASE(Y6,16,ROUNDUP(LOG(I2,2)/4,0))
其中,Y6是Cache组的10进制值
CI_DEC = DECIMAL(MID(T6,C2-LOG(I3,2)-LOG(I2,2)+1,LOG(I2,2)),2)
(7)Cache块偏移 = BASE(Z6,16,ROUNDUP(LOG(I3,2)/4,0))
其中,Z6是Cache块偏移的10进制值
CO_DEC = DECIMAL(RIGHT(T6,LOG(I3,2)),2)
注意:ROUNGUP函数的作用是输出完全的16进制表示,也就是没有省略前导零。
各参数在表格中的分布图如下:(绿色为输入,黄色为输出)