
Linux 6.17 soll eine alte und obskure Kernel-Beschränkung von 1993 beheben
Unter der Annahme, dass Linus Torvalds keine Einwände erhebt, wurde ein frühzeitiger Pull-Antrag für das kommende Linux 6.17 Merge-Fenster eingereicht, um eine obskure Kernel-Beschränkung zu beheben, die bis ins Jahr 1993 zurückreicht, als der Linux v0.99-Kernel noch existierte.
Eine Übersetzung von 🇬🇧 Phoronix.com
Ein Linux-Ingenieur, der bei Alibaba arbeitet, berichtete kürzlich über eine skriptgenerierte Assembly-Datei, die, wenn sie vom GCC-Compiler erstellt und als ELF-Datei ausgeführt wurde, seltsame Probleme verursachte. Diese ELF-Datei konnte unter Linux AArch64/ARM64 nicht ausgeführt werden, wenn der Standard-Kernel mit einer Seitengröße von 4K verwendet wurde, da ein "exec format error" auftrat. Wenn jedoch die moderne 64K-Seitengröße für ARM64 verwendet wird, funktioniert diese ELF-Datei problemlos.
Der Alibaba-Ingenieur stellte fest, dass eine der ELF-Ladefunktionen im Kernel prüft, ob die Größe größer als ELF_MIN_ALIGN / PAGE_SIZE ist, und in diesem Fall die Datei abbricht, was angesichts der Anzahl der Programmheader in dieser ELF-Datei der Fall war. Aber es war nicht klar, warum diese Prüfung vorhanden war. Wenn diese Kernelprüfung entfernt wird, läuft die betreffende Binärdatei problemlos auf einem Kernel mit 4K Seitengröße.
Der langjährige Linux-Entwickler Kees Cook hat sich durch den alten Code aus der Zeit vor Git gewühlt, um das Problem zu lösen. Er erklärte:
Wenn ich mir https://git.kernel.org/pub/scm/linux/kernel/git/history/history.git ansehe (das keine verlinkte Historie hat, so dass man explizite "pre git" Tags untersuchen muss), sehe ich:
4779b38bcb96 ("[PATCH] Linux-0.99.13 (19. September 1993)"), die besagt, dass "die Unterstützung von ELF-Binärdateien eine bemerkenswerte Änderung ist." Hier gibt es die PAGE_SIZE
Prüfung nicht. Als die ELF-Interp-Unterstützung in 9e11983a5a3e ("Import 0.99.15f") hinzugefügt wurde, taucht die Prüfung auf, und ich kann
keine Begründung dafür finden.
Und mit 6a8d38945cf4 ("binfmt_elf: Heben Sie das Laden von ELF-Programmheadern in eine Funktion auf") wurde die PAGE_SIZE-Prüfung für Nicht-Interp-Ladungen _hinzugefügt_.
Es scheint, dass die 64K-Zählgrenze ausreichend ist? (Wenn es das Ziel war, große Speicherzuweisungen aus dem Userspace zu vermeiden, sind wir heutzutage zwischen IPC, BPF usw. weit über PAGE_SIZE hinaus.
Für Linux 6.17 gibt es nun einen Patch, der die 4K-Begrenzung der Programmheadergröße aufhebt.
Wir haben Assembler-Code, der von einem Skript erzeugt wurde. GCC kompiliert ihn erfolgreich. Der Kernel kann ihn jedoch auf einer ARM64-Plattform mit einer Seitengröße von 4K nicht laden. Im Gegensatz dazu wird die gleiche ELF-Datei auf der gleichen Plattform mit einer Seitengröße von 64K korrekt geladen.
Die Ursache dafür ist die ELF_MIN_ALIGN-Beschränkung des Linux-Kernels für die Programmheader von ELF-Dateien. Die ELF-Datei enthält 78 Programmheader (das Skript fügt beim Generieren des Assemblercodes viele Löcher ein). Auf ARM64 mit einer Seitengröße von 4K erzwingt ELF_MIN_ALLIGN ein Maximum von 74 Programmheadern, wodurch die ELF-Datei fehlschlägt. Bei einer Seitengröße von 64K wird der ELF_MIN_ALIGN jedoch auf über 1.184 Programmheader gelockert, so dass die Datei korrekt ausgeführt werden kann.
Cook wies freundlicherweise darauf hin, dass diese Beschränkung in Linux-0.99.15f eingeführt wurde, ohne dass ihr Zweck erklärt wurde.
Die ELF-Spezifikation sieht eine solche Beschränkung für Programmheader nicht vor. Aufhebung der ELF_MIN_ALIGN-Beschränkung für Programmheader, um mit der ELF-Spezifikation übereinzustimmen. Nachdem die ELF_MIN_ALIGN-Beschränkung entfernt wurde, besteht immer noch eine Größennbeschränkung von 64K, was ausreichend sein sollte.
Dieser Patch wurde als Teil der execve-Änderungen für Linux 6.17 eingesandt. Unter der Annahme, dass Linus Torvalds selbst keine Probleme entdeckt hat, sollte dieser Fix zusammengeführt werden, sobald das Linux 6.17 Merge-Fenster geöffnet wird... Was bereits am Montag der Fall sein wird, wenn Linux 6.16 wie geplant am Sonntag erscheint.
Ein Service von s3n🧩net
Comments