Noyau 64 bits, mais tous les processus exécutables exécutables ELF 32 bits, comment est-ce?

9

La sortie de 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

Cependant, l' /sbin/initexécutable apparaît en 32 bits:

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

D'autres aspects du système semblent également contredire les choses:

root@debian:~ # echo $HOSTTYPE
i486

root@debian:~ # getconf LONG_BIT
32
kiiwii
la source

Réponses:

13

Le noyau 64 bits peut être installé sur Debian 32 bits. Vous pouvez voir que le noyau amd64 est disponible pour Debian 32 bits sur sa page de paquet . Cela peut être utilisé comme alternative à l'utilisation d'un noyau compatible PAE pour prendre en charge plus de 4G de RAM totale. Notez que les binaires 32 bits ne peuvent toujours pas accéder à plus d'environ 3G de RAM par processus.

jordanm
la source
THX! vos réponses sont aussi claires qu'une boule de cristal ~: D Jamais remarqué Debian traite le paquet du noyau de cette façon auparavant.
kiiwii
1
Ce n'est pas vrai: les programmes 32 bits peuvent utiliser l'intégralité de 4Gio de leur espace d'adressage virtuel lorsqu'ils s'exécutent sur un noyau 64 bits (sauf s'ils s'exécutent avec la personnalité ADDR_LIMIT_3GB).
ysdx
@ysdx Donc, limiter à 2 Go est une chose spécifique à Windows et les adresses supérieures à 0x80000000 seront autorisées dans l'espace utilisateur 32 bits?
Paul Stelian
1
@PaulStelian, Sous Windows 32 bits, vous êtes par défaut limité aux 2 Go de mémoire virtuelle les plus bas pour la rétrocompatibilité (je pense que certains programmes utilisés pour réserver des pointeurs vers les 2 Go de mémoire virtuelle les plus élevés à des fins spéciales). Vous pouvez définir l'indicateur LARGEADDRESSAWARE dans votre exécutable ( docs.microsoft.com/fr-fr/cpp/build/reference/… ) pour activer l' accès à l'ensemble des 4 Go de mémoire virtuelle.
ysdx
15

Tous les processeurs qui prennent en charge le jeu d'instructions x64 (également appelé x86_64 ou amd64) prennent également en charge le jeu d' instructions x86 (également appelé i386 ou i686, qui sont des versions spécifiques à proprement parler de x86). Il en va de même pour ARM A64 (le nouveau jeu d'instructions 64 bits apparaissant dans ARMv8) et A32 (le nom du jeu d'instructions «classique» 32 bits), pour SPARC64 et SPARC , et je crois pour MIPS64 et MIPS . Donc, sur toutes ces familles d'architecture, si un processeur peut exécuter du code 64 bits, il peut également exécuter du code 32 bits.

Le noyau Linux prend en charge l'exécution de code utilisateur 32 bits avec un noyau 64 bits (sur toutes les familles d'architecture mentionnées ci-dessus, je pense). Le noyau doit être homogène (tous 64 bits ou tous 32 bits), et chaque processus doit être homogène, mais vous pouvez avoir un mélange de processus 32 bits et 64 bits sur un noyau 64 bits. L'inverse n'est pas possible: avec un noyau 32 bits, vous ne pouvez pas exécuter des processus 64 bits.

Il s'agit d'un choix de conception sous Linux, motivé par le désir d'exécuter des binaires 32 bits existants sur des installations 64 bits. D'autres variantes Unix ont fait des choix différents: Solaris peut exécuter des programmes 64 bits sur un noyau 32 bits ainsi que l'inverse, tandis qu'OpenBSD ne peut pas exécuter des programmes 32 bits sur un noyau 64 bits.

Vous pouvez obtenir des informations sur le CPU dans /proc/cpuinfo. Si votre CPU x86 a le lmdrapeau, c'est un CPU 64 bits.

Par défaut, uname -mou archaffiche l'architecture pour laquelle le noyau a été compilé. Linux peut définir la «personnalité» d'un processus (avec personality) l'appel système. Vous pouvez exécuter un sous-processus dans une personnalité différente avec la setarchcommande; setarch i686 someprogramou linux32 someprogramexécute le programme spécifié dans un environnement où uname -mretourne i686tandis que setarch amd64 someprogramou linux64 someprogramexécute le programme spécifié dans un environnement où uname -mretourne amd64.

file /sbin/initvous indique pour quelle architecture le initprogramme est compilé. Bien qu'il soit possible de mélanger des exécutables 32 bits et 64 bits dans une installation, généralement tous les programmes OS de base proviennent de la même architecture, car ils sont beaucoup plus faciles à gérer.

$HOSTYPEest une variable bash et vous indique pour quelle architecture le bashprogramme a été compilé.

getconf LONG_BITvous permet de savoir si le compilateur C par défaut est configuré pour compiler des programmes 32 bits ou 64 bits. Un test plus précis consiste à compiler et à exécuter un programme qui imprime sizeof(void*)ou sizeof(size_t)- appeler getconfne peut donner que des informations sur ce qui getconfpense être le compilateur par défaut.

Gilles 'SO- arrête d'être méchant'
la source
1
En effet, Solaris 32 bits passe-t-il en mode 64 bits pour passer au processus 64 bits, puis revenir? Cela doit avoir un énorme surcoût, et n'a aucun sens, car le noyau est en fait 64 bits.
Ruslan
1
@Ruslan Pourquoi aurait-il des frais généraux énormes? Changer de mode sur un changement de contexte ne coûte pas cher (je ne connais pas assez bien x86 à un niveau bas). Le noyau reste 32 bits: adresses virtuelles 32 bits pour les mappages du noyau, utilisation du jeu d'instructions 32 bits.
Gilles 'SO- arrête d'être méchant'
1
Le noyau doit conserver certaines structures de données spécifiques à 64 bits pour prendre en charge les applications 64 bits, au moins les tables de pages compatibles 64 bits. Cela ne fait pas vraiment d'un noyau 32 bits. Je n'ai pas essayé de me plonger vraiment dans l'amd64 arch, mais je pense que la désactivation de la prise en charge 64 bits aura un surcoût considérable contrairement à l'utilisation du mode de compatibilité spécialement conçu.
Ruslan
1
@Ruslan Seulement des tableaux de pages 64 bits et vraiment nécessaires, et c'est un coût minime. Tout le reste peut être évité avec la bonne conception du noyau. Je n'ai jamais creusé dans le noyau Solaris, je suppose qu'ils se sont arrangés pour le rendre suffisamment flexible (ils avaient une expérience préalable avec SPARC64).
Gilles 'SO- arrête d'être méchant'