64-Bit-Kernel, aber alle ausführbaren 32-Bit-ELF-Ausführungsprozesse, wie ist das?

9

Die Ausgabe von uname:

root@debian:~ # uname -a
Linux 5asnb 2.6.32-5-amd64 #1 SMP Mon Jun 13 05:49:32 UTC 2011 x86_64 GNU/Linux

Die /sbin/initausführbare Datei wird jedoch als 32-Bit angezeigt:

root@debian:~ # file /sbin/init
/sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

Andere Aspekte des Systems scheinen ebenfalls zu widersprechen:

root@debian:~ # echo $HOSTTYPE
i486

root@debian:~ # getconf LONG_BIT
32
kiiwii
quelle

Antworten:

13

Der 64-Bit-Kernel kann auf Debian 32-Bit installiert werden. Sie können sehen , dass die AMD64 - Kernel für 32 - Bit - Debian auf ihrer zur Verfügung Paket Seite . Dies kann als Alternative zur Verwendung eines PAE-fähigen Kernels verwendet werden, um mehr als 4 GB Gesamtspeicher zu unterstützen. Beachten Sie, dass 32-Bit-Binärdateien immer noch nicht auf ungefähr 3 GB RAM pro Prozess zugreifen können.

Jordanm
quelle
Danke! Ihre Antworten sind so klar wie eine Kristallkugel ~: D Ich habe noch nie bemerkt, dass Debian das Kernel-Paket so behandelt.
Kiwii
Das stimmt nicht: 32-Bit-Programme können den gesamten 4Gio ihres virtuellen Adressraums verwenden, wenn sie auf einem 64-Bit-Kernel ausgeführt werden (es sei denn, sie werden mit der ADDR_LIMIT_3GB-Persönlichkeit ausgeführt).
Ysdx
@ysdx Die Beschränkung auf 2 GB ist also eine Windows-spezifische Sache und Adressen über 0x80000000 sind im 32-Bit-Benutzerbereich zulässig?
Paul Stelian
1
@PaulStelian, Unter 32-Bit-Windows sind Sie aus Gründen der Retro-Kompatibilität standardmäßig auf die niedrigsten 2 GB virtuellen Speicher beschränkt (ich denke, einige Programme werden verwendet, um Zeiger auf die höchsten 2 GB virtuellen Speicher für spezielle Zwecke zu reservieren). Sie können das LARGEADDRESSAWARE-Flag in Ihrer ausführbaren Datei ( docs.microsoft.com/fr-fr/cpp/build/reference/… ) setzen, um den Zugriff auf die gesamten 4 GB virtuellen Speicher zu aktivieren .
Ysdx
15

Alle Prozessoren, die den x64- Befehlssatz (auch als x86_64 oder amd64 bezeichnet) unterstützen, unterstützen auch den x86- Befehlssatz (auch als i386 oder i686 bezeichnet, bei denen es sich streng genommen um bestimmte Versionen von x86 handelt). Gleiches gilt für ARM A64 (der neue 64-Bit-Befehlssatz in ARMv8) und A32 (der Name für den „klassischen“ 32-Bit-Befehlssatz) für SPARC64 und SPARC , und ich glaube für MIPS64 und MIPS . Wenn in all diesen Architekturfamilien ein Prozessor 64-Bit-Code ausführen kann, kann er auch 32-Bit-Code ausführen.

Der Linux-Kernel unterstützt das Ausführen von 32-Bit-Userland-Code mit einem 64-Bit-Kernel (bei allen oben genannten Architekturfamilien, glaube ich). Der Kernel muss homogen sein (alle 64-Bit oder alle 32-Bit), und jeder Prozess muss homogen sein. Sie können jedoch eine Mischung aus 32-Bit- und 64-Bit-Prozessen auf einem 64-Bit-Kernel verwenden. Das Umgekehrte ist nicht möglich: Mit einem 32-Bit-Kernel können Sie keine 64-Bit-Prozesse ausführen.

Dies ist eine Design-Wahl unter Linux, die durch den Wunsch motiviert ist, vorhandene 32-Bit-Binärdateien auf 64-Bit-Installationen auszuführen. Andere Unix-Varianten haben andere Entscheidungen getroffen: Solaris kann 64-Bit-Programme auf einem 32-Bit-Kernel ausführen und umgekehrt, während OpenBSD keine 32-Bit-Programme auf einem 64-Bit-Kernel ausführen kann.

Sie können erhalten Informationen über die CPU in /proc/cpuinfo. Wenn Ihre x86-CPU das lmFlag hat, handelt es sich um eine 64-Bit-CPU.

Standardmäßig uname -moder archzeigt die Architektur an, für die der Kernel kompiliert wurde. Linux kann die „Persönlichkeit“ eines Prozesses (mit dem personality) Systemaufruf festlegen . Mit dem setarchBefehl können Sie einen Unterprozess in einer anderen Persönlichkeit ausführen . setarch i686 someprogramoder linux32 someprogramführt das angegebene Programm in einer Umgebung aus, in der uname -mzurückgegeben wird, i686während setarch amd64 someprogramoder linux64 someprogramdas angegebene Programm in einer Umgebung ausgeführt wird, in der uname -mzurückgegeben wird amd64.

file /sbin/initHier erfahren Sie, für welche Architektur das initProgramm kompiliert wurde. Obwohl es möglich ist, ausführbare 32-Bit- und 64-Bit-Dateien in einer Installation zu mischen, stammen normalerweise alle Kernprogramme des Betriebssystems von derselben Architektur, da die Verwaltung viel einfacher ist.

$HOSTYPEist eine Bash-Variable und gibt an, für welche Architektur das bashProgramm kompiliert wurde.

getconf LONG_BITHier erfahren Sie, ob der Standard-C-Compiler zum Kompilieren von 32-Bit- oder 64-Bit-Programmen eingerichtet ist. Ein genauerer Test besteht darin, ein Programm zu kompilieren und auszuführen, das druckt sizeof(void*)oder sizeof(size_t)aufruft. Es getconfkann nur Informationen darüber geben, was getconfder Standard-Compiler für möglich hält.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Wechselt 32-Bit-Solaris in den 64-Bit-Modus, um in den 64-Bit-Prozess und dann zurück zu wechseln? Dies muss einen enormen Overhead haben und macht einfach keinen Sinn, da der Kernel dann effektiv 64 Bit ist.
Ruslan
1
@ Ruslan Warum sollte es einen riesigen Overhead haben? Das Umschalten der Modi bei einem Kontextwechsel kostet nicht viel (wenn überhaupt, kenne ich x86 auf einem niedrigen Level nicht gut genug). Der Kernel bleibt 32-Bit: Virtuelle 32-Bit-Adressen für Kernel-Mappings, Verwendung des 32-Bit-Befehlssatzes.
Gilles 'SO - hör auf böse zu sein'
1
Der Kernel muss einige 64-Bit-spezifische Datenstrukturen verwalten, um 64-Bit-Apps und mindestens 64-Bit-fähige Seitentabellen zu unterstützen. Dies macht es nicht wirklich zu einem 32-Bit-Kernel. Ich habe nicht versucht, wirklich tief in den amd64-Bogen einzudringen, aber ich denke, dass das Ausschalten der 64-Bit-Unterstützung im Gegensatz zur Verwendung eines speziell entwickelten Kompatibilitätsmodus einen erheblichen Overhead hat.
Ruslan
1
@ Ruslan Nur 64-Bit-fähige Seitentabellen und wirklich notwendig, und es ist ein winziger Preis. Alles andere kann mit dem richtigen Kernel-Design vermieden werden. Ich habe mich noch nie mit dem Solaris-Kernel befasst. Ich nehme an, sie haben dafür gesorgt, dass er flexibel genug ist (sie hatten bereits Erfahrung mit SPARC64).
Gilles 'SO - hör auf böse zu sein'