免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9821 | 回复: 13

说一说:关于数据传送中 address bus 的工作原理 [复制链接]

论坛徽章:
0
发表于 2009-11-21 18:25 |显示全部楼层
此贴是由: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 时钟。

[ 本帖最后由 mik 于 2009-11-22 22:27 编辑 ]

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
发表于 2009-11-21 19:20 |显示全部楼层
刚看到“硬件层面上保证了 quadword boundary(8 bytes) 边界”还在想是不是就不存在边界对齐,后又想
是不是需要通过地址偏移来读取数据;看完后明白了,总体上来看也是靠计算偏移来获取对应的数据

LZ厉害!学习了

论坛徽章:
0
发表于 2009-11-21 23:03 |显示全部楼层
这样的原子性只在SMP环境中要考虑吧~

我猜在SMP下也应该由硬件来确保其原子性~

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2009-11-22 10:07 |显示全部楼层
mik兄又有好文章了,多谢啊。

例1、 mov eax, dword ptr [00000003]

       这条指令从地址 [3] 的地方读取 doubleword 到 eax, 这条指令是典型的跨 doubleword boundary


对于上面这个地方,有点不太理解,这里本身8个字节的boundary,那么从地址[3]开始的话,距离边界还有5个字节。因此,这条指令就不会跨越边界了吧。

不知道我的理解是否正确?

论坛徽章:
0
发表于 2009-11-22 21:37 |显示全部楼层
原帖由 godbach 于 2009-11-22 10:07 发表
mik兄又有好文章了,多谢啊。



对于上面这个地方,有点不太理解,这里本身8个字节的boundary,那么从地址[3]开始的话,距离边界还有5个字节。因此,这条指令就不会跨越边界了吧。

不知道我的理解是否正确?

你有这个质疑是很正常的。

这里说来,比较复杂。

按理说mov eax, dword ptr [00000003]

    从这个地址值 [00000003] 读取 doubleword 到 eax
    那么 processor 把 quadword boundary 的地址 [00000000] 放在 address bus 上,
    然后,BE3# = 0, BE4# = 0, BE5# = 0, BE6# = 0 其它为 1,用这种方式就可以读取 doubleword 数据。

----------------------------------------------------------------------------------------------

    但是,这只是理论上,而实际上 processor 偏偏就不是那么简单   

    虽然在硬件上做到 quadword boundary 对齐,但 processor 要保证在 doubleword 边界上也要对齐。


这里,要引申一个:“address translation ”(地址转换)的概念

        和 processor 的 “address translation logic ” (地址转换逻辑)      


由于:指令 mov eax, dword ptr [00000003] 访问的是 doubleword

      processor 将要访问的是 32-bit device(32位的设备)或者说 32 位的 memory


那么 processor 会:

(1)先将 quadword boundary 地址值 [00000000] 放在 address bus 上,

       这个 quadword boundary 地址值,被 address translation logic 转换为 doubleword boundary 地址值,实际上还是 [00000000],只不过它是 doubleword boundary 值。


(2)那么 processor 将 assert BE3#,即:BE3# = 0,从 32-bit device(memory)先读取 byte
      
        data bus 的 steering logic(转向逻辑)将 doubleword address 中的最高 byte(BE3#)转向 quadword address 中的 BE3# 即:3 data path ,提交到 3 data path 的 data bus


(3)然后,processor 输出的 quadword boundary 地址值 [00000000] 再经 address translation logic 转换为 doubleword boundary 地址值 [00000004],再 assert BE0# ~ BE2#,:BE0# ~ BE2# 为 0 再读取剩下的 24 位数据


(4)data bus 的 steering logic 再将 doubleword address(即:[00000004])的低 24 位转向 quadword address 中的 4 ~ 6 data path,提交到 4 data path, 5 data path 和 6 data path 的 data bus 上

-----------------------------------------------------------------------------------------------------
    这样,实际上,等于读 [00000000] 地址的第 3 byte,读 [00000004] 地址的第 0 ~ 2 bytes

    进行了两次读操作。



总结一下:

★ 当 读/写 doubleword 数据时,address translation logic 会将 processor 输出的 quadword boundary 地址转换为 doubleword boundary 地址。

★ 当 读/写 时,data bus 的 steering logic 又会将 data 提交回 quadword boundary 地址中相对应的 data path
    从而,实现 doubleword boundary 对齐。

★ 但是,读取 quadword 数据时,估计是不用经过 address translation logic 的转换。




这样,果真非常复杂,我自已也捉摸不透~

论坛徽章:
0
发表于 2009-11-22 21:39 |显示全部楼层
这样做,目的是保证 word, doubleword 和 quadword 边界都对齐吧。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2009-11-22 22:15 |显示全部楼层
总结一下:

★ 当 读/写 doubleword 数据时,address translation logic 会将 processor 输出的 quadword boundary 地址转换为 doubleword boundary 地址。

★ 当 读/写 时,data bus 的 steering logic 又会将 data 提交回 quadword boundary 地址中相对应的 data path
    从而,实现 doubleword boundary 对齐。

★ 但是,读取 quadword 数据时,估计是不用经过 address translation logic 的转换。


多谢mik兄。分析的很是清晰。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2009-11-22 22:18 |显示全部楼层
如果这样解释的话,在32bit边界操作doubleword的话,是不是也算原子的

论坛徽章:
0
发表于 2009-11-22 22:35 |显示全部楼层
原帖由 Godbach 于 2009-11-22 22:18 发表
如果这样解释的话,在32bit边界操作doubleword的话,是不是也算原子的


当然,Intel 的文档也有说明:


word   ---> word boundary
dword ---> doubleword boundary
qword ---> quadword boundary

还有更复杂的:

cache line boundary
page boundary

-------------------------------------------------------

在上面边界上对齐,都是保证 atomic 的前提之一,如果不对齐是不能保证 atomic



但是:上面只是前提之一,如果是做 RMW (read-modify-write)交易的话,还要加 lock 才行


像指令:lock add dword ptr [eax], 1

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2009-11-22 23:02 |显示全部楼层
还有更复杂的:

cache line boundary
page boundary

-------------------------------------------------------

在上面边界上对齐,都是保证 atomic 的前提之一,如果不对齐是不能保证 atomic


嗯,多谢mik兄。这两个boundary也在你的上一篇讲述atomic的帖子中看到了。
看来数据操作中boundary还不少啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP