2011-06-24 59 views
1

我有興趣瞭解CPU如何從總線寬度爲32位的機器上的物理內存中讀取單個字節和字。經過一段時間的搜索後,我發現了各種源,說明控制總線字節使能線用於影響與數據總線的字節相對應的四個單獨存儲體的存儲體激活。在32位系統上傳輸<4字節數據

據我所知,只有可以被4整除的地址才被放置到地址總線上。但是,是否所有四個字節都讀入數據總線,然後丟棄一些未使用的字節?例如,假設帶有32位數據總線的CPU決定從位置1開始讀取一個字(我知道由於數據對齊,這不太可能)。讀取此字的方法是:

  1. 將地址0置於地址總線上。
  2. 將字節0,1,2和3放置到數據總線上。
  3. 丟棄字節0和3(清除它們各自的比特)
  4. 使得字節1是在第三行和字節2是在第4個銀行
  5. 調度重新安排在數據總線上字節1和2將數據總線上的值更改爲控制單元內寄存的存儲器數據。
+2

我不得不說*至少取決於架構*。 – 2011-06-24 02:50:38

+0

@pst這是一個x86,如果這有助於 –

回答

2

非常多的依賴於建築類的東西。除此之外,你有處理器總線,也許在其他支持芯片的另一邊,可能是dram或pcie或其他也有其自己的規則和細微差別的接口。或者如果芯片有多個接口,那麼每個接口可能會有所不同。

這幾天你會看到你描述的東西。

讀取比寫入具有更多的靈活性,因爲例如您的存儲器或外圍系統可以像所有內容一樣簡單,因爲所有內容都是32位,並且靠近處理器的存儲器接口可以選擇和操作字節通道而無需外設或內存知道。有時候你確實有字節選擇線,告訴外設我所關心的是這些字節通道,而外設可以選擇笨拙而簡單,只需將所有四個字節放在那裏,或者只填寫請求的字節並保持其他線路懸空或者用陳舊的數據驅動或驅動高或低。有些系統希望你右對齊或左對齊數據,所以如果你想要地址爲0x01的字節,存儲器接口可能期望結果字節位於最左邊或最右邊的字節通道上,這取決於字節順序(我並不是將此答案限制爲順便說一下x86)。

寫入需要一些更多的細節,如果你有一個系統允許你(系統已定義)你可以寫入單個字節,但總線是32位的系統,那麼你可以有右對齊或左對齊的東西,並指定地址和大小。或者你可以做bytelane的事情,雙方都必須從正確的字節通道中選擇數據。在這種情況下,要寫入的外設將需要管理讀 - 修改 - 寫操作(寫入包含0x12345678的32位存儲器時,地址0x02處的字節0x55在寫入完成時將導致0x12555678,此時外設必須讀取0x12345678修改一個字節,然後將32位寫回內存

x86是一個非常痛苦的平臺,它允許未對齊的訪問,許多其他平臺強制內存對齊,使代碼更容易,執行更順暢,並且存儲器接口和外圍設備更簡單(邏輯更少,功耗更低,除性能外更少)。因此,對於像這樣的系統,您仍然擁有用於單個字節訪問的字節通道,但不必擔心32位寫入地址0x01,通常在x86上處理,例如兩次訪問,一個24位地址1和一個8位於地址0,這就是爲什麼不對齊的原因,儘管在x86平臺上合法性不好,所以你的性能減半。對齊意味着32位訪問只能在較低兩位爲零(2個電源爲2個字節或4個字節),0x0,0x04,0x08,0x0c,0x10等的地址上.16位訪問位於功率1的邊界,地址的低位爲零,0x0 0x02 0x04 0x06 0x08。並且字節在字節邊界上,2到電源0,0x01 0x02 0x03 0x04等

在一些系統上,一般如何在x86系統上處理當前的數據,例如當你有DRAM(DDR等)時, ,尤其是具有ecc功能的ram接口,在存儲器層本身,只能寫入完整的N位數量,例如64位,帶有8位ecc,因爲他們必須計算64位數據中的8位ecc位咬住並一次寫入全部72位,當讀回時,全部72位被讀取和檢查,如果64位數據返回給用戶/程序。通常情況下,所有這些都是通過緩存層進行的,高速緩存的優點之一在於它位於處理器和更大的內存系統之間。至少在讀取的情況下,您可能需要讀取一個字節,但高速緩存可能會讀取128位,或者高速緩存行的大小,通常是存儲器的整數個單位。該緩存行停留在緩存中,當您寫入剛剛讀取的字節旁邊的一個字節,或者可能是同一個字節時,它將修改該緩存中的該字節,最終當它必須從內存中逐出該數據時,它會寫入整個緩存行回來,在內存很好的整體單位。字節寫入緩存未命中並且類似的事情仍然涉及讀取 - 修改 - 寫入。

有或沒​​有高速緩存系統有時,處理器上或接近處理器的存儲器接口管理讀取修改寫入,並確保只有以字對齊的方式訪問外圍設備或主存儲器(其中一個字是16或32或64無論內存系統定義爲該總線的大小)。

昨天我在看舊的x86引腳,忘了數據和一些地址總線在同一個引腳上。存儲週期和數據部分有地址週期,處理器和外設必須改變方向或至少使用某種方法來管理總線。這裏的要點是,在x86架構的歷史中,事情已經發生了變化並不斷變化。所以這個答案是特定於體系結構的,不能僅限於x86,你必須針對引腳/焊盤佈局以及與之配套的芯片組。 ARM在其生命週期中也發生了變化,並且有時會提供具有不同接口選項的相同內核(例如AXI 32位或AXI 64位)。

Dram還增加了刷新的複雜性,所以某個地方的人必須不斷地通過內存保持活動狀態,在由處理器或緩存驅動的訪問之間。同樣,ecc增加了複雜性,如果存在單個位錯誤,理想情況下需要用修正的位執行回寫。因此,字節讀取可能導致32位寫入,與軟件的操作無關。如果沒有回寫機制,那麼擁有ecc保護是非常愚蠢的,只是使用奇偶校驗,或者沒有。

我實際上並不熟悉的wishbone接口,但看到它在整個opencores中使用,可能是您可以查看和感受的東西。同樣,任何x86系列產品都將擁有或者至少包含舊系列的硬件參考手冊,用於描述芯片邊緣的內存/ I/O接口的時序。對於ARM,你可以谷歌的amba和axi,如果你得到他們的緩存trm的(技術參考手冊)(免費提供武器網站),你可能會得到一些洞察他們的內存接口如何工作。同樣的DDR引腳和細節應該可以從供應商或甚至在維基百科上獲得。DDR和QDR更加有趣,因爲你可以在半個時鐘週期內發生事情,傳統上,每個時鐘週期或多個時鐘週期只改變一次總線,現在我們在時鐘週期的中間階段正在發生變化,可以有一個時鐘輸出存儲設備和一個單獨的時鐘從存儲器設備回來,以允許跡線長度損失,並試圖幫助這個半時鐘週期的事情。這是非常混亂的,這使得它更容易回到舊的芯片(808x,6502,6800,z80等),並查看他們的內存總線,並繼續前進。在嘗試潛入PCI或PCIe之前,同樣看看ISA。

哇,很長的答案,對不起,希望它是有幫助的。

+0

@ dwelch-感謝您在回答我的問題時的努力 - 它確實有助於解釋和澄清我之前閱讀的內容。 –