Seitengröße von 16 KB

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 so entwickelt und optimiert, dass sie mit einer Seitengröße von 4 KB ausgeführt werden können. ARM-CPUs unterstützen die größere Seitengröße von 16 KB. Ab Android 15 unterstützt AOSP auch die Entwicklung von Android mit einer Seitengröße von 16 KB. Diese Option verwendet 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 Umstellung auf den 16‑KB-Modus vorbereiten können.

Android 15 und höher unterstützen die Entwicklung von Android mit einer 16‑KB-ELF-Ausrichtung, die ab android14-6.1mit 4‑KB- und 16‑KB-Kerneln funktioniert. Bei Verwendung mit einem 16‑KB-Kernel verbraucht diese Konfiguration zusätzlichen Arbeitsspeicher, verbessert aber die Systemleistung.

Android auf 16 KB festlegen

16‑KB-Seiten werden nur auf arm64-Zielen mit 16‑KB-Kerneln unterstützt. Es gibt aber auch eine Option, den 16‑KB-Userspace auf x86_64 für Cuttlefish zu simulieren.

Kernel space

Wenn Sie für arm64-Ziele Kleaf verwenden, um Ihren Kernel zu erstellen, wird der Kernel mit --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.

Informationen zu vorkompilierten 16 KB-GKI-Binärdateien (Generic Kernel Image), unterstützten Zweigen sowie Release- und Respin-Details finden Sie unter 16 KB-GKI-Releases und GKI-Release-Builds.

User space

Wenn Sie die Unterstützung für die Seitengröße 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 PAGE_SIZE und sorgt dafür, dass die Seitengröße von den Komponenten zur Laufzeit bestimmt wird.
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384 sorgt dafür, dass ELF-Dateien der Plattform mit einer 16‑KB-Ausrichtung erstellt werden. Diese größere als die benötigte Größe dient der zukünftigen Kompatibilität. Mit der 16‑KB-ELF-Ausrichtung kann der Kernel Seitengrößen von 4 KB und 16 KB unterstützen.

Build-Flags überprü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 eingerichtet, um mit einem 16‑KB-Kernel zu funktionieren. Auch wenn ein Build erfolgreich ist, können jedoch Laufzeitprobleme aufgrund von Unterschieden in einer 16‑KB-Umgebung auftreten.

Systemprogrammierung mit Seitengröße von 16 KB

Der Großteil des Codes auf jedem Android-Gerät befasst sich nicht direkt mit der Seitengröße. Bei Code, der sich mit Seiten befasst, ändert sich jedoch das Verhalten der Arbeitsspeicherzuweisung des Kernels. Das müssen Sie berücksichtigen, um Code zu schreiben, der nicht nur kompatibel, sondern auch maximal leistungsstark und ressourcenschonend ist.

Wenn Sie mmap für einen 1‑KB-, 2‑KB- oder bis zu 4‑KB-Bereich auf einem 4‑KB-System aufrufen, reserviert das System 4 KB, um dies zu implementieren. Wenn Sie Arbeitsspeicher vom Kernel anfordern, 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-System zuweisen, weist der Kernel 8 KB zu.

Bei einem 16‑KB-Kernel sind diese zusätzlichen „Enden“ der Seiten größer. Beispielsweise würden bei allen diesen Zuweisungen von 1 KB bis 5 KB 16 KB zugewiesen, wenn sie mit einem 16‑KB-Kernel verwendet werden. Wenn Sie 17 KB anfordern, werden 32 KB zugewiesen.

Auf einem 4‑KB-System ist es beispielsweise in Ordnung, zwei anonyme 4‑KB-Lese-/Schreibbereiche 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 zu einer einzelnen Lese- oder Schreibseite kombiniert werden, sodass nur 16 KB verwendet werden. Im Vergleich zum 4‑KB-Kernel werden also 8 KB verschwendet. Um die Arbeitsspeichernutzung noch weiter zu reduzieren, können weitere Seiten kombiniert werden. Auf einem maximal optimierten 16‑KB-System benötigen 16‑KB-Seiten sogar weniger Arbeitsspeicher als 4‑KB-Systeme, da die Seitentabelle bei gleichem 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 ist der gesamte vom Kernel zugewiesene Arbeitsspeicher für den Userspace in Laufzeitwerten direkt sichtbar und wird nicht implizit angefordert und implizit oder versehentlich zugänglich.

Gemeinsame Bibliotheken mit 16‑KB-ELF-Ausrichtung erstellen

Wenn Sie gemeinsame Bibliotheken erstellen möchten, 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 gemeinsam genutzte 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 vorkompilierte Dateien auf 16‑KB-ELF-Ausrichtung prüfen

Die beste Möglichkeit, die Ausrichtung und das Laufzeitverhalten zu überprüfen, besteht darin, auf einem mit 16‑KB-Kernel kompilierten System zu testen und auszuführen. Um einige Probleme früher zu erkennen, können Sie aber auch Folgendes tun:

  • Ab Android 16 können Sie zur Build-Zeit PRODUCT_CHECK_PREBUILT_MAX_PAGE_SIZE := true festlegen. Verwenden Sie ignore_max_page_size: true in Android.bp und LOCAL_IGNORE_MAX_PAGE_SIZE := true in Android.mk, um sie vorübergehend zu ignorieren. Mit diesen Einstellungen werden alle vorkompilierten Dateien überprüft. So können Sie erkennen, wenn eine Datei aktualisiert wurde, aber nicht auf 16 KB ausgerichtet ist.

  • Sie können atest elf_alignment_test ausführen, um die Ausrichtung von ELF-Dateien auf dem Gerät auf Geräten zu überprüfen, die mit Android 15 und höher gestartet werden.