我正在研究從內存(RAM,硬盤)讀取單個位。我的理解是,一個字節不能少於一個字節。 但是我讀過一個人告訴它可以用匯編完成。 我不希望帶寬使用率儘可能低,要檢索的數據不是連續的,所以我不能讀取一個字節並將其轉換爲8位。從內存中讀取一點
從內存中讀取一點
回答
我不認爲CPU會讀取比RAM緩存行的大小(最近的英特爾芯片上的64字節)。從磁盤上看,最小值通常是4kB。
由於數據總線比這個寬得多,所以一次只讀一個數據位既不可能也不必要。
方式更好回答:-) – cnicutar 2012-02-11 12:17:21
您不能從我知道的任何PC或硬盤讀取少於一個字節。即使你可以,它也是非常低效的。
有些機器會執行內存映射端口io,它可以讀/寫少於一個字節的數據到端口,但當您至少獲得一個字節時,它仍會顯示出來。 1位
char someByte = 0x3D; // In binary, 111101
bool flag = someByte & 1; // Get the first bit, 1
flag = someByte & 2; // Get the second bit, 0
// And so on. The number after the & operator is a power of 2 if you want to isolate one bit.
// You can also pick off several bits like so:
int value = someByte & 3; // Assume the lower 2 bits are interesting for some reason
它曾經是,說386/486天,其中存儲器是一個位寬,1兆,但你:
使用位運算符摘下特定位爲將有8個或多個芯片,每個總線上的一個比特線一個,你只能讀取總線的寬度。今天的內存是一個字節寬,你只能讀取32或64或其倍數的單位。即使讀取一個字節,大部分設計都會填充整個字節。它增加了不必要的複雜性/成本,爲了將總線隔離到內存中,字節讀取看起來對大多數系統是32位或64位讀取,因爲它接近處理器的邊緣(有時是物理引腳,有時是芯片內核的邊緣)是當單獨的字節通道被分離出來而其他位被丟棄時。讓緩存在內存中改變最小的可分辨讀取大小後,您將看到突發或讀取塊。
有可能設計一個8位寬的存儲器系統,每次讀取8位數據,但你爲什麼要這樣做?除非它是一個8位處理器,您可能無法利用8位乘2閃存的優勢。無論如何,dram非常慢,如133 mhz(即使你的1600mhz記憶體只是從緩慢的部分讀取時短暫的爆發,內存在10年內沒有變得更快)。
硬盤類似但不同,我認爲扇區是最小的可分割單元,你必須讀或寫這些單元。所以在讀取時你在處理器上有一個內存週期,沒有什麼不同,進入一個內存,並且根據控制器在讀取之前或者結果,一個扇區被讀取到一個緩衝區中,不像一個高速緩存線讀取,然後你的內存週期到磁盤控制器的緩衝區或者導致總線寬度讀取,並且處理器將其分開,或者如果總線增加複雜性以隔離字節通道,則隔離一個字節,但沒有人隔離位通道。 (我說這個詞沒有人,有人會回來,除了......)
大部分這是有據可查,不難找到。對於手臂平臺,可以免費下載amba和/或axi規格。 PC和其他平臺都可以使用橋接器,pcie控制器,磁盤控制器文檔。它仍然歸結爲一個地址和數據總線,或者一個數據總線和一個指示訪問類型的控制信號。一些總線具有字節通道使能,這通常用於寫入而不是讀取。如果我想在現代64位系統中只寫一個字節給一個dram,那麼我必須告訴每個人幾乎所有的方法,我想寫的東西。要在必須一次訪問64位的內存模塊上寫入一個字節,至少要將64位讀取發送到緩存或內存控制器的臨時位置,然後要寫入的字節會修改內存中的特定字節64位字,那麼64位數量最終會被寫回到內存模塊本身。您可以使用地址位和一些控制信號的組合來完成此操作,也可以將8字節通道啓用,並且可以忽略較低的地址位。硬盤,同樣的交易,必須讀取扇區,修改一個字節,然後最終一次寫入整個扇區。使用flash和eeprom,你只能寫零(從程序員的角度來看),你可以擦除(從程序員的角度來看,實際上是邏輯上的零,有一個反轉),寫入必須是一個扇區時間,扇區通常可以是64字節,128字節,256字節。
- 1. 內存讀取從SqlDataReader的
- 2. 從內存中一次讀取一條記錄中的XML內存
- 3. 從「.exe」+ offset中讀取內存?
- 4. Boost :: GIL從內存中讀取圖像
- 5. 從文件中讀取動態內存
- 6. C++從共享內存中讀取
- 7. 從內存中讀取phar文件?
- 8. 從文件中讀取內存不足
- 9. C++從內存中讀取1位?
- 10. 從內存中讀取數據mmap
- 11. 從vb.net的內存中讀取XML
- 12. 使用libxml2從內存中讀取DTD
- 13. Django和xlrd,從內存中讀取
- 14. Segfault從共享內存中讀取
- 15. 在鏈表中讀取下一個節點的內存位置
- 16. 從內存中讀取「char」比讀取「word」更快嗎?
- 17. 從內存中讀取Big Endian並增加內存
- 18. 讀取內存中的位
- 19. 讀取x86內存
- 20. 讀取內存流
- 21. 讀取內存流
- 22. 上下文中,存儲內部存儲器,並從中讀取
- 23. 從PackagePart流讀取不釋放內存
- 24. pthread從共享內存讀取
- 25. sqlalchemy,從mysql讀取並寫入內存
- 26. 從16位PE讀取內存地址
- 27. 從內部存儲文件(Android)讀取
- 28. 從內部存儲讀取ArrayList
- 29. 從內部存儲讀取文件
- 30. FD_SET從無效內存地址讀取?
你是什麼意思,「數據不連續」? – 2012-02-11 11:48:22
我從整個內存中的不同位置選擇位,並且不能讀取位串。 – RobotRock 2012-02-11 11:53:57
所以你的意思是*訪問*不是順序的。 – 2012-02-11 11:59:50