在C中,每個字節都是可單獨尋址的。假設一個整數(比如使用4個字節)的地址爲0xaddr
(這是32位,假設我們有一個32位處理器,32位地址總線和32位數據總線),假設整數值爲0x12345678
。現在,如果我從內存中獲取此值,處理器如何執行此操作?處理器是否在地址線上放置了0xaddr
(即32位地址),然後取出8位數據說0x12
。然後處理器將在地址線上步進0xaddr+1
,然後取一個整數的4個字節的另一個8位數據0x34
等等。或者處理器只是放置0xaddr
並一次讀取4個字節,從而利用其完整的32位數據總線?如何從RAM中獲取數據?
回答
This is a well known article由描述內存訪問的GNU C庫引導(特別是在x86-當前PC系統中)。它比你可能需要的更詳細。
整篇文章跨越許多地區蔓延:
- Introduction
- CPU Caches
- Virtual Memory
- NUMA Support
- Programmers
- More Programmers
- Performance Tools
- Future
- Appendices
有一件事我要補充到gbulmer的回答是,在許多系統中獲取數據流是比你從得到一個字預期更快。換句話說,選擇你想要讀取的地方需要一些時間,但是你選擇了一個,從那個點讀取,然後是下一個32或64或任何位,然後下一個...比切換到一些無關的地方和閱讀另一個值。
什麼支配現代編程不是從主板上的內存獲取行爲,而是數據是否在CPU緩存中。
如果您在網上搜索「計算機體系結構」,您可能會得到一些問題的答案。
對於您的具體問題,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來查看其總線週期。
- 1. 如何從RAM中拯救數據?
- 2. 如何從參數中獲取數據
- 3. 如何從數組中獲取數據
- 4. 如何從數組中獲取數據?
- 5. 如何從QNX中獲取CPU負載/ RAM使用情況?
- 6. 如何從sql中獲取組數據?
- 7. 如何從LinkedList中獲取數據?
- 8. 如何從POST中獲取數據json
- 9. 如何從URL中獲取數據
- 10. 如何從mongodb中獲取數據?
- 11. 如何從表格中獲取數據
- 12. jQuery - 如何從JSON中獲取數據?
- 13. 如何從sqllite表中獲取數據
- 14. 如何從數據庫中獲取
- 15. 如何從字符中獲取數據
- 16. 如何從散列中獲取數據?
- 17. 如何從$ .post中獲取數據
- 18. 如何從數據庫中獲取id?
- 19. 如何從JSON中獲取數據Extjs
- 20. 如何從表格中獲取數據
- 21. 如何從數據庫中獲取url
- 22. 如何從firebase中獲取數據
- 23. 如何從對象中獲取數據
- 24. 如何從JavaScript中獲取JSON數據?
- 25. 如何從QTableView中獲取數據?
- 26. 如何從數據庫中獲取值
- 27. 如何從php中獲取數據
- 28. 如何從列表中獲取數據
- 29. 如何從表單中獲取數據?
- 30. 如何從swift中獲取數據?
這取決於。你在說什麼確切的處理器? IIRC 8086有一個16位數據總線。許多較新的型號(奔騰及以上)都有一個64位FSB。 – harold 2012-03-17 14:49:44
@harold:你可以讓我知道它對於不同的處理器有何不同。我一般會問,而不是針對任何處理器。它將如何完成說8088有16位數據總線,以及如何爲32位數據總線和64位?謝謝 – mezda 2012-03-17 14:54:18
它比簡單的數據總線複雜得多,還有緩存 – 2012-03-17 14:56:54