Add a new translated section "Advanced Topics".

This commit is contained in:
Marc Fonvieille 2003-10-23 18:21:02 +00:00
parent 8f608f949f
commit 5751e78660
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=18549

View file

@ -3648,8 +3648,182 @@ options SHMMAXPGS=393216
</sect1>
<sect1 id="linuxemu-advanced">
<title>Advanced Topics ** Traduction en Cours **</title>
<para></para>
<title>Sujets avanc&eacute;s</title>
<para>Si vous &ecirc;tes curieux de savoir comment la
compatibilit&eacute; binaire avec Linux fonctionne, cette
section est faite pour vous. La plupart de ce qui suit est
principalement bas&eacute; sur un courrier &eacute;lectronique
de Terry Lambert <email>tlambert@primenet.com</email>
envoy&eacute; &agrave; la &a.chat; (Message ID:
<literal>&lt;199906020108.SAA07001@usr09.primenet.com&gt;</literal>).</para>
<sect2>
<title>Comme &ccedil;a marche?</title>
<indexterm><primary>chargeur de classe d'ex&eacute;cution</primary></indexterm>
<para>&os; poss&egrave;de une abstraction appel&eacute;e
&ldquo;chargeur de classe d'ex&eacute;cution&rdquo;. C'est
une portion de l'appel syst&egrave;me &man.execve.2;.</para>
<para>Ce qui se passe est que &os; dispose d'une liste de
chargeurs, &agrave; la place d'un simple chargeur avec retour
(&ldquo;fallback&rdquo;) vers le chargeur
<literal>#!</literal> pour ex&eacute;cuter n'importe quel
interpr&eacute;teur de commandes ou proc&eacute;dure.</para>
<para>Historiquement, l'unique chargeur sur les plate-formes
&unix; examinait le nombre magique (g&eacute;n&eacute;ralement
les 4 ou 8 premiers octets du fichier) pour voir si
c'&eacute;tait un binaire connu par le syst&egrave;me, et si
c'&eacute;tait le cas, invoquait le chargeur binaire.</para>
<para>Si ce n'&eacute;tait pas le type de binaire du
syst&egrave;me, l'appel &man.execve.2; retournait un
&eacute;chec, et l'interpr&eacute;teur de commandes tentait de
l'ex&eacute;cuter comme une commande
d'interpr&eacute;teur.</para>
<para>Cette hypoth&egrave;se est celle par d&eacute;faut quelque
soit l'interpr&eacute;teur de commandes actuel.</para>
<para>Plus tard, une modification a &eacute;t&eacute; faite sur
&man.sh.1; pour examiner les deux premiers caract&egrave;res,
et s'ils &eacute;taient <literal>:\n</literal>, alors elle
invoquait l'interpr&eacute;teur de commandes &man.csh.1;
&agrave; la place (nous pensons que l'entreprise SCO fut la
premi&egrave;re &agrave; faire cette modification).</para>
<para>Ce que fait maintenant &os; est de parcourir une liste de
chargeurs, avec un chargeur <literal>#!</literal>
g&eacute;n&eacute;rique qui reconnait les noms des
interpr&eacute;teurs qui se trouvent apr&egrave;s le
caract&egrave;re espace suivant, puis avec un retour possible
vers <filename>/bin/sh</filename>.</para>
<indexterm><primary>ELF</primary></indexterm>
<para>Pour le support de l'ABI Linux, &os; voit le nombre
magique comme un binaire ELF (il ne fait pas la
diff&eacute;rence &agrave; ce niveau entre &os;, &solaris;,
Linux, ou tout autre syst&egrave;me d'exploitation qui dispose
d'un type d'image ELF).</para>
<indexterm><primary>Solaris</primary></indexterm>
<para>Le chargeur ELF recherche une <emphasis>marque</emphasis>
sp&eacute;cifique, qui se trouve dans une section de commentaire
dans l'image ELF, et qui n'est pas pr&eacute;sente dans les
binaires SVR4/&solaris; ELF.</para>
<para>Pour que les binaires Linux puissent fonctionner, ils
doivent &ecirc;tre <emphasis>marqu&eacute;s</emphasis> sous le
type <literal>Linux</literal> avec &man.brandelf.1;:</para>
<screen>&prompt.root; <userinput>brandelf -t Linux file</userinput></screen>
<para>Quand cela est fait, le chargeur ELF verra le marquage
<literal>Linux</literal> sur le fichier.</para>
<indexterm>
<primary>ELF</primary>
<secondary>marquage</secondary>
</indexterm>
<para>Lorsque le chargeur ELF voit le marquage
<literal>Linux</literal>, le chargeur remplace un pointeur
dans la structure <literal>proc</literal>. Tous les appels
syst&egrave;me sont ind&eacute;x&eacute;s par
l'interm&eacute;diaire de ce pointeur (dans un syst&egrave;me
&unix; traditionnel, cela serait la structure
<literal>sysent[]</literal>, contenant les appels
syst&egrave;me). De plus, le processus est marqu&eacute; pour
une gestion sp&eacute;ciale du vecteur d'interruption
(&ldquo;trap&rdquo;) pour le signal de code
&ldquo;trampoline&rdquo;, et plusieurs autres corrections
(mineures) qui sont g&eacute;r&eacute;es par le noyau
Linux.</para>
<para>Le vecteur d'appel syst&egrave;me Linux contient, entre
autres, une liste des entr&eacute;es
<literal>sysent[]</literal> dont les adresses r&eacute;sident
dans le noyau.</para>
<para>Quand un appel syst&egrave;me est effectu&eacute; par le
binaire Linux, le code &ldquo;trap&rdquo;
d&eacute;r&eacute;f&eacute;rence de la structure
<literal>proc</literal> le pointeur de la fonction de l'appel
syst&egrave;me, et utilise les points d'entr&eacute;e Linux,
et non pas &os;, de d'appel syst&egrave;me.</para>
<para>De plus, le mode Linux red&eacute;finit dynamiquement
l'origine des requ&ecirc;tes; c'est, en effet, ce qu'effectue
l'option <option>union</option> (<emphasis>pas</emphasis> le
type de syst&egrave;me de fichiers
<literal>unionfs</literal>!) de montage des syst&egrave;mes de
fichiers. Tout d'abord, une tentative est faite pour
rechercher le fichier dans le r&eacute;pertoire <filename
role='directory'>/compat/linux/<replaceable>chemin-origine</replaceable></filename>,
<emphasis>puis</emphasis> uniquement si cela &eacute;choue, la
recherche est effectu&eacute;e dans le r&eacute;pertoire
<filename
role='directory'>/<replaceable>chemin-origine</replaceable></filename>.
Cela permet de s'assurer que les binaires n&eacute;cessitant
d'autres binaires puissent s'ex&eacute;cuter (par exemple,
l'ensemble des outils Linux peuvent tourner sous l'ABI Linux).
Cela signifie &eacute;galement que les binaires Linux peuvent
charger et ex&eacute;cuter les binaires &os;, s'il n'y a pas
de binaires Linux correspondant pr&eacute;sents, et vous
pourriez placer une commande &man.uname.1; dans l'arborescence
<filename role='directory'>/compat/linux</filename> pour vous
assurer que les binaires Linux ne puissent pas dire qu'ils ne
tournent pas sous Linux.</para>
<para>En effet, il y a un noyau Linux dans le noyau &os;; les
diverses fonctions sous-jacentes qui impl&eacute;mentent tous
les services fournis par le noyau sont identiques entre les
deux tables d'entr&eacute;es des appels syst&egrave;mes &os;
et Linux: les op&eacute;rations sur les syst&egrave;mes de
fichiers, les op&eacute;rations sur la m&eacute;moire
virtuelle, la gestion des signaux, l'IPC System V, etc. La
seule diff&eacute;rence est que les binaires &os; utilisent
les fonctions <emphasis>glue</emphasis> de &os;, et les
binaires Linux celles de Linux (les plus anciens
syst&egrave;mes d'exploitation avaient uniquement leurs
propres fonctions de <emphasis>glue</emphasis>: les adresses
des fonctions dans une structure <literal>sysent[]</literal>
statique globale, au lieu des adresses des fonctions
d&eacute;r&eacute;f&eacute;renc&eacute;es d'un pointeur
initialis&eacute; dynamiquement pointant vers la structure
<literal>proc</literal> du processus faisant l'appel).</para>
<para>Laquelle est l'ABI native &os;? Cela n'a pas
d'importance. Basiquement, la seule diff&eacute;rence est que
(actuellement, cela pourrait facilement changer dans les
versions futures, et probablement apr&egrave;s cela) les
fonctions <emphasis>glue</emphasis> de &os; sont li&eacute;es
en statique dans le noyau, les fonctions
<emphasis>glue</emphasis> Linux peuvent &ecirc;tre
li&eacute;es statiquement, ou l'on peut y acc&eacute;der via
un module du noyau.</para>
<para>Oui, mais est-ce vraiment de l'&eacute;mulation? Non.
C'est l'impl&eacute;mentation d'une interface binaire pour les
applications (ABI). Il n'y a pas d'&eacute;mulateur (ou de
simulateur, pour couper court aux prochaines questions)
impliqu&eacute;.</para>
<para>Mais pourquoi appelle-t-on parfois cela
&ldquo;&eacute;mulation Linux&rdquo;? Pour rendre difficile
la vente des versions de &os;! S&eacute;rieusement, c'est
d&ucirc; au fait que l'impl&eacute;mentation historique a
&eacute;t&eacute; faite &agrave; une &eacute;poque o&ugrave;
il n'y avait pas vraiment d'autres mots pour d&eacute;crire ce
qui &eacute;tait en d&eacute;veloppement; dire que &os;
ex&eacute;cutait les binaires Linux n'&eacute;tait pas vrai si
vous n'aviez pas compil&eacute; le code ou charg&eacute; un
module, aussi un terme &eacute;tait n&eacute;cessaire pour
qualifier ce qui &eacute;tait charg&eacute; &mdash; donc
l'&ldquo;&eacute;mulateur Linux&rdquo;.</para>
</sect2>
</sect1>
</chapter>