Question

Sur ma machine OS X, le noyau est un binaire 32 bits et pourtant il peut exécuter un binaire 64 bits.Comment cela marche-t-il?

cristi:~ diciu$ file ./a.out
./a.out: Mach-O 64-bit executable x86_64
cristi:~ diciu$ file /mach_kernel
/mach_kernel: Mach-O universal binary with 2 architectures
/mach_kernel (for architecture i386):   Mach-O executable i386
/mach_kernel (for architecture ppc):    Mach-O executable ppc
cristi:~ diciu$ ./a.out
cristi:~ diciu$ echo $?
1
Était-ce utile?

La solution

Le processeur peut passer du mode d'exécution 64 bits au mode 32 bits lorsqu'il est intercepté dans le contexte du noyau, et un noyau 32 bits peut toujours être construit pour comprendre les structures transmises par les applications d'espace utilisateur 64 bits.

De toute façon, le noyau MacOS X ne déréférence pas directement les pointeurs de l'application utilisateur, car il réside dans son propre espace d'adressage distinct.Un pointeur d'espace utilisateur dans un appel ioctl, par exemple, doit d'abord être résolu en son adresse physique, puis en une nouvelle adresse virtuelle créée dans l'espace d'adressage du noyau.Peu importe que ce pointeur dans l'ioctl soit de 64 bits ou de 32 bits, le noyau ne le déréférence pas directement dans les deux cas.

Ainsi, mélanger un noyau 32 bits et des binaires 64 bits peut fonctionner, et vice versa.La chose que vous ne pouvez pas faire est de mélanger des bibliothèques 32 bits avec une application 64 bits, car les pointeurs passés entre elles seraient tronqués.MacOS X fournit davantage de ses frameworks dans les versions 32 et 64 bits dans chaque version.

Autres conseils

Ce n'est pas le noyau qui exécute le binaire.C'est le processeur.

Le binaire appelle des fonctions de bibliothèque et celles-ci doivent être en 64 bits.Et s'ils ont besoin de faire un appel système, il est de leur responsabilité de faire face au fait qu'ils sont eux-mêmes en 64 bits, mais que le noyau n'en a que 32.

Mais ce n’est pas quelque chose dont vous devriez vous inquiéter.

Notez que non tous Les noyaux 32 bits sont capables d'exécuter des processus 64 bits.Windows n'a certainement pas cette propriété et je ne l'ai jamais vu sous Linux.

Le noyau 32 bits capable de charger et d'exécuter des binaires 64 bits doit disposer d'un code 64 bits pour gérer le mappage mémoire, le chargement des programmes et quelques autres problèmes 64 bits.

Cependant, le planificateur et de nombreuses autres opérations du système d'exploitation ne sont pas obligés de fonctionner en mode 64 bits pour résoudre d'autres problèmes : il fait passer le processeur en mode 32 bits et inversement si nécessaire pour gérer les pilotes, les tâches, l'allocation de mémoire et le mappage. , interruptions, etc.

En fait, la plupart des choses que fait le système d'exploitation ne fonctionneraient pas nécessairement plus rapidement en 64 bits - le système d'exploitation n'est pas un processeur de données lourd, et les parties qui le sont (flux, E/S disque, etc.) sont probablement converties. à 64 bits (plugins pour le système d'exploitation de toute façon).

Mais le noyau nu lui-même ne changera probablement pas de tâche plus rapidement, etc., s'il était en 64 bits.

C'est particulièrement le cas lorsque la plupart des gens exécutent encore des applications 32 bits, de sorte que le changement de mode n'est pas toujours nécessaire, même s'il s'agit d'une opération peu coûteuse, cela prend un certain temps.

-Adam

Un fichier ELF32 peut contenir des instructions 64 bits et s'exécuter en mode 64 bits.La seule chose qu'il a, c'est que l'organisation de l'en-tête et des symboles est au format 32 bits.Les décalages de la table des symboles sont de 32 bits.Les entrées de la table des symboles ont une largeur de 32 bits, etc.Un fichier contenant à la fois du code 64 bits et du code 32 bits peut s'exposer en tant que fichier ELF 32 bits dans lequel il utilise des registres 64 bits pour ses calculs internes.mach_kernel est l'un de ces exécutables.L'avantage est que les ELF de pilotes 32 bits peuvent y être liés.S'il prend soin de transmettre des pointeurs situés en dessous de 4 Go vers d'autres binaires ELF liés, cela fonctionnera correctement.

Que le noyau soit en 64 bits n'apporterait que l'avantage effectif que les extensions du noyau (c'est-à-dire généralement les pilotes) pourraient être en 64 bits.En fait, vous auriez besoin d'avoir soit toutes les extensions de noyau 64 bits, soit (comme c'est le cas actuellement) toutes celles 32 bits ;ils doivent être natifs de l'architecture du noyau en cours d'exécution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top