天天看點

MMU記憶體管理單元之ASID位址空間辨別符1. ARM32至ARM64的蛻變

文章目錄

  • 1. ARM32至ARM64的蛻變
    • 1.1 ARM32的TLB機制
    • 1.2 ASID(位址空間辨別符)
      • 1.2.1 ARM32的TTBR0寄存器格式
      • 1.2.2 ARM64的TTBR0寄存器格式
    • ARM64的TLB機制

1. ARM32至ARM64的蛻變

  從ARM32到ARM64不止将處理器從32位更新到了64位,還有許多性能的技術也得到了極大的提升,光是個頭長了可不行啊!能耐也得跟着長啊!哈哈哈

1.1 ARM32的TLB機制

MMU記憶體管理單元之ASID位址空間辨別符1. ARM32至ARM64的蛻變

  如上圖所示,上一講我們講了TLB的每一條表項都有一個bit用來表示自己是全局的(核心空間)還是本地的(使用者空間)。當程序發生切換是,作業系統必須将TLB中緩存使用者空間轉換關系的表項全部清空,以保證下一個程序不會使用上一個程序的位址轉換關系。

  這樣,在ARM32中每切換一次程序就需要刷一次TLB表中的本地表項,如果程序切換的頻繁,處理器損失的性能是比較大的。

1.2 ASID(位址空間辨別符)

  上一篇文章我們提到了雞肋的FCSE技術,其實從ARMv6開始,ARM就反對使用任何FCSE機制。到了ARMv7時代,FCSE是可選的,直到ARMv7多處理架構才徹底淘汰了FCSE(起碼從白皮書上搜這個關鍵字是找不到了),到了ARMv8,處理器迎來了64位的時代,ASID技術已經早已成熟。

  ASID這項技術在ARMv7多處理器架構就開始使用了,隻不過在ARMv7裡,ASID是8位的,也就是256就溢出了,而在ARMv8架構中,ASID可以配置為16位,也就是計到65536才會溢出,ASID位數擴大的好處文章後面會講。為每一個程序配置設定一個ASID的話,256個就溢出了,是以在Linux中ASID溢出後就要重新洗牌了。

  說到ASID,還要從ARM的TTBR寄存器開始說起,前面文章我們講過了MMU的TTBR寄存器,但是并沒有給出TTBR寄存器的bit描述,這裡列出ARM32和ARM64的TTBR寄存器格式描述。

1.2.1 ARM32的TTBR0寄存器格式

MMU記憶體管理單元之ASID位址空間辨別符1. ARM32至ARM64的蛻變

1.2.2 ARM64的TTBR0寄存器格式

MMU記憶體管理單元之ASID位址空間辨別符1. ARM32至ARM64的蛻變

  可以看出在ARM32的TTBR寄存器裡是沒有ASID這個屬性的,粗暴點的說,作業系統切換程序其實就是切頁表,切頁表就是改寫TTBR寄存器的值,那麼很容易知道Linux會為每一個程序配置設定一個獨用的ASID碼,Linux為每個為程序配置設定的ASID值都不相同。

  這麼一來,MMU再做頁表轉換時也會把目前的ASID值緩存到TLB快表裡,

ARM64的TLB機制

MMU記憶體管理單元之ASID位址空間辨別符1. ARM32至ARM64的蛻變

  有了ASID後,TLB跟以前也不一樣了,在程序切換的時候,作業系統也不需要去刷TLB了,因為MMU在做位址轉換時會将TLB表項裡的ASID和目前程序的ASID值做比較,隻有ASID值相等,MMU才認為這條表項是我需要的。

  是以和沒有ASID技術的ARM32相比,ARM64在程序切換上提升了較大的性能。

繼續閱讀