---
# System prepended metadata

title: '[Youtube] [Android] Android Developers - Prepare your Play app for devices with 16 KB page sizes'
tags: [Android, Youtube]

---

# 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）：對效能需求極高的運算領域。
