# Intro * Android Systems 團隊 Steven Moreland 主導 16 KB 頁面專案,確保此模式在 Android 上運作良好 * 將分享 16 KB 頁面大小的概念、必要調整與實務經驗 # Memory pages ![image](https://hackmd.io/_uploads/SkUWFhsclx.png) ![image](https://hackmd.io/_uploads/Bybft3o5eg.png) * 記憶體頁面是現代電腦安全與效能的基礎,OS 以讀/寫/執行權限配置頁面給應用程式 ![image](https://hackmd.io/_uploads/rkfXFnsqlg.png) ![image](https://hackmd.io/_uploads/BJEVt3ocge.png) * TLB 快取位址轉換、MMU 管理轉換與查找,CPU 將常見操作委派給它們 * 放大頁面大小可減少與 MMU 的互動並提高 TLB 命中,降低查表與配置成本 * 行動裝置存在大量頁面操作,此處正是效能瓶頸的來源 # Application size growing ![image](https://hackmd.io/_uploads/BkeLYnjqlg.png) * 應用程式體積成長(大型遊戲可達 GB 級),加劇記憶體管理負載 * 遠距位址存取導致 TLB thrash、頻繁丟失轉換並重載 * CPU 在 MMU 上花費過多時間設定頁面,形成效能瓶頸 # Why we’re changing page size from 4KB to 16KB ![image](https://hackmd.io/_uploads/r1uUFnj9ge.png) ![image](https://hackmd.io/_uploads/ryR8K3s5le.png) * 16 KB 為多數 64 位元 ARM CPU 內建選項,可讓部分記憶體操作快上四倍(簿記範圍放大) ![image](https://hackmd.io/_uploads/BJH_Y2o5xx.png) * Android 實務測得整體效能提升約 5%~10%,部分應用啟動可快 30%,功耗降低約 4.5% ![image](https://hackmd.io/_uploads/rJRoKho5lg.png) * Google Play 要求:2025-11-01 起,APK 內 ELF 必須 16 KB 對齊,且各段偏移為 16 KB 倍數 ![messageImage_1757297209466](https://hackmd.io/_uploads/S1aU92s5le.jpg) ![messageImage_1757297157896](https://hackmd.io/_uploads/S1E2qhsclg.jpg) * 採用最新 Android SDK/NDK 多數應用可直接符合;未升級可使用 linker 的「max page size 16 KB」對齊 ![image](https://hackmd.io/_uploads/rk0aq3jqge.png) * 直接操作頁面的原生程式(如 mmap、MAP\_FIXED)需改以「查詢實際頁面大小」的方式處理 * 16 KB 的倍數同時也是 4 KB 的倍數,完成 16 KB 相容的一份二進位可同時支援既有裝置 * 與 32→64 位元移植不同,此變更只需一個二進位 # Android 16 and more * 高階裝置(≥8 GB RAM)預期未來將預設啟用 16 KB ![messageImage_1757297419725_0](https://hackmd.io/_uploads/Hyn7j3i5lg.jpg) * 部分實機提供 16 KB 開發者選項,Android 模擬器/虛擬裝置亦可在 16 KB 模式運行 ![messageImage_1757297409419_0](https://hackmd.io/_uploads/rJV7ohjqxx.jpg) * Android 16 在開發者選項下提供 16 KB 回溯相容模式,偵測不相容應用時顯示提示,便於觀察執行期行為(非最佳化替代方案) --- # 16 KB 頁面是什麼 * 作業系統將記憶體以 16,384 位元組為一頁的配置與管理單位 * 同一筆 TLB/MMU 簿記可涵蓋較多位址空間,降低查表與切換成本 * 在相同 TLB 容量下可容納更多有效轉換項目,減少缺失(miss) * 與 4 KB 頁面相容:對齊到 16 KB 的配置同時也滿足 4 KB 的倍數 # 記憶體頁面是什麼 * 作業系統用來管理虛擬記憶體的固定大小區塊(如 4 KB、16 KB) * 每頁綁定權限屬性(讀/寫/執行)與對應的實體頁框 * 透過頁表(page table)將虛擬位址對應到實體位址 * 提供隔離與保護,控制進程能存取的記憶體範圍 # TLB 是什麼 * Translation Lookaside Buffer,CPU 內的快取,用來快取近期使用的「虛擬→實體」位址轉換 * 目的在降低每次存取都查完整頁表的成本 * 命中(hit)時以近似暫存器的延遲回傳實體位址;未命中(miss)才走頁表查詢 * 容量有限,需以替換策略維持條目(entries) # TLB thrash 是什麼 * 工作集位址分布過廣或跳躍過大導致 TLB 頻繁未命中與替換 * 先前仍需要的轉換被逐出,造成連續的 miss 與頁表查詢 * 使 CPU 在地址轉換上耗時增加,吞吐與延遲惡化 * 放大頁面大小可在相同條目數涵蓋更多位址,降低 thrash 機率 # TLB caches virtual address translations * 指 TLB 會快取「虛擬位址到實體位址」的轉換結果,以加速記憶體存取 * 命中時可直接取得對應實體頁框與權限資訊,避免走慢速的頁表查詢路徑 * 快取粒度以「頁」為單位,頁越大,單條目覆蓋的位址範圍越廣 # MMU 是什麼 * Memory Management Unit,處理位址轉換與存取權限檢查的硬體單元 * 接收 CPU 發出的虛擬位址,透過 TLB 或頁表解析成實體位址 * 依據頁面屬性強制權限(讀/寫/執行)與隔離,違規則觸發例外 * 支援不同頁面大小與分段/分層頁表結構 # 遠距位址存取是什麼 * 程式存取彼此相距較遠、跨多個頁面的記憶體位置 * 導致 TLB 條目難以重用,提升 miss 與替換頻率 * 常見於大型資料集、隨機存取模式、碎片化結構 * 透過改善區域性或增大頁面大小可緩解 # ELF是什麼 * Executable and Linkable Format,Unix/Android 常見的可執行檔與物件檔格式 * 由多個 segment/section 組成,載入時依對齊與權限映射到記憶體 * 支援動態連結、重定位、符號與調試資訊 * 在 16 KB 環境需確保可執行段與相對偏移為 16 KB 的倍數以滿足效能與相容性需求 --- # Terminology * 記憶體頁面(Memory Page):作業系統分配記憶體的最小單位,用來管理應用程式存取。 * 頁面大小(Page Size):單一記憶體頁面的容量,常見為 4 KB 或 16 KB。 * 16 KB 頁面(16 KB Page):一種較大的頁面大小,能減少頁表與 TLB 壓力。 * 4 KB 頁面(4 KB Page):傳統預設的頁面大小,應用最為普遍。 * 翻譯後備緩衝區(Translation Lookaside Buffer, TLB):CPU 快取虛擬位址與實體位址轉換的硬體元件。 * 記憶體管理單元(Memory Management Unit, MMU):負責處理虛擬位址到實體位址轉換的硬體模組。 * 虛擬位址(Virtual Address):程式所看到的位址空間,需經由 MMU 轉換成實體位址。 * 實體位址(Physical Address):實際存在於記憶體硬體上的位址。 * 頁表(Page Table):紀錄虛擬位址與實體位址對應關係的資料結構。 * 頁錯誤(Page Fault):當存取的虛擬頁面尚未映射到實體記憶體時所觸發的例外。 * 快取一致性(Cache Coherency):確保 CPU 快取與記憶體資料一致的機制。 * 記憶體對齊(Memory Alignment):將資料放置於符合特定邊界的位址,提升存取效率。 * 執行權限(Execute Permission):控制頁面是否允許執行程式碼。 * 讀取權限(Read Permission):控制頁面是否允許讀取資料。 * 寫入權限(Write Permission):控制頁面是否允許寫入資料。 * 記憶體對映(Memory Mapping):將檔案或裝置內容映射到虛擬位址空間。 * mmap:系統呼叫,用於在程式中建立記憶體對映。 * MAP\_FIXED:mmap 的一個參數,強制將映射放在指定的位址。 * ELF(Executable and Linkable Format):Linux 與 Android 使用的可執行檔案格式。 * APK(Android Package):Android 應用程式的封裝檔案格式。 * 段(Segment):可執行檔中相同屬性的程式碼或資料區塊。 * 偏移量(Offset):在檔案或記憶體中的位移距離。 * 對齊邊界(Alignment Boundary):必須符合的記憶體位址間隔,例如 16 KB。 * 即時載入(Immediate Load):CPU 指令直接載入相鄰位址的資料。 * Android SDK:Android 軟體開發工具組。 * Android NDK:提供 C/C++ 原生程式開發工具的 Android 工具組。 * 編譯器(Compiler):將程式碼轉換成機器碼的工具。 * 連結器(Linker):將多個程式模組合併成單一可執行檔。 * 最大頁面大小(Max Page Size):連結時指定的對齊頁面大小上限。 * 應用程式效能(Application Performance):程式執行效率與反應速度。 * TLB 爆掉(TLB Thrash):TLB 過度替換導致效率降低的現象。 * 記憶體瓶頸(Memory Bottleneck):記憶體效能限制系統整體效能的情況。 * CPU 配置時間(CPU Configuration Time):CPU 用於設定頁面的時間消耗。 * 效能增益(Performance Gain):因技術優化帶來的速度提升。 * 電力消耗(Power Consumption):系統運行時所需的能量。 * 電池續航(Battery Life):裝置在一次充電後的運行時間。 * 向後相容模式(Backward Compatibility Mode):確保舊應用在新系統上仍可運行的設計。 * Android 模擬器(Android Emulator):在電腦上模擬 Android 裝置的工具。 * 虛擬裝置(Virtual Device):模擬器中建立的虛擬手機或平板環境。 * 原生程式碼(Native Code):使用 C/C++ 編寫並直接執行於硬體上的程式。 * 應用啟動時間(App Launch Time):應用程式從點擊到可互動的時間。 * 多工處理(Multitasking):同時執行多個應用程式的能力。 * 記憶體碎片化(Memory Fragmentation):可用記憶體被分割成小片段,降低利用率。 * 64 位元 ARM 架構(64-bit ARM Architecture):支援 16 KB 頁面的處理器架構。 * 虛擬位址空間(Virtual Address Space):程式可用的虛擬記憶體範圍。 * 應用程式二進位介面(Application Binary Interface, ABI):定義程式與系統間互動的規範。 * 開發者選項(Developer Options):Android 系統提供的進階測試與調整功能。 * 記憶體對映檔案(Memory-Mapped File):直接將檔案載入虛擬記憶體以加速存取的技術。 * 分頁機制(Paging Mechanism):透過分頁管理記憶體的方式。 * 頁表快取(Page Table Cache):用於快取頁表資料以加速查詢。 * 高效能計算(High-Performance Computing, HPC):對效能需求極高的運算領域。