Die Seitengröße ist die Granularität, mit der ein Betriebssystem den Arbeitsspeicher verwaltet. Die meisten CPUs unterstützen heute eine Seitengröße von 4 KB. Daher wurden das Android-Betriebssystem und die Apps bisher für die Ausführung mit einer Seitengröße von 4 KB entwickelt und optimiert. ARM-CPUs unterstützen die größere Seitengröße von 16 KB und ab Android 15 unterstützt AOSP auch die Erstellung von Android mit einer Seitengröße von 16 KB. Diese Option benötigt zusätzlichen Arbeitsspeicher, verbessert aber die Systemleistung. Ab Android 15 ist diese Option nicht standardmäßig aktiviert, aber sie ist als Entwicklermodus oder Entwickleroption für OEMs und App-Entwickler verfügbar, damit sie sich auf die zukünftige Umstellung auf den 16‑KB-Modus vorbereiten können.
Android 15 und höher unterstützen die Erstellung von Android mit einer 16 KB-ELF-Ausrichtung, die mit 4 KB- und 16 KB-Kerneln ab android14-6.1
funktioniert.
Bei Verwendung mit einem 16‑KB-Kernel wird durch diese Konfiguration zusätzlicher Arbeitsspeicher verwendet, die Systemleistung wird jedoch verbessert.
Android auf 16 KB einstellen
16‑KB-Seiten werden nur auf arm64
-Zielen mit 16‑KB-Kernels unterstützt.
Es gibt jedoch auch die Möglichkeit, 16 KB-Userspace auf x86_64
für Cuttlefish zu simulieren.
Kernel-Bereich
Wenn Sie für arm64
-Ziele Kleaf zum Erstellen des Kernels verwenden, wird der Kernel in --page_size=16k
im 16-KB-Modus erstellt.
Wenn Sie die Linux-Kernelkonfiguration direkt verwenden, können Sie 16‑KB-Seiten auswählen, indem Sie CONFIG_ARM64_16K_PAGES
anstelle von CONFIG_ARM64_4K_PAGES
festlegen.
Nutzerbereich
Wenn Sie die Unterstützung für die Seitengröße von 16 KB im Android-Nutzerbereich aktivieren möchten, legen Sie die folgenden Build-Optionen für Ihr Produkt fest:
- Mit
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
wird diePAGE_SIZE
-Definition entfernt und die Seitengröße wird von den Komponenten zur Laufzeit bestimmt. PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384
, wodurch sichergestellt wird, dass Plattform-ELF-Dateien mit einer Ausrichtung von 16 KB erstellt werden. Diese Größe ist größer als erforderlich, um die zukünftige Kompatibilität zu gewährleisten. Mit der 16‑KB-ELF-Ausrichtung kann der Kernel Seitengrößen von 4 KB/16 KB unterstützen.
Build-Flags überprüfen
Prüfen Sie nach der Auswahl des lunch
-Ziels, ob die Build-Flags in der Umgebung richtig eingerichtet sind:
$ source build/envsetup.sh
$ lunch target
$ get_build_var TARGET_MAX_PAGE_SIZE_SUPPORTED
16384
$ get_build_var TARGET_NO_BIONIC_PAGE_SIZE_MACRO
true
Wenn die beiden vorherigen Befehle 16384
bzw. true
zurückgeben, sind Ihre Build-Flags richtig für die Verwendung mit einem 16‑KB-Kernel eingerichtet. Auch wenn ein Build erfolgreich ist, kann es aufgrund von Unterschieden in einer 16‑KB-Umgebung zu Laufzeitproblemen kommen.
Systemprogrammierung mit einer Seitengröße von 16 KB
Der Großteil des Codes auf Android-Geräten befasst sich nicht direkt mit der Seitengröße. Bei Code, der sich mit Seiten befasst, ändert sich jedoch das Verhalten der Speicherzuweisung des Kernels. Dies müssen Sie berücksichtigen, um Code zu schreiben, der nicht nur kompatibel, sondern auch maximal leistungsfähig und ressourcenschonend ist.
Wenn Sie mmap
für einen 1‑KB-, 2‑KB- oder bis zu 4‑KB-Bereich in einem 4‑KB-System aufrufen, reserviert das System 4 KB für die Implementierung. Wenn also Arbeitsspeicher vom Kernel angefordert wird, muss der Kernel den angeforderten Arbeitsspeicher immer auf die nächste Seitengröße aufrunden. Wenn Sie beispielsweise einen 5‑KB-Bereich auf einem 4‑KB-Bereich zuweisen, weist der Kernel 8 KB zu.
Bei einem 16‑KB-Kernel sind diese zusätzlichen „Enden“ von Seiten größer. Wenn Sie beispielsweise alle diese Zuweisungen von 1 KB bis 5 KB mit einem 16‑KB-Kernel verwenden, werden 16 KB zugewiesen. Wenn Sie 17 KB anfordern, werden 32 KB zugewiesen.
Auf einem 4 KB-System ist es beispielsweise in Ordnung, zwei anonyme Lese-/Schreibregionen mit 4 KB zuzuweisen. Bei einem 16‑KB-Kernel würde dies jedoch dazu führen, dass zwei Seiten oder 32 KB zugewiesen werden. Bei einem 16‑KB-Kernel können diese Bereiche nach Möglichkeit in einer einzelnen Lese- oder Schreibseite zusammengefasst werden, sodass nur 16 KB verwendet werden. Im Vergleich zum 4‑KB-Kernel werden also 8 KB verschwendet. Um den Speicherverbrauch noch weiter zu reduzieren, können weitere Seiten kombiniert werden. Tatsächlich benötigen 16‑KB-Seiten auf einem maximal optimierten 16‑KB-System weniger Arbeitsspeicher als 4‑KB-Systeme, da die Seitentabelle für denselben Arbeitsspeicher nur ein Viertel so groß ist.
Wenn Sie mmap
verwenden, runden Sie die angeforderte Größe immer auf die nächste Seitengröße auf. So wird sichergestellt, dass der gesamte vom Kernel zugewiesene Speicher direkt für den Userspace in Laufzeitwerten sichtbar ist, anstatt implizit angefordert und implizit oder versehentlich zugänglich zu sein.
Gemeinsam genutzte Bibliotheken mit 16‑KB-ELF-Ausrichtung erstellen
Wenn Sie freigegebene Bibliotheken erstellen möchten, die Teil des Android-Projekts sind, reichen die vorherigen Einstellungen unter 16-KB-Seitengröße aktivieren aus:
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384
Wenn Sie freigegebene Bibliotheken erstellen möchten, die nicht Teil eines Android-Projekts sind, müssen Sie dieses Linker-Flag übergeben:
-Wl,-z,max-page-size=16384
Binärdateien und Prebuilts auf 16‑KB-ELF-Ausrichtung prüfen
Am besten lässt sich die Ausrichtung und das Laufzeitverhalten überprüfen, indem Sie einen mit 16 KB kompilierten Kernel testen und ausführen. Um einige Probleme jedoch früher zu erkennen, sollten Sie Folgendes beachten:
Ab Android 16 können Sie
PRODUCT_CHECK_PREBUILT_MAX_PAGE_SIZE := true
zur Build-Zeit festlegen. Verwenden Sieignore_max_page_size: true
inAndroid.bp
undLOCAL_IGNORE_MAX_PAGE_SIZE := true
inAndroid.mk
, um sie vorübergehend zu ignorieren. Mit diesen Einstellungen werden alle Prebuilts überprüft. So können Sie erkennen, wenn ein Prebuilt aktualisiert wird, aber nicht 16 KB-kompatibel ist.Sie können
atest elf_alignment_test
ausführen, um die Ausrichtung von On-Device-ELF-Dateien auf Geräten zu überprüfen, die mit Android 15 und höher eingeführt werden.