绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
说一说:关于数据传送中 address bus 的工作原理
2020-06-22 14:11:35

这里,详细说一说导致跨 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 的工作原理


分享好友

分享这个小栈给你的朋友们,一起进步吧。

内核源码
创建时间:2020-05-18 13:36:55
内核源码精华帖内容汇总
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 飘絮絮絮丶
    专家
戳我,来吐槽~