ver0.1
[看前序文章有驚喜,關注W\X\G=Z+H=“浩瀚架構師”,可以解鎖全部文章]
前言
前文我們對SMMU的系統架構和基本功能做了簡要的介紹,現在大家大致對SMMU在基于ARM體系的系統架構下的總線位置和產品形態有了基本的了解。這里我們還是簡單做個前情回顧,從總線架構角度看過去:
(1) CPU內部就有MMU他要統擴整個VMSA空間,管理好VA到IPA再到PA的各個空間,重要性就沒法形容了。
(2) 越來越多的總線IP也在內部集成SMMU,典型如GPU。這樣在驅動程序的配合下,GPU自身就可以管理離散內存,實現整個系統性能提升和功能擴展。要說缺點就是貴,畢竟是獨占的,哈哈。
(3) 還有就是常見的一種形態存在,各個IP-Core共享的模態存在。這種架構模態下,可以讓總線上的各個功能單元共享,可以有效降低成本,就是會增加軟件維護的工作量。
無論以哪種模態出現,SMMU和MMU的核心功能都是地址翻譯,它們的很多Feature都是圍繞著“地址翻譯”展開,那么本文也會圍繞著SMMU的地址翻譯做一些準備工作,介紹下SMMU的頁表架構:一座假設在設備和物理內存之間的橋梁。
正文
1.1 MMU頁表的架構
讀到這里的小伙伴對頁表沒有任何經驗的話,那你就是沒感覺,和談對象一樣,沒感覺是不行的,先看看前序文章吧。
(1) [A-10]ARMv8/ARMv9-Memory-頁表的概念和使用場景
(2) [A-11]ARMv8/ARMv9-Memory-多級頁表架構
(3) [A-12]ARMv8/ARMv9-Memory-頁表描述符(Translation table descriptor)
這里我們只會簡單的回顧一下。
ARM的VMSA體系下,規定了處理器無論是處于何種安全等級(Secure\Normal\Root\Non-Secure)、任何權限等級(EL3\EL2\EL1\EL0)的程序都必須使用虛擬地址VA和CPU打交道。CPU拿到虛擬地址后,根據虛擬地址的類型(Device/Normal)通過MMU變成物理地址,然后發起總線操作完成對物理地址空間的訪問。物理地址空間的資源是有限的,表現為:A進程用了,B進行就不能用;kernel 用了,Userspace就不能用;VM1用了,VM2就不能用;Secure用了,Non-Secure就不能用。雖然高權限等級的軟件模塊,會對低權限的等級內存產生干預,但也是有底線有原則的。那么VMSA就把地址空間劃片(Page、Block),一片虛擬地址空間的內存對應著一片物理地址空間的內存。這個對應關系是需要記錄下來的,就是系統在運行時要維護一本帳,通過這個賬本連接起內存的虛擬地址空間和物理地址空間,如圖1-1所示。
這個對應關系,VMSA設計了一套數據結構:TranslationTable(頁表)、Page(頁描述符)、Block(塊描述)。這些數據結構的每一項的格式,都是ARM規定好,OS的內存管理模塊在內存中創建頁表的時候,就要按照這個格式填充數據,方便MMU進行遍歷和訪問。這里我們舉一個頁描述符的格式供大家參考,如圖1-2所示。
有了這些描述符之后,OS軟件就可以通過級聯的方式將它們關聯到一起。這里面就有一個問題了,怎么關聯,是串聯還是并聯還是串并聯。ARM采用的是多級頁表級聯的方式組織頁表架構,如圖1-3所示。
采用這種多級頁表架構的重要原因是現代處理器的地址空間實在是太大了。如果采用單級頁表,在64bit空間下,光是存儲頁表的要消耗的內存空間就非常恐怖,這個我們前面算了一筆細賬,大家可以自行閱讀了解相關的背景。采多級頁表架構后,這種情況就得到了很大的改善,輔之以OS軟件管理模塊的幫助,可以大大的節約管理數據所消耗的內存。當CPU拿到虛擬地址后,在MMU的幫助下可以快速的遍歷多級頁表從而找到物理地址,進而發起訪問物理地址空間的操作。當然,現代處理器的肯定要越快越好,那么Cache機制和TLBs的機制的運用會大大提高地址翻譯的效率。
對MMU的頁表相關回顧就到這里,相信大家已經有了一定的感覺了,下面我們進入SMMU頁表的世界。
1.2 SMMU的使用場景
前面的章節,我們