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

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 10991 | 回復(fù): 13
打印 上一主題 下一主題

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

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-11-21 18:25 |只看該作者 |倒序?yàn)g覽
此貼是由:http://linux.chinaunix.net/bbs/thread-1145097-1-1.html 而引申出來(lái)的話題

貼子里,我說(shuō)了,導(dǎo)致 非 atomic 的因是:跨 boundary 和 對(duì)內(nèi)存做 RMW(read-modify-write) 操作

這里,詳細(xì)說(shuō)一說(shuō)導(dǎo)致跨 boundary 的來(lái)龍去脈:address bus 與 data bus 的工作原理。

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

以 Pentium 為例,因?yàn)閺?Pentium 開(kāi)始 data bus 是 64 位的,但 address bus 還是 32 位。


1、 32 位的 address bus 實(shí)際上在 processor 接口上只有 29 條線,分別為: A31 ~ A3

      地址線 A2 ~ A0 是虛的,被強(qiáng)制為 0


因此: 32 位的 addres 形成如下的表格:


                 address bus(二進(jìn)制)                                      address(十六進(jìn)制)
---------------------------------------------------------------------------------
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX000                           XXXX XXX0

---------------------------------------------------------------------------------
00000000000000000000000000001000                                  00000008
00000000000000000000000000010000                                  00000010
00000000000000000000000000011000                                  00000018
00000000000000000000000000100000                                  00000020

         ... ...                                                                        ... ...
11111111111111111111111111111000                                  FFFFFFF8

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

這樣在硬件層面上保證了 quadword boundary(8 bytes) 邊界




2、 看看下面 2 個(gè)例子,說(shuō)明問(wèn)題


例1、 mov eax, dword ptr [00000007]

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


processor 會(huì)怎么處理呢?

地址值 00000007H  = 00000000000000000000000000000111 B

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

       這是因?yàn)椋篵it2 ~ bit0 被強(qiáng)制為 0, 地址 [0x00000003] 結(jié)果為 0x00000000 送上 address bus


(2)processor 使 BE7# = 0,而其它的 BE 為 1(表示讀取第 3 號(hào) byte)

       然后,processor 將 byte 送到 eax 的低 8 位。 (這是 processor 做第 1 次 read)


(3)processor 將地址 0000 0008 送上 address bus

       這是下一個(gè) quadword boundary


(4) processor 使 BE0# = 0,BE1# = 0, BE2# = 0,其它為 1(表示讀取第 0、1、2 號(hào) byte)

       然后,processor 將這 3 bytes 送上 data bus 交到 eax 高 24 位。(這是 processor 做第 2 次 read)

-----------------------------------------------------------------------------------------------
      可以看出,指令 mov eax, dword ptr [00000007] 做了 2 次 read 操作。

      這是因?yàn)?font color="red">它跨了 doubleword 邊界導(dǎo)致。




例2:指令 movq mm0, qword ptr [00000008]

      這條指令從地址 [00000008] 讀取 quadword 到 mm0(讀 64 位數(shù)據(jù)),這條指令沒(méi)有跨 quadword 邊界


processor 又怎樣做呢?

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

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


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

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


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

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




3、 關(guān)于 RMW(read-modify-write)交易,那個(gè)貼子里說(shuō)了

     RMW 交易是對(duì) 內(nèi)存進(jìn)行的。很顯然,在 RMW 交易中,地址需要是目標(biāo)操作數(shù)才可能產(chǎn)生。

     源操作數(shù)是不會(huì)產(chǎn)生 RMW 交易的。


4、 很顯然非 atomic 是因?yàn)?processor 不是做一次性交易。從 跨 boundary 和 RMW 來(lái)看。

      由于有中間交易,導(dǎo)致有可能會(huì)被其它 processor 偷取 address bus 時(shí)鐘。

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

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

LZ厲害!學(xué)習(xí)了

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

我猜在SMP下也應(yīng)該由硬件來(lái)確保其原子性~

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

例1、 mov eax, dword ptr [00000003]

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


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

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

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



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

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

你有這個(gè)質(zhì)疑是很正常的。

這里說(shuō)來(lái),比較復(fù)雜。

按理說(shuō)mov eax, dword ptr [00000003]

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

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

    但是,這只是理論上,而實(shí)際上 processor 偏偏就不是那么簡(jiǎn)單   

    雖然在硬件上做到 quadword boundary 對(duì)齊,但 processor 要保證在 doubleword 邊界上也要對(duì)齊。


這里,要引申一個(gè):“address translation ”(地址轉(zhuǎn)換)的概念

        和 processor 的 “address translation logic ” (地址轉(zhuǎn)換邏輯)      


由于:指令 mov eax, dword ptr [00000003] 訪問(wèn)的是 doubleword

      processor 將要訪問(wèn)的是 32-bit device(32位的設(shè)備)或者說(shuō) 32 位的 memory


那么 processor 會(huì):

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

       這個(gè) quadword boundary 地址值,被 address translation logic 轉(zhuǎn)換為 doubleword boundary 地址值,實(shí)際上還是 [00000000],只不過(guò)它是 doubleword boundary 值。


(2)那么 processor 將 assert BE3#,即:BE3# = 0,從 32-bit device(memory)先讀取 byte
      
        data bus 的 steering logic(轉(zhuǎn)向邏輯)將 doubleword address 中的最高 byte(BE3#)轉(zhuǎn)向 quadword address 中的 BE3# 即:3 data path ,提交到 3 data path 的 data bus


(3)然后,processor 輸出的 quadword boundary 地址值 [00000000] 再經(jīng) address translation logic 轉(zhuǎn)換為 doubleword boundary 地址值 [00000004],再 assert BE0# ~ BE2#,:BE0# ~ BE2# 為 0 再讀取剩下的 24 位數(shù)據(jù)


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

-----------------------------------------------------------------------------------------------------
    這樣,實(shí)際上,等于讀 [00000000] 地址的第 3 byte,讀 [00000004] 地址的第 0 ~ 2 bytes

    進(jìn)行了兩次讀操作。



總結(jié)一下:

★ 當(dāng) 讀/寫 doubleword 數(shù)據(jù)時(shí),address translation logic 會(huì)將 processor 輸出的 quadword boundary 地址轉(zhuǎn)換為 doubleword boundary 地址。

★ 當(dāng) 讀/寫 時(shí),data bus 的 steering logic 又會(huì)將 data 提交回 quadword boundary 地址中相對(duì)應(yīng)的 data path
    從而,實(shí)現(xiàn) doubleword boundary 對(duì)齊。

★ 但是,讀取 quadword 數(shù)據(jù)時(shí),估計(jì)是不用經(jīng)過(guò) address translation logic 的轉(zhuǎn)換。




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

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

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

★ 當(dāng) 讀/寫 doubleword 數(shù)據(jù)時(shí),address translation logic 會(huì)將 processor 輸出的 quadword boundary 地址轉(zhuǎn)換為 doubleword boundary 地址。

★ 當(dāng) 讀/寫 時(shí),data bus 的 steering logic 又會(huì)將 data 提交回 quadword boundary 地址中相對(duì)應(yīng)的 data path
    從而,實(shí)現(xiàn) doubleword boundary 對(duì)齊。

★ 但是,讀取 quadword 數(shù)據(jù)時(shí),估計(jì)是不用經(jīng)過(guò) address translation logic 的轉(zhuǎn)換。


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

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

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2009-11-22 22:35 |只看該作者
原帖由 Godbach 于 2009-11-22 22:18 發(fā)表
如果這樣解釋的話,在32bit邊界操作doubleword的話,是不是也算原子的


當(dāng)然,Intel 的文檔也有說(shuō)明:


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

還有更復(fù)雜的:

cache line boundary
page boundary

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

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



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


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

論壇徽章:
36
IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
10 [報(bào)告]
發(fā)表于 2009-11-22 23:02 |只看該作者
還有更復(fù)雜的:

cache line boundary
page boundary

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

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


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

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP