Die Auslagerungseinheit 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 so entwickelt und optimiert, dass sie mit einer Seitengröße von 4 KB ausgeführt werden. ARM-CPUs unterstützen die größere Seitengröße von 16 KB. Ab Android 15 unterstützt AOSP auch das Erstellen von Android mit einer Seitengröße von 16 KB. Diese Option nutzt zusätzlichen Arbeitsspeicher, verbessert aber die Systemleistung. Ab Android 15 ist diese Option nicht standardmäßig aktiviert, sondern als Entwicklermodus oder Entwickleroption für OEMs und App-Entwickler verfügbar, um sich auf den künftigen Wechsel zum 16-KB-Modus vorzubereiten.
Android 15 und höher unterstützen das Erstellen von Android mit einer ELF-Ausrichtung von 16 KB. Diese funktioniert mit 4-KB- und 16-KB-Kerneln ab android14-6.1
.
Bei Verwendung mit einem 16 KB großen Kernel beansprucht diese Konfiguration zusätzlichen Arbeitsspeicher, verbessert aber die Systemleistung.
Android-Nutzerbereich auf 16 KB festlegen
Seiten mit 16 KB werden nur auf arm64
-Zielen mit 16 KB-Kerneln unterstützt.
Es gibt jedoch auch die Möglichkeit, 16 KB Userspace auf x86_64
für Cuttlefish zu simulieren.
Wenn Sie für arm64
-Ziele Kleaf zum Erstellen des Kernels verwenden, wird der Kernel von --page_size=16k
im 16-KB-Modus erstellt.
Wenn Sie die Linux-Kernel-Konfiguration direkt verwenden, können Sie 16-KB-Seiten auswählen, indem Sie CONFIG_ARM64_16K_PAGES
anstelle von CONFIG_ARM64_4K_PAGES
festlegen.
Wenn Sie die Unterstützung für Seitengrößen von 16 KB im Android-Userspace aktivieren möchten, legen Sie die folgenden Build-Optionen für Ihr Produkt fest:
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
entfernt die Definition vonPAGE_SIZE
und lässt die Komponenten die Seitengröße zur Laufzeit bestimmen.PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384
, wodurch sichergestellt wird, dass ELF-Dateien der Plattform mit einer Ausrichtung von 16 KB erstellt werden. Diese Größe ist größer als erforderlich und dient der zukünftigen Kompatibilität. Mit einer ELF-Ausrichtung von 16 KB kann der Kernel Seitengrößen von 4 KB/16 KB unterstützen.
Build-Flags prüfen
Nachdem Sie das lunch
-Ziel ausgewählt haben, prüfen Sie, 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 großen Kernel eingerichtet. Selbst wenn ein Build besteht, kann es aufgrund von Unterschieden in einer 16-KB-Umgebung zu Laufzeitproblemen kommen.
Systemprogrammierung mit 16 KB-Seitengröße
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. Sie müssen dies berücksichtigen, um Code zu schreiben, der nicht nur kompatibel, sondern auch möglichst leistungsfähig und möglichst ressourcenschonend ist.
Wenn Sie mmap
auf einem 4‑KB-System auf eine Region mit 1 KB, 2 KB oder bis zu 4 KB aufrufen, reserviert das System 4 KB für die Implementierung. Mit anderen Worten: Wenn Arbeitsspeicher vom Kernel angefordert wird, muss der Kernel den angeforderten Arbeitsspeicher immer auf die nächste Seitengröße aufrunden. Wenn Sie beispielsweise eine Region von 5 KB auf einer Region von 4 KB zuweisen, weist der Kernel 8 KB zu.
Bei einem 16-KB-Kernel sind diese zusätzlichen „Enden“ der Seiten größer. Bei einem Kernel mit 16 KB werden beispielsweise alle diese Zuordnungen von 1 KB bis 5 KB zu 16 KB zusammengefasst. Wenn Sie 17 KB anfordern, werden 32 KB zugewiesen.
In einem 4-KB-System können beispielsweise zwei 4-KB-Lese-/Schreib-anonyme Regionen zugewiesen werden. 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 Regionen nach Möglichkeit in einer einzigen lesbaren oder beschreibbaren Seite kombiniert werden, sodass nur 16 KB belegt werden. Im Vergleich zum 4-KB-Kernel werden also 8 KB verschwendet. Um die Arbeitsspeichernutzung noch weiter zu reduzieren, können mehrere Seiten kombiniert werden. Tatsächlich benötigen 16-KB-Seiten in einem maximal optimierten 16-KB-System weniger Arbeitsspeicher als 4-KB-Systeme, da die Seitentabelle bei gleichem Arbeitsspeicher nur ein Viertel der Größe hat.
Wenn Sie mmap
verwenden, müssen Sie die angeforderte Größe auf die nächste Seitengröße aufrunden. So ist der gesamte vom Kernel zugewiesene Arbeitsspeicher für den Userspace in Laufzeitwerten direkt sichtbar, anstatt implizit angefordert und implizit oder versehentlich zugänglich zu sein.
Gemeinsam genutzte Bibliotheken mit 16 KB ELF-Ausrichtung erstellen
Für das Erstellen gemeinsam genutzter Bibliotheken, die Teil des Android-Projekts sind, reichen die vorherigen Einstellungen unter Seitengröße von 16 KB 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 des 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
Die Ausrichtung und das Laufzeitverhalten lassen sich am besten mit einem 16 KB großen kompilierten Kernel testen und ausführen. So können Sie einige Probleme jedoch frühzeitig erkennen:
Ab Android 16 (AOSP experimental) können Sie
PRODUCT_CHECK_PREBUILT_MAX_PAGE_SIZE := true
zur Buildzeit 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 und Sie können erkennen, wenn eines aktualisiert, aber nicht auf 16 KB ausgerichtet ist.Sie können
atest elf_alignment_test
ausführen, um die Ausrichtung der ELF-Dateien auf dem Gerät zu überprüfen. Dieser Befehl ist auf Geräten mit Android 15 und höher verfügbar.