您的位置:首页 > 其它

关于数据传送中 address bus 的工作原理

2009-11-25 11:24 211 查看
此贴是由:http://linux.chinaunix.net/bbs/thread-1145097-1-1.html 而引申出来的话题

贴子里,我说了,导致 非 atomic 的因是:跨 boundary 和 对内存做 RMW(read-modify-write) 操作

这里,详细说一说导致跨 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 时钟。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: