2012-03-17 350 views
5

在C中,每個字節都是可單獨尋址的。假設一個整數(比如使用4個字節)的地址爲0xaddr(這是32位,假設我們有一個32位處理器,32位地址總線和32位數據總線),假設整數值爲0x12345678。現在,如果我從內存中獲取此值,處理器如何執行此操作?處理器是否在地址線上放置了0xaddr(即32位地址),然後取出8位數據說0x12。然後處理器將在地址線上步進0xaddr+1,然後取一個整數的4個字節的另一個8位數據0x34等等。或者處理器只是放置0xaddr並一次讀取4個字節,從而利用其完整的32位數據總線?如何從RAM中獲取數據?

+0

這取決於。你在說什麼確切的處理器? IIRC 8086有一個16位數據總線。許多較新的型號(奔騰及以上)都有一個64位FSB。 – harold 2012-03-17 14:49:44

+0

@harold:你可以讓我知道它對於不同的處理器有何不同。我一般會問,而不是針對任何處理器。它將如何完成說8088有16位數據總線,以及如何爲32位數據總線和64位?謝謝 – mezda 2012-03-17 14:54:18

+0

它比簡單的數據總線複雜得多,還有緩存 – 2012-03-17 14:56:54

回答

5

This is a well known article由描述內存訪問的GNU C庫引導(特別是在x86-當前PC系統中)。它比你可能需要的更詳細。

整篇文章跨越許多地區蔓延:

  1. Introduction
  2. CPU Caches
  3. Virtual Memory
  4. NUMA Support
  5. Programmers
  6. More Programmers
  7. Performance Tools
  8. Future
  9. Appendices

有一件事我要補充到gbulmer的回答是,在許多系統中獲取數據流是比你從得到一個字預期更快。換句話說,選擇你想要讀取的地方需要一些時間,但是你選擇了一個,從那個點讀取,然後是下一個32或64或任何位,然後下一個...比切換到一些無關的地方和閱讀另一個值。

什麼支配現代編程不是從主板上的內存獲取行爲,而是數據是否在CPU緩存中。

4

如果您在網上搜索「計算機體系結構」,您可能會得到一些問題的答案。

對於您的具體問題,32位計算機,32位數據和地址總線,爲一個簡單的情況下,沒有混淆硬件。它將從32位寬的內存中讀取32位數據。

這是20世紀70年代後期以來作爲微型計算機(例如DEC VAX)存在的硬件,仍作爲微處理器(x86,ARM,Cortex-A8,MIPS32)以及某些微控制器(例如ARM,Cortex- M3,PIC32等)。

最簡單的情況:地址總線是一組將地址信號傳送到存儲器的信號(線),再加上一些信號來傳送存儲器是從「讀出」還是「寫入」(數據方向)以及地址和數據方向線上的信號是否有效。就你的例子而言,可能有32條線路用於傳送地址的位模式。

數據總線是第二組電線,用於與內存之間的通信。內存可能會斷言一個信號來表示數據是有效的,但它可能只是足夠快,一切都「正常」。當處理器將地址寫入地址信號時,表示要從存儲器中讀取數據(數據方向爲'讀'),存儲器將檢索存儲在該地址的值,並將其寫入數據總線信號。處理器(經過適當的延時和信號後)將對數據總線進行採樣,這就是它使用的數值。

處理器可能會讀取整個32位,並在內部提取一個字節(如果這是所有指令要求的話),或者外部地址總線可能提供額外信號,以便可以構建外部存儲器系統以提供適當的字節,雙字節或四字節值。多年來,ARM處理器架構的版本只能讀取整個32位,而較小的部分e,g,一個字節在內部提取。

你可以在http://www.cpu-world.com/info/Pinouts/68000.html 看到這種信號設置的例子該芯片只有一個24位地址總線和一個16位數據總線。 它有兩個信號(UDS和LDS),它們表示正在使用高位數據信號,低位數據信號還是兩者。

我發現在research.cs.tamu.edu/prism/lectures/mbsd/mbsd_l15.pdf 相當詳細的解釋,我發現通過搜索「68000內存總線週期」。

您可能需要尋找MIPS,ARM或x86來查看其總線週期。