動機
這書真的很厚,光是第二章就佔了全書的一半,所以就一章一篇吧
cpu
- risc & cisc
- cisc有micro operation!!
- big, little endian
union {
int a;
char b;
} x;
x.a = 1;
return (x.b == 1); // true for little-endian
- 執行過程
- 課本款: IF > ID > EX > MEM > WB
- x86
- from L1 cache
- IF+branch predition
- ID
- translate into micro operation(uops)
- dispatch (out-of-order exec)
- rename (int, float)
- scheduler
- EXE
- commit results (in-order)
- WB (by LSQ)
- to L1 cache
- arm
- from L1 cache
- IF+branch predition
- ID (可以多路,cortex-A9是2路)
- rename (reg)
- dispatch (out-of-order exec, 可以多路,這裡是4路)
- EXE
- WB (by LSU(LSQ in x86))
- to L1 cache
- unit
- LSQ: 處理memory consistency & cache coherence
- memory consistency (Read/write的順序是不是對的)
- strict consistency
- sequential consistency
- weak consistency
- 有資料指令與同步指令(mem barrier)
- mem barrier in arm
- data mem barrier: 前面的讀寫操作都完成才會commit DMM後面的結果
- data sync barrier: 前面的讀寫操作都完成才會執行DSB後面的指令
- instraction sync barrier: flush pipeline或是buffer後才開始拿ISB後面的指令
- mem barrier in arm
- 有資料指令與同步指令(mem barrier)
- cache coherence (cache中的資料有效嗎)
- MESI protocal
- cache與mem一致
- E: 獨佔態(只有我有這資料且與mem一樣)
- S: 共用態(多人有這資料且與mem一樣)
- 不一致
- I: 無效態
- M: 修改態 (只有我有這資料)
- 監聽protocal (另一種叫directory protocal)
- 在4個動作做state transfer
- 讀寫mem
- 讀寫cache
- cache與mem一致
- MESI protocal
- memory consistency (Read/write的順序是不是對的)
- superscalar arch: 一次發射多條指令
- reg rename:
- 消滅WAR, WAW
- 當某cmd出事時不會影響到後面的指令
- LSQ: 處理memory consistency & cache coherence
cache
- 結構
- set: 同一index的cache line(想成有很多張表)
- line:
len(mx[i])
(不包含tag, cache line大小一般來說是32Bytes) - way: matrix(表)
- tag: cache line的MD5
- index, offset:
mx[index][offset]
- map 方式
- direct mapping
- 只有一張表,所以很容易與其他index相同的資料撞
- cache thrashing
- addr: tag[31:6], index[5:4], line[3:2], …[1:0]`
- line是
mx[i][j]
的j,index就是i
- line是
- 只有一張表,所以很容易與其他index相同的資料撞
- set mapping
- 多張表,讓同index撞的機率變小
- direct mapping
- 從哪個addr取cache index
- VIVT
- virtual index, virtual tag
- cache alias
- 一個實體addr可以map到多個cache line
- 當假addr換了,就要clear或invalidate cache
- cache alias
- virtual index, virtual tag
- VIPT
- virtual index, physical tag
- 可以同時查TLB與跑MMU
- 不用怕當假addr換了,就要clear或invalidate cache
- 但還是可能有cache alias
- 可以同時查TLB與跑MMU
- virtual index, physical tag
- PIPT
- physical index, physical tag
- VIVT
- 從virtual addr到physical addr的過程
- cpu -> MMU -> cache -> 查page table
- 在aarch64
- virtual addr(VA):
ttbx[64:63], ...[62:48], L0index[47:39], L1index[38:30], L2index[29:21], L3index[20:12], VA[11:0]
- ttbx有兩個register(ttbx0,ttbx1)分別是高位與低位的page table的base addr
- 之後就是用index去每一層table去換下一層的addr
- page size: 64KB, 16KB, 4KB
- physical addr(PA):
...[64:63], ...[62:48], PA(from table)[47:12], PA(from virtual addr)[11:0]
- virtual addr(VA):
- cache與linux kernel的關係是
- kernel大部分資料結構都是與cache line對齊的
- 不然會橫跨兩條以上的cache line需要invalidate時會把另一個也一起劃掉
- kernel大部分資料結構都是與cache line對齊的
- cache evict策略
- random
- fifo
- lru
- 多process與TLB關係?
- 多process會讓VA常常需要去換PA,這很慢
- 所以有TLB去cache,以page為單位
- 如果process很大,可以適時把page size拉大,讓TLB不容易爆cache