亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 10989 | 回復: 13
打印 上一主題 下一主題

說一說:關于數(shù)據(jù)傳送中 address bus 的工作原理 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 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 位數(shù)據(jù)),這條指令沒有跨 quadword 邊界


processor 又怎樣做呢?

(1)processor 將地址 00000008 送上 address bus(32 位)

       00000008 符合 A2 ~ A0 為 0 的規(guī)則。它是 quadword 邊界值


(2)processor 將 BE0# ~ BE7#  全部置為 0 (表示使用全部 8 個 data path

       然后,processor 將 quadword 送上 data bus(8 個 data path)


(3) 從而完成了一次讀取 64 位數(shù)據(jù)的傳送,processor 只做了 1 次 read 工作

        這是典型的 quadword boundary 對齊,是屬于 atomic 交易。




3、 關于 RMW(read-modify-write)交易,那個貼子里說了

     RMW 交易是對 內存進行的。很顯然,在 RMW 交易中,地址需要是目標操作數(shù)才可能產生。

     源操作數(shù)是不會產生 RMW 交易的。


4、 很顯然非 atomic 是因為 processor 不是做一次性交易。從 跨 boundary 和 RMW 來看。

      由于有中間交易,導致有可能會被其它 processor 偷取 address bus 時鐘。

[ 本帖最后由 mik 于 2009-11-22 22:27 編輯 ]

論壇徽章:
1
天蝎座
日期:2013-10-23 21:11:03
2 [報告]
發(fā)表于 2009-11-21 19:20 |只看該作者
剛看到“硬件層面上保證了 quadword boundary(8 bytes) 邊界”還在想是不是就不存在邊界對齊,后又想
是不是需要通過地址偏移來讀取數(shù)據(jù);看完后明白了,總體上來看也是靠計算偏移來獲取對應的數(shù)據(jù)

LZ厲害!學習了

論壇徽章:
0
3 [報告]
發(fā)表于 2009-11-21 23:03 |只看該作者
這樣的原子性只在SMP環(huán)境中要考慮吧~

我猜在SMP下也應該由硬件來確保其原子性~

論壇徽章:
36
IT運維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
4 [報告]
發(fā)表于 2009-11-22 10:07 |只看該作者
mik兄又有好文章了,多謝啊。

例1、 mov eax, dword ptr [00000003]

       這條指令從地址 [3] 的地方讀取 doubleword 到 eax, 這條指令是典型的跨 doubleword boundary


對于上面這個地方,有點不太理解,這里本身8個字節(jié)的boundary,那么從地址[3]開始的話,距離邊界還有5個字節(jié)。因此,這條指令就不會跨越邊界了吧。

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

論壇徽章:
0
5 [報告]
發(fā)表于 2009-11-22 21:37 |只看該作者
原帖由 godbach 于 2009-11-22 10:07 發(fā)表
mik兄又有好文章了,多謝啊。



對于上面這個地方,有點不太理解,這里本身8個字節(jié)的boundary,那么從地址[3]開始的話,距離邊界還有5個字節(jié)。因此,這條指令就不會跨越邊界了吧。

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

你有這個質疑是很正常的。

這里說來,比較復雜。

按理說mov eax, dword ptr [00000003]

    從這個地址值 [00000003] 讀取 doubleword 到 eax
    那么 processor 把 quadword boundary 的地址 [00000000] 放在 address bus 上,
    然后,BE3# = 0, BE4# = 0, BE5# = 0, BE6# = 0 其它為 1,用這種方式就可以讀取 doubleword 數(shù)據(jù)。

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

    但是,這只是理論上,而實際上 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 位數(shù)據(jù)


(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 數(shù)據(jù)時,address translation logic 會將 processor 輸出的 quadword boundary 地址轉換為 doubleword boundary 地址。

★ 當 讀/寫 時,data bus 的 steering logic 又會將 data 提交回 quadword boundary 地址中相對應的 data path
    從而,實現(xiàn) doubleword boundary 對齊。

★ 但是,讀取 quadword 數(shù)據(jù)時,估計是不用經過 address translation logic 的轉換。




這樣,果真非常復雜,我自已也捉摸不透~

論壇徽章:
0
6 [報告]
發(fā)表于 2009-11-22 21:39 |只看該作者
這樣做,目的是保證 word, doubleword 和 quadword 邊界都對齊吧。

論壇徽章:
36
IT運維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
7 [報告]
發(fā)表于 2009-11-22 22:15 |只看該作者
總結一下:

★ 當 讀/寫 doubleword 數(shù)據(jù)時,address translation logic 會將 processor 輸出的 quadword boundary 地址轉換為 doubleword boundary 地址。

★ 當 讀/寫 時,data bus 的 steering logic 又會將 data 提交回 quadword boundary 地址中相對應的 data path
    從而,實現(xiàn) doubleword boundary 對齊。

★ 但是,讀取 quadword 數(shù)據(jù)時,估計是不用經過 address translation logic 的轉換。


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

論壇徽章:
36
IT運維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
8 [報告]
發(fā)表于 2009-11-22 22:18 |只看該作者
如果這樣解釋的話,在32bit邊界操作doubleword的話,是不是也算原子的

論壇徽章:
0
9 [報告]
發(fā)表于 2009-11-22 22:35 |只看該作者
原帖由 Godbach 于 2009-11-22 22:18 發(fā)表
如果這樣解釋的話,在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運維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
10 [報告]
發(fā)表于 2009-11-22 23:02 |只看該作者
還有更復雜的:

cache line boundary
page boundary

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

在上面邊界上對齊,都是保證 atomic 的前提之一,如果不對齊是不能保證 atomic


嗯,多謝mik兄。這兩個boundary也在你的上一篇講述atomic的帖子中看到了。
看來數(shù)據(jù)操作中boundary還不少啊。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP