(計算機組織) 計算機組織摘要-Memory
我是根據張凡老師的講義整理的筆記 我想說可以考前看比較快!!!
Memory Function
- OS copy Data 到 Memory Procedure
- Procedure的Code處理資料

Memory Structure
- 記憶體就像一個很大的「一維陣列」,而位址(2進制編碼)就像這個陣列的「索引」,從 0 開始。
Memory Addressing
- 一個Address如果只放一Byte的Data,叫做Byte Addressing
- 一個Address如果只放一Word的Data,叫做Word Addressing
- Word Addressing 對CPU存取有益 一次丟4的倍數的位置 可對齊

Memory Capacity
- 假設 Address 有
k個位元
則格子數總共有 $2^k$ 個 - 假設 資料量有
8個bit - 則Capacity為
$$
格子數 \times 資料量 = 2^k \times 8(bits) = 2^k \times 1(byte)
$$

1. Control Line(控制線)
- Read Line / Write Line 都是 Control Line
- Read 與 Write 不可同時為
1- 避免同一個週期同時讀寫造成衝突
- 通常同一時間只會是:
Read=1, Write=0(讀)Read=0, Write=1(寫)Read=0, Write=0(不動作 / idle)
2. Address Line(位址線)
- Address Line 有幾條 = Address 有幾個 bit
- 若 Address Line =
k條- 可定址位置數(Memory locations)
[
M = 2^k
]
- 可定址位置數(Memory locations)
- 你筆記的重點:
- 32 條 Address Line → 32-bit address → (2^{32}) 個位址
- 這個位址寬度是系統/ISA(例如 MIPS 常見)設定的概念,不是 ALU 之類的單元「自己決定」就能改
3. Data Line(資料線)
- Data Line 通常跟 CPU 的資料寬度(word size / bus width)相關
- 一次可以傳輸多少資料,取決於 Data Line 寬度
- 以 MIPS 常見情境:
- 一次抓一個運算元(1 word)= 4 bytes
- 因此常見 Data Line = 32-bit
注意:Data Line 表示「一次傳輸的寬度」,不一定代表「每個 address 對應多少 bytes」。
4. Memory Address(位址本身)
- Memory Address 的 bit 數 = Address Line 的條數
- 若 Address Line = 32 條:
- address 範圍:
0 ~ 2^32 - 1
- address 範圍:
5. 為什麼不能隨便代換(很重要)
- Address Line 多少就決定格子數(locations)多少:(2^k)
- 所以不能在不改前提下,把 (2^{32}) 隨便換成:
1G × 4 bytes2G × 2 bytes- 等等
- 因為這些換法等於你偷偷改了:
- Address Line 的條數(k),或
- 每個位址對應的大小(byte / word addressing)
6. 一句話總結
- Control line 決定「讀/寫」且讀寫不可同時 1
- Address line 決定「有幾個位址(格子數)」:(2^k)
- Data line 決定「一次搬多少資料(傳輸寬度)」
- 線數定了,格子數就定了,不能亂換

Byte/Word Addressing
- 丟一次Address開四格
- Data Line 32 bits 為 4bytes
- MMU (Memory Management Unit)
- CPU 只要換 MMU 就會換

例題:
題目一 :
The Sequential word addresses in machine with byte addressing differ by one
- Ans : False
- byte addressing :
- 每個位址對應 1 byte
- 但 1 word = 好幾個 bytes(常見 4 bytes)
- 如果改成Word Addressing 就會成立
Memory Read/Write operation
-
Read(讀取)的流程
- CPU 把 address=500 放到 Address Line
- CPU 把 MemRead=1、MemWrite=0 放到控制線
- Memory 依 address 找到
Memory[500] - Memory 把該內容放到 Data Line
- CPU 從 Data Line 取值,寫回暫存器:
$s1 ← Memory[500]
-
Write(寫入)的流程
- CPU 把 address=200 放到 Address Line
- CPU 把「要寫入的資料」放到 Data Line(例如 $t1 的值是 1736)
- CPU 把 MemRead=0、MemWrite=1 放到控制線
- Memory 在該 address 位置寫入 Data Line 的值:
Memory[200] ← 1736
Memory Alignment (對齊)
什麼是 Alignment(對齊)?
在 byte addressing 的機器中,每個 address 對應 1 byte。
但 CPU 常常一次要讀/寫 word(4 bytes) 或 halfword(2 bytes),因此硬體會規定「一次抓多個 byte」時,起始位址必須落在特定邊界,這就叫 alignment(對齊)。
題目
0) 核心觀念:什麼叫 aligned / misaligned?
- 對齊 (aligned):位址是「資料大小」的倍數
- size = 2^k bytes ⇒ address 的 最低 k bits 必須全為 0
- 未對齊 (misaligned):不滿足上述條件
等價判斷:
- aligned ⇔
addr % size == 0 - misaligned ⇔
addr % size != 0
1) 題型 A:32-bit word(4 bytes)哪些位址是 misaligned?
32-bit word = 4 bytes ⇒ 需要 4-byte aligned ⇒
addr % 4 == 0才 aligned
也就是位址最後兩個 bit 必須是00
題目選項:
- (a)
4N + 2 - (b)
4N + 3 - ©
8N + 4 - (d)
4N - (e)
8N + 1
其中 N 是整數 (N ≥ 0)
判斷方法:看對 4 取餘數
4N⇒mod 4 = 0✅ aligned4N + 2⇒mod 4 = 2❌ misaligned4N + 3⇒mod 4 = 3❌ misaligned8N + 4⇒8N mod4=0且4 mod4=0⇒mod4=0✅ aligned8N + 1⇒8N mod4=0⇒mod4=1❌ misaligned
✅ 答案: (a), (b), (e)
2) 題型 B:判斷某位址在「某個對齊單位」下是否 aligned
常見對齊單位(都是 2 的次方):
- word size 4B = 2^2 ⇒ 低 2 bits = 0
- word size 8B = 2^3 ⇒ 低 3 bits = 0
- cache line 32B = 2^5 ⇒ 低 5 bits = 0
- page size 8KB = 2^13 ⇒ 低 13 bits = 0
快速技巧(十六進位最好用)
- 1 個 hex digit = 4 bits
- 要檢查低 k bits 是否為 0:看最後幾個 hex digit 是否符合
- k=2 (4B):最後一個 hex digit 必須是 0/4/8/C
- k=3 (8B):最後一個 hex digit 必須是 0/8
- k=5 (32B):最後 5 bits=0 ⇒ 最後一個 hex digit 要是 0,且倒數第二個 hex digit 的最低 1 bit 要是 0
3) 題型 B(題目給的四個敘述)逐條整理
題目:
a) word size = 4 bytes,32-bit address 0xF00ABCCC is aligned
b) word size = 8 bytes,32-bit address 0xF00ABCCC is aligned
c) cache line size = 32 bytes,32-bit address 0xF0ABCCE0 is aligned
d) page size = 8KB,32-bit address 0xF0ABCC00 is aligned
(a) 4 bytes 對齊:0xF00ABCCC
- 4B 對齊要
addr % 4 == 0 - 看最後一個 hex digit:
...CCC的最後一碼是C(=12) C是 0/4/8/C 其中之一 ⇒ 低 2 bits = 0
✅ aligned ⇒ (a) True
(b) 8 bytes 對齊:0xF00ABCCC
- 8B 對齊要
addr % 8 == 0 - 最後一個 hex digit 必須是 0 或 8(低 3 bits = 0)
- 這裡最後一碼是
C(=1100₂),低 3 bits = 100 ≠ 000
❌ not aligned ⇒ (b) False
© 32 bytes 對齊:0xF0ABCCE0
- 32B 對齊要
addr % 32 == 0(低 5 bits 全 0) ...E0:最後 1 byte 是0xE0(=1110 0000₂)- 低 5 bits 是
00000
✅ aligned ⇒ © True
(d) 8KB 對齊:0xF0ABCC00
- 8KB = 8192 = 2^13 ⇒ 低 13 bits 全 0
0x...CC00只有低 8 bits = 0(最後兩個 hex digit 是 00)
但要低 13 bits = 0 還需要再多 5 bits 也是 0(等價於最後至少要能整除 0x2000)0xCC00不是 0x2000 的倍數(通常 8KB 對齊會看到最後是...0000或特定能被 0x2000 整除的形式)
❌ not aligned ⇒ (d) False
✅ 答案: (a), ©
4) 速記
- 4B 對齊:最後 hex digit ∈ {0,4,8,C}
- 8B 對齊:最後 hex digit ∈ {0,8}
- 16B 對齊:最後 hex digit = 0
- 32B 對齊:最後 2 個 hex digit 必須是 {00,20,40,60,80,A0,C0,E0}
- 4KB 對齊(2^12):最後 3 個 hex digit = 000
- 8KB 對齊(2^13):要能被 0x2000 整除(低 13 bits = 0)
Memory Endianness (位元組序)
名詞:Byte / Word / MSB / LSB
- 32-bit data = 4 bytes(一個 word = 4 個 byte)
- MSB (Most Significant Byte):最高位元組(最重要的 byte)
- LSB (Least Significant Byte):最低位元組(最不重要的 byte)
- 例如 32-bit 數值寫成 4 個 byte:
[B3 B2 B1 B0]B3 = MSB,B0 = LSB
Endianness 決定什麼?
決定「同一個 word 的 4 個 byte」要怎麼放進 memory 的連續位址中
(假設 word-aligned 起始位址是4N,則該 word 會用到4N, 4N+1, 4N+2, 4N+3)
Big Endian(大端)
定義
- 最小位址放 MSB,最大位址放 LSB
- “Big” 的意思是「大的那端(MSB)放前面(小位址)」
4-byte mapping(從 4N 開始存一個 32-bit word)
| Address | 存的 byte |
|---|---|
4N |
B3 (MSB) |
4N + 1 |
B2 |
4N + 2 |
B1 |
4N + 3 |
B0 (LSB) |
例子
若 32-bit value = 0x12 34 56 78(B3=12, B2=34, B1=56, B0=78)
Big Endian 存法:
mem[4N] = 0x12mem[4N+1] = 0x34mem[4N+2] = 0x56mem[4N+3] = 0x78
Little Endian(小端)
定義
- 最小位址放 LSB,最大位址放 MSB
- “Little” 的意思是「小的那端(LSB)放前面(小位址)」
4-byte mapping(從 4N 開始存一個 32-bit word)
| Address | 存的 byte |
|---|---|
4N |
B0 (LSB) |
4N + 1 |
B1 |
4N + 2 |
B2 |
4N + 3 |
B3 (MSB) |
例子
同樣 value = 0x12 34 56 78
Little Endian 存法:
mem[4N] = 0x78mem[4N+1] = 0x56mem[4N+2] = 0x34mem[4N+3] = 0x12
題目
題型 1:哪些 32-bit hex 在 Big/Little endian 下「memory 儲存序列相同」?
觀念
32-bit = 4 bytes,把資料寫成 4 個 byte:
- 32-bit 資料 =
[w x y z](w=MSB, z=LSB)
存進 byte-addressable memory 時:
- Big endian:
w x y z - Little endian:
z y x w(整個 4-byte 順序反轉)
要「兩者儲存序列一模一樣」 ⇒ 必須滿足:
[w x y z] = [z y x w]- 所以 w = z 且 x = y
- 也就是 4 bytes 要長成:
[A B B A](回文 / 鏡像)
口訣:32-bit 要在兩種 endian 下存法一樣 ⇒ 4 個 byte 必須是「左右對稱」
套到選項(把 8 個 hex digits 視為 4 bytes:每 2 個 hex = 1 byte)
a) AABBAABB → bytes = AA BB AA BB(w=AA, x=BB, y=AA, z=BB)
- w≠z(AA≠BB) ❌
b) ABBAABBA → bytes = AB BA AB BA
- w≠z(AB≠BA) ❌
c) ABBBBBAB → bytes = AB BB BB AB
- w=z=AB 且 x=y=BB ✅
d) ABCDCDAB → bytes = AB CD CD AB
- w=z=AB 且 x=y=CD ✅
e) ABCDDCBA → bytes = AB CD DC BA
- w≠z(AB≠BA)且 x≠y(CD≠DC) ❌
✅ 答案: ©, (d)
題型 2:用 Little-endian 填入字串(每 row = 4 bytes)
題目:把 personal record "Tom Lien" 填入表格,假設 每列 4 bytes,使用 little-endian。
重要觀念(很容易搞混)
- 字元在記憶體中的「位址順序」仍然是照 address 由小到大放進去
- 但題目說「用 little-endian」通常表示:每 4 bytes 當作一個 word,word 內部 byte 反過來放
- 也就是:每 4 個字元一組
[c0 c1 c2 c3]
little-endian 存成[c3 c2 c1 c0]
- 也就是:每 4 個字元一組
以 "Tom Lien" 為例(忽略空白通常當作字元也可以放;投影片的答案是把 8 個字元排成兩個 word)
投影片呈現的 8 個字元為:T o m + L i e n(共 8 bytes)
分成兩個 4-byte word
- Word0(第 0~3 byte):
T o m(缺的那格可視為空白或下一字元,投影片做法是顯示成反轉後的排列) - Word1(第 4~7 byte):
L i e n
Little-endian:每個 word 內反轉
- Word0:
[T o m ?]→ memory 依序放成? m o T - Word1:
[L i e n]→ memory 依序放成n e i L
依投影片表格(位址 0~7)的填法
| Addr | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| Content | (空/補位) | m | o | T |
| Addr | 4 | 5 | 6 | 7 |
|---|---|---|---|---|
| Content | n | e | i | L |
你只要記得:little-endian = 同一個 word 內的 byte 反過來
所以"Lien"會在 memory 變成n e i L
快速總結
- 32-bit endian 存法相同 ⇔ 4 bytes 必須是
[A B B A](左右對稱) - little-endian 填字串(每 4 bytes 一列):每列 4 個字元 反過來放
容量表
| Decimal Term | Abbreviation | Value | Binary term | Abbreviation | Value |
|---|---|---|---|---|---|
| KiloByte | KB | $10^3$ | Kibibyte | KiB | $ 2^{10} $ |
| MegaByte | KB | $10^6$ | Mibibyte | MiB | $ 2^{20} $ |
| GigaByte | KB | $10^{9}$ | Gibibyte | GiB | $ 2^{30} $ |
| TeraByte | KB | $10^{12}$ | Tibibyte | TiB | $ 2^{40} $ |
| PetaByte | KB | $10^{15}$ | Pibibyte | PiB | $ 2^{50} $ |
| ExaByte | KB | $10^{18}$ | Exbibyte | EiB | $ 2^{60} $ |
| ZettaByte | KB | $10^{21}$ | Zebibyte | ZiB | $ 2^{70} $ |
| YottaByte | KB | $10^{24}$ | Yobibyte | YiB | $ 2^{80} $ |