说一说:关于数据传送中 address bus 的工作原理
这里,详细说一说导致跨 boundary 的来龙去脉:address bus 与 data bus 的工作原理。
--------------------------------------------------------------------------------------------
以 Pentium 为例,因为从 Pentium 开始 data bus 是 64 位的,但 address bus 还是 32 位。
1、 32 位的 address bus 实际上在 processor 接口上只有 29 条线,分别为: A31 ~ A3
地址线 A2 ~ A0 是虚的,被强制为 0
因此: 32 位的 addres 形成如下的表格:
address bus(二进制) address(十六进制)
---------------------------------------------------------------------------------
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX000 XXXX XXX0
---------------------------------------------------------------------------------
00000000000000000000000000001000 00000008
00000000000000000000000000010000 00000010
00000000000000000000000000011000 00000018
00000000000000000000000000100000 00000020
... ... ... ...
11111111111111111111111111111000 FFFFFFF8
----------------------------------------------------------------------------------------
这样在硬件层面上保证了 quadword boundary(8 bytes) 边界
2、 看看下面 2 个例子,说明问题
例1、 mov eax, dword ptr [00000007]
这条指令从地址 [7] 的地方读取 doubleword 到 eax, 这条指令是典型的跨 doubleword boundary
processor 会怎么处理呢?
地址值 00000007H = 00000000000000000000000000000111 B
(1)processor 将地址 0000 0000 送上 address bus(32 位)
这是因为:bit2 ~ bit0 被强制为 0, 地址 [0x00000003] 结果为 0x00000000 送上 address bus
(2)processor 使 BE7# = 0,而其它的 BE 为 1(表示读取第 3 号 byte)
然后,processor 将 byte 送到 eax 的低 8 位。 (这是 processor 做第 1 次 read)
(3)processor 将地址 0000 0008 送上 address bus
这是下一个 quadword boundary
(4) processor 使 BE0# = 0,BE1# = 0, BE2# = 0,其它为 1(表示读取第 0、1、2 号 byte)
然后,processor 将这 3 bytes 送上 data bus 交到 eax 高 24 位。(这是 processor 做第 2 次 read)
-----------------------------------------------------------------------------------------------
可以看出,指令 mov eax, dword ptr [00000007] 做了 2 次 read 操作。
这是因为它跨了 doubleword 边界导致。
例2:指令 movq mm0, qword ptr [00000008]
这条指令从地址 [00000008] 读取 quadword 到 mm0(读 64 位数据),这条指令没有跨 quadword 边界
processor 又怎样做呢?
(1)processor 将地址 00000008 送上 address bus(32 位)
00000008 符合 A2 ~ A0 为 0 的规则。它是 quadword 边界值
(2)processor 将 BE0# ~ BE7# 全部置为 0 (表示使用全部 8 个 data path)
然后,processor 将 quadword 送上 data bus(8 个 data path)
(3) 从而完成了一次读取 64 位数据的传送,processor 只做了 1 次 read 工作
这是典型的 quadword boundary 对齐,是属于 atomic 交易。
3、 关于 RMW(read-modify-write)交易,那个贴子里说了
RMW 交易是对 内存进行的。很显然,在 RMW 交易中,地址需要是目标操作数才可能产生。
源操作数是不会产生 RMW 交易的。
4、 很显然非 atomic 是因为 processor 不是做一次性-交易。从 跨 boundary 和 RMW 来看。
由于有中间交易,导致有可能会被其它 processor 偷取 address bus 时钟。
文章来源CU社区:说一说:关于数据传送中 address bus 的工作原理
相关文章