動機

這書真的很厚,光是第二章就佔了全書的一半,所以就一章一篇吧

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後面的指令
      • cache coherence (cache中的資料有效嗎)
        • MESI protocal
          • cache與mem一致
            • E: 獨佔態(只有我有這資料且與mem一樣)
            • S: 共用態(多人有這資料且與mem一樣)
          • 不一致
            • I: 無效態
            • M: 修改態 (只有我有這資料)
          • 監聽protocal (另一種叫directory protocal)
          • 在4個動作做state transfer
            • 讀寫mem
            • 讀寫cache
    • superscalar arch: 一次發射多條指令
    • reg rename:
      1. 消滅WAR, WAW
      2. 當某cmd出事時不會影響到後面的指令

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
    • set mapping
      • 多張表,讓同index撞的機率變小
  • 從哪個addr取cache index
    • VIVT
      • virtual index, virtual tag
        • cache alias
          • 一個實體addr可以map到多個cache line
          • 當假addr換了,就要clear或invalidate cache
    • VIPT
      • virtual index, physical tag
        • 可以同時查TLB與跑MMU
          • 不用怕當假addr換了,就要clear或invalidate cache
        • 但還是可能有cache alias
    • PIPT
      • physical index, physical tag
  • 從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]
  • cache與linux kernel的關係是
    • kernel大部分資料結構都是與cache line對齊的
      • 不然會橫跨兩條以上的cache line需要invalidate時會把另一個也一起劃掉
  • cache evict策略
    • random
    • fifo
    • lru
  • 多process與TLB關係?
    • 多process會讓VA常常需要去換PA,這很慢
    • 所以有TLB去cache,以page為單位
      • 如果process很大,可以適時把page size拉大,讓TLB不容易爆cache