什麼是記憶體?
從軟體的角度,記憶體可以想像成一塊連續的儲存空間,最小的儲存單位是位元組(Byte)。
雖然可以操縱位元(bit),但還是以位元組(Byte)為最小單位做儲存。
例如:
用雞蛋盒對照記憶體,雞蛋盒就是儲存空間,一個雞蛋就是最小的儲存單位。
如何指定存取哪些記憶體位元組?
記憶體可以儲存相當多的位元組(Byte),為了指定要存取哪一個,每一個位元組(Byte)都有一個號碼做代表,就是記憶體位址(Memory Address),因為是連續的儲存空間,所以記憶體位址(Memory Address)也是連續的。
例如:
以 4GB 記憶體來說 (GB 的 G 是 2 的 30 次方,而 B 是 Byte)
可以儲存 2 的 32 次方個位元組(Bytes) = 4,294,967,296 個位元組(Byte)
因記憶體位址從 0 開始,所以範圍就是從 0 到 4,294,967,295
一次可以存取多少位元組?
雖然記憶體位址是以位元組(Byte)來編號,但存取時可以"一次"存取(從硬體角度)多個位元組(Byte)。
例如:
以 C 語言來說(假設編譯成64位元程式)
"一次"可以存取如下 (運行在64位元CPU,記憶體寬度為64位元)
char = 1個位元組(1-Byte) = 8位元(8-bit)
short = 2個位元組(2-Byte) = 16位元(16-bit)
int = 4個位元組(4-Byte) = 32位元(32-bit)
long = 8個位元組(8-Byte) = 64位元(64-bit)
資料如何寫入記憶體?資料從記憶體被讀取到哪裡?
不考慮 DMA 與 cache,當程式要做運算時,其實是 CPU 讀取記憶體的資料後放到 CPU 的暫存器(register)做運算,而運算結果也是從 CPU 的暫存器(register)寫回到記憶體。因此提到存取記憶體,就要想到暫存器(register)。
什麼是位元組順序 Endianness?什麼是 Big endian?什麼是 Little endian?
指的是多位元組(Multibyte)資料儲存在記憶體的順序
因為"一次"對記憶體寫入或讀取一個位元組(Byte)沒有順序問題
但是"一次"對記憶體寫入或讀取多個位元組(Multibyte)會有順序問題
而 Big endian 與 Little endian 就是兩種不同的儲存順序
底下圖片說明,從記憶體寫入或讀取4-Byte時,Big endian 與 Little endian 的差異
說明:
1. 圖中 Memory 下的 A, A+1, A+2, A+3 指的是記憶體位址,A 是低記憶體位址,
A+3是高記憶體位址。
2. 圖中 Register 上的 24, 16, 8, 0 指的是第幾位元(bit),0 是 LSB。
沒有留言:
張貼留言