单处理器缓存中的字寻址



我最近看到一个单处理器缓存的描述,说它是

"字寻址(通过在处理器内的地址末尾加上"00",地址左移2,这意味着它可以寻址2^32*4=16G字节的存储器"">

我理解单词寻址意味着每个连续地址都包含一个单词的数据,而字节寻址则在每个地址包含一个字节的数据。我进一步理解,地址左移2意味着地址乘以4,所以我们试图获得4的倍数,但这不意味着每个地址都包含一个字节的数据吗?因此,这不是字寻址,而是字节寻址,处理器有一个逻辑,不管内存是什么样的,我们一次只访问一个字?

到目前为止,我很困惑的是,单词寻址是否意味着我们有逻辑来一次访问一个单词,还是实际的内存格式化为每个地址都包含一个完整的单词,而不是一个字节的

知道这个描述是从哪里来的会有帮助,但尽管如此,也许下面的内容有助于阐明可能发生的事情。

当我们谈论字节与字可寻址存储器(缓存、RAM、SSD或其他)时,我们指的是地址可以引用的最小数据宽度。无论单个位置的可寻址宽度如何,存储器仍将保存字节,这些字节按4s(字)或8s(双字)等分组在一起。与字节总是由位组成一样(在现代系统中:通常每字节8位,但情况并非总是如此。)

对于下面的exmaple,让我们假设我们有8个地址位。(尽管真正的系统通常有16到54个地址位。据我所知,没有一个系统有完整的64位地址。)

对于字节可寻址存储器,8个地址位允许我们引用2^8个位置。为了得到内存的大小,我们乘以每个寻址位置的大小(以字节为单位)。这给了我们2^8*1字节=256字节的

对于字可寻址存储器,8个地址位允许我们引用相同数量的位置(2^8)。然而,每个寻址位置的大小(以字节为单位)现在是4个字节。这给了我们2^8*4=1024字节(1KiB.)的

现在,当我们观察地址位的来源时,混乱开始出现。

假设我有两个指令集(ISA)。两者都有将地址写入内存的加载/存储指令。在一个ISA中,指令使用字节寻址。另一方面,指令使用单词寻址。

ld r1, 0x12

看看这样一条加载指令访问的内存中的字节索引,我们会在这两个ISAs中期待什么?

在字节寻址ISA中,这很容易:字节地址是0x12(十进制:18)

在ISA这个词中,它是不同的。0x12是指内存中的一个字的地址,而不是单个字节。为了将内存中的索引作为字节数,我们乘以4(每个字的字节数)。也就是说,我们将地址左移2。因此0x12变为0x48(十进制:72。)

好吧,指令集体系结构(ISA)可以定义数字的解释方式——无论是字地址还是字节地址。

此外,当涉及到缓存时,硬件的行为并不像ISA向软件工程师展示的那样整洁。

例如,现代高速缓存可以向处理器核心(或其他变体)提供双字寻址、字寻址或字节寻址的接口。在字寻址的情况下,为了存储单个字节,高速缓存控制器必须首先将字节所在的整个字加载到临时内部缓冲器中,用所存储的字节更新它,然后将该字存储回高速缓存的SRAM阵列中。这被称为读-修改-写(RMW)

请参阅是否存在缓存字节存储实际上比字存储慢的现代CPU?例如ARM Cortex-A15,其中ARM的手册解释了更新32位块的ECC(纠错码)数据是隔离字节或16位存储需要RMW的部分原因。(ARM是一个字节可寻址的ISA,与问题中描述的不同。)

RMW对于单个字节来说相对简单。例如,在字节可寻址存储器上加载/存储半个字(即2字节)更为复杂。这是因为这2个字节可能跨越自然字边界。因此,可能必须加载/存储两个完整的字才能访问单个半字。

对于字可寻址存储器,半字将(永远)是自然对齐字的底部2字节,这使得这样的2字RMW不可能/不必要。然而,也不可能直接对任何给定单词的上半个单词执行半单词加载/存储,因为单词寻址不允许直接引用该上半个词。(一些ISAs提供单独的加载/存储指令来访问单词内的不同位置,例如加载半单词/加载字节指令,该指令采用单词地址和单词内的索引。)

返回到缓存:在缓存的另一侧(主内存或其他缓存层的接口),既不使用字节寻址,也不使用字寻址。相反,使用行地址,其中一行的大小可以是64128或更多字节。

那么,这一切有什么意义呢?归根结底,这一切都取决于物理硬件资源。如果你知道某个东西是字寻址的,你不需要存储地址的底部2位,因为(如果需要的话)它们保证总是零。我们可以通过不存储/通信超过必要的比特来节省硅。我们还可以通过知道某些场景是不可能的来简化硬件逻辑(例如前面描述的拆分半字加载/存储)。知道它们是不可能情况意味着我们不需要逻辑(即硬件)来处理它们。

此外,如果您考虑对指令进行编码所需的位(在前面的两个ISA示例中的任何一个中),通过使用字寻址,ISA可以访问(/寻址)更多的内存,而不需要为每条指令提供更多的编码位。

文字寻址还提供了其他实际好处。问问自己,为什么我们没有";位寻址";?大多数内存无法逐位或逐字节访问。最多只能加载/存储整个单词或整行。因此,字寻址节省了硬件屏蔽底部两个地址位、加载一个字,然后屏蔽&移位加载的字以使其与地址对齐。

对于加载/存储,字与字节寻址的问题也与地址的(自然)对齐问题重叠。但这是另一个问题的主题。

最新更新