2012-02-11 60 views
1

我正在研究從內存(RAM,硬盤)讀取單個位。我的理解是,一個字節不能少於一個字節。 但是我讀過一個人告訴它可以用匯編完成。 我不希望帶寬使用率儘可能低,要檢索的數據不是連續的,所以我不能讀取一個字節並將其轉換爲8位。從內存中讀取一點

+0

你是什麼意思,「數據不連續」? – 2012-02-11 11:48:22

+0

我從整個內存中的不同位置選擇位,並且不能讀取位串。 – RobotRock 2012-02-11 11:53:57

+0

所以你的意思是*訪問*不是順序的。 – 2012-02-11 11:59:50

回答

4

我不認爲CPU會讀取比RAM緩存行的大小(最近的英特爾芯片上的64字節)。從磁盤上看,最小值通常是4kB。

由於數據總線比這個寬得多,所以一次只讀一個數據位既不可能也不必要。

+0

方式更好回答:-) – cnicutar 2012-02-11 12:17:21

1

您不能從我知道的任何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 
0

它曾經是,說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字節。