我正在回答一些与虚拟内存相关的问题,并希望在澄清或确认我对这些内容的完成方面有所帮助。
问题如下:
给定一个具有32位字的字节可寻址系统,虚拟地址空间为4千兆字节,物理地址空间为1千兆字节,页面大小为4千字节。假设页表条目向上舍入为4个字节。
a)页面表的大小是多少?
b)现在假设实现了4路组关联转换后备缓冲区,总共256个地址转换。计算其标记和索引字段的大小。
我的答案如下:
A:
页表的大小等于页表中的条目数乘以条目的大小。
页表中的条目数等于内存大小除以页面大小:2 ^ 32/2 ^ 12 = 2 ^ 20。
条目的大小等于字大小减去用于页表中条目数的位:32-20 = 12。
因此,页表大小为:(2 ^ 20)* 12位= 12582912位= 1572864字节
但是,我发现this(在“页面大小”标题下),它使用的数字基本相同。
页表大小=((虚拟地址空间大小)/(页面大小))*(页表条目大小) =(4 GB / 4 KB)* 4 B = 4 MB
哪个答案是对的?
接下来,B:
我不确定如何计算B部分。我相信标签是通过添加块数加上偏移量加上索引来计算的。这是一个4路组关联,因此每组中有4个块。索引是8位,因为基本索引大小是10位并且减少2,这也是因为它是4路组关联。但是,我不知道如何计算偏移量,这是帮助计算标记所需的。
非常感谢任何帮助。
答案 0 :(得分:5)
对于a部分,你犯了两个错误。首先,问题明确指出“页表条目四舍五入为4个字节”。其次,PTE包含根据页面对齐的地址确定物理地址所需的位。在所描述的系统中,物理地址仅为30位(1 GiB)。由于该系统使用4KiB页面,因此PTE中物理地址的最低有效12位将全为零,因此可以是隐含的。因此,仅需要18位(30-12)的物理地址。
除了需要舍入到两个字节的幂之外,大多数PTE还包括附加数据,例如有效位,修改位,访问位以及用户和管理员模式的权限位;因此,即使使用512 MiB物理地址空间和8 KiB页面(指示物理地址需要16位),也不能使用2字节PTE。
(应该注意的是,没有32位处理器会使用平面页表。对于32位地址,通常使用分层或线性页表。这会为完全占用带来一点额外的空间开销,并且可能需要多个内存访问以查找转换,但在部分占用和密集分配的常见情况下,它们使用的内存大大减少。这一点尤为重要,因为大多数处理器都是针对多个地址空间操作系统而设计的,其中每个进程都有自己的页表。在页表中仅支持100个进程的物理内存[400 MiB]可以理解为没有吸引力。)
对于b部分,正确的是4路组关联意味着每组中有4个块,因此根据条目数从索引所需的位数中减去2位。但是,log2(256)为8而不是10,因此只有6位用于索引TLB。
在数据高速缓存中,标记大小将等于地址位数减去索引位数减去偏移位数(在高速缓存块内)。
对于TLB,虚拟地址与页面大小对齐(页面中的最低有效位是未翻译的)。对于4 KiB页面,这意味着忽略12个最低有效位。使用32位虚拟地址,这会留下20位。
这些位中的6位用于索引已经确定,因此剩下14位。
对于非群集TLB,每个标记与一个转换相关联。这相当于1字节的数据高速缓冲存储器块大小(即0个偏移位)。因此,标记(不包括任何地址空间ID)将为14位。
(在集群TLB中[类似于扇区缓存块],为每个“条目”提供两个或更多翻译 - 条目变得不太明确,因为它可以引用翻译条目或标签的组合以及与该标签相关的多个翻译。[我怀疑你很欣赏这些复杂性不属于这些问题。])