Finish the translation of the linuxemu chapter.

Submitted by:	Johann Kois <j.kois@web.de>
Obtained from:	The FreeBSD German Documentation Project
This commit is contained in:
Martin Heinen 2002-12-23 12:50:21 +00:00
parent dc2e41ebb2
commit 98bfe8e4c6
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=15418

View file

@ -3,7 +3,7 @@
The FreeBSD German Documentation Project
$FreeBSD$
$FreeBSDde: de-docproj/books/handbook/linuxemu/chapter.sgml,v 1.31 2002/12/05 17:54:22 mheinen Exp $
$FreeBSDde: de-docproj/books/handbook/linuxemu/chapter.sgml,v 1.36 2002/12/22 19:18:02 mheinen Exp $
basiert auf: 1.80
-->
@ -51,7 +51,7 @@
</indexterm>
<para>FreeBSD bietet Bin&auml;rkompatibilit&auml;t zu verschiedenen
anderen Unix-artigen Betriebssystemen, darunter auch Linux. Nun
anderen &unix; Betriebssystemen, darunter auch Linux. Nun
k&ouml;nnten Sie sich fragen, warum FreeBSD in der Lage sein
muss, Linux-Bin&auml;rprogramme auszuf&uuml;hren? Die Antwort
auf diese Frage ist sehr einfach. Viele Unternehmen und Entwickler
@ -165,7 +165,7 @@ Id Refs Address Size Name
1 2 0xc0100000 16bdb8 kernel
7 1 0xc24db000 d000 linux.ko</screen>
<indexterm>
<primary>Kernel-Option</primary>
<primary>Kerneloption</primary>
<secondary>LINUX</secondary>
</indexterm>
@ -3236,21 +3236,169 @@ options SHMMAXPGS=393216
</sect2>
</sect1>
<!-- j.kois@web.de, 08. Dezember 2002 -->
<sect1>
<title>Weiterf&uuml;hrende Themen</title>
<para>Wenn Sie sich fragen, wie die Linux-Bin&auml;rkompatibilit&auml;t
unter FreeBSD realisiert wurde, sollten Sie diesen (englischen)
Abschnitt lesen. Der Gro&szlig;teil der folgenden Informationen
stammt aus einer E-Mail, die von Terry Lambert
(<email>tlambert@primenet.com</email>) an die FreeBSD-Chat-
Mailingliste (<email>freebsd-chat@FreeBSD.org</email>) geschrieben wurde
(Message ID: <literal>&lt;199906020108.SAA07001@usr09.primenet.com&gt;</literal>).
</para>
unter FreeBSD realisiert wurde, sollten Sie diesen Abschnitt lesen.
Der Gro&szlig;teil der folgenden Informationen stammt aus einer
E-Mail, die von Terry Lambert (<email>tlambert@primenet.com</email>)
an die FreeBSD-Chat-Mailingliste
(<email>freebsd-chat@FreeBSD.org</email>) geschrieben wurde
(Message ID: <literal>&lt;199906020108.SAA07001@usr09.primenet.com&gt;</literal>).</para>
<para>Dieser Abschnitt ist noch nicht &uuml;bersetzt. Lesen Sie bitte
<ulink url="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/linuxemu.html">
diesen Abschnitt in englischer Sprache</ulink>.</para>
<sect2>
<title>Wie funktioniert es?</title>
<indexterm><primary>execution class loader</primary></indexterm>
<para>FreeBSD verf&uuml;gt &uuml;ber eine <quote>execution class
loader</quote> genannte Abstraktion. Dabei handelt es sich um einen
Eingriff in den &man.execve.2; Systemaufruf.</para>
<para>FreeBSD verf&uuml;gt &uuml;ber eine Liste von Ladern, anstelle
eines einzigen, auf <literal>#!</literal>
zur&uuml;ckgreifenden Laders, um Shell-Interpreter oder Shell-Skripte
auszuf&uuml;hren.</para>
<para>Historisch gesehen untersuchte der einzige, auf
UNIX-Plattformen vorhandene Lader die "magische Zahl"
(in der Regel die ersten 4 oder 8&nbsp;Bytes der Datei), um
festzustellen, ob der Bin&auml;rtyp dem System bekannt war.
War dies der Fall, wurde der Bin&auml;rlader aufgerufen.</para>
<para>Wenn es sich nicht um den zum System geh&ouml;rigen Bin&auml;rtyp
handelte, gab &man.execve.2; einen Fehler zur&uuml;ck,
und die Shell versuchte stattdessen, die Datei als Shell-Befehl
auszuf&uuml;hren.</para>
<para>Dabei wurde als Standardeinstellung <quote>was auch immer die
aktuelle Shell ist</quote> festgelegt.</para>
<para>Sp&auml;ter wurde ein Hack in &man.sh.1; eingef&uuml;gt,
der die zwei ersten Zeichen untersuchte. Wenn diese
<literal>:\n</literal> entsprachen,
wurde stattdessen die &man.csh.1;-Shell aufgerufen
(wir glauben, dass dies zuerst von SCO umgesetzt wurde).</para>
<para>FreeBSD versucht heute eine Liste von Ladern, unter denen
sich ein allgemeiner Lader f&uuml;r Interpreter befindet. Der
auszuf&uuml;hrende Interpreter wird im ersten, durch
Leerzeichen getrennten Feld, der <literal>#!</literal>-Zeile
angegeben. L&auml;&szlig;t sich der Interpreter nicht ermitteln,
wird auf <filename>/bin/sh</filename> zur&uuml;ckgegriffen.</para>
<indexterm><primary>ELF</primary></indexterm>
<para>F&uuml;r die Linux ABI-Unterst&uuml;tzung erkennt FreeBSD
die magische Zahl als ELF-Bin&auml;rdatei (Zu diesem Zeitpunkt wird
nicht zwischen FreeBSD, Solaris, Linux oder anderen Systemen
unterschieden, die &uuml;ber ELF-Bin&auml;rdateien
verf&uuml;gen.).</para>
<indexterm><primary>Solaris</primary></indexterm>
<para>Der ELF-Lader sucht nach einer speziellen
<emphasis>Kennzeichnung</emphasis>, die aus einem Kommentarabschnitt
in der ELF-Datei besteht, und die in SVR4/Solaris ELF
Bin&auml;rdateien nicht vorhanden ist.</para>
<para>Damit Linux-Bin&auml;rdateien (unter FreeBSD) funktionieren,
m&uuml;ssen sie als <literal> Linux</literal>
<emphasis>gekennzeichnet</emphasis> werden, und zwar durch
&man.brandelf.1;:</para>
<screen>&prompt.root; <userinput>brandelf -t Linux file</userinput></screen>
<para>Nachdem dies geschehen ist, erkennt der ELF-Lader die
<literal>Linux</literal>-Kennzeichnung der Datei.</para>
<indexterm>
<primary>ELF</primary>
<secondary><command>brandelf</command></secondary>
</indexterm>
<para>Wenn der ELF-Lader die <literal>Linux</literal>-Kennzeichnung
sieht, wird ein Zeiger in der <literal>proc</literal>-Struktur
ersetzt. Alle Systemaufrufe werden durch diesen Zeiger indiziert
(in einem traditionellen &unix; System w&auml;re das ein
<literal>sysent[]</literal>-Strukturfeld, das die Systemaufrufe
enth&auml;lt). Der Prozess wird weiterhin speziell gekennzeichnet,
so dass der Trap-vector im Signal-trampoline-code eine spezielle
Behandlung erf&auml;hrt und das Linux-Kernelmodul verschiedene
kleinere Korrekturen vornehmen kann.</para>
<para>Der Linux-Systemaufrufvektor enth&auml;lt neben anderen
Dingen eine Liste der <literal>sysent[]</literal>-Eintr&auml;ge,
deren Adressen sich im Kernelmodul befinden.</para>
<para>Wenn ein Linux-Programm einen Systemaufruf ausf&uuml;hrt,
dereferenziert die Trap-Behandlungsroutine den Zeiger auf die
Eintrittspunkte f&uuml;r die Systemaufrufe und erh&auml;lt damit die
Linux-Eintrittspunkte und nicht die FreeBSD-Eintrittspunkte.</para>
<para>Zus&auml;tzlich <emphasis>ver&auml;ndert</emphasis> der
Linuxmodus die Systempfade dynamisch; genauso, wie dies die
<literal>union</literal> Option beim Einbinden von Dateisystemen
macht (Achtung: <emphasis>nicht</emphasis> unionfs!).
Zuerst wird die Datei im <filename>/compat/linux/<replaceable>Originalpfad</replaceable></filename>
Verzeichnis gesucht, <emphasis>erst dann</emphasis>, d.h. nur
wenn dies fehlschl&auml;gt, wird im
(FreeBSD)-<filename>/<replaceable>Originalpfad</replaceable></filename>
-Verzeichnis gesucht. Dadurch wird sichergestellt, dass
Bin&auml;rdateien, die zur Ausf&uuml;hrung andere
Bin&auml;rdateien ben&ouml;tigen, ausgef&uuml;hrt
werden k&ouml;nnen (so dass alle Linux-Werkzeuge unter der
ABI laufen). Dies bedeutet auch,
dass Linux-Bin&auml;rdateien FreeBSD-Bin&auml;rdateien
laden und ausf&uuml;hren k&ouml;nnen, wenn keine passenden
Linux-Bin&auml;rdateien vorhanden sind. Ein in
<filename>/compat/linux</filename> plaziertes &man.uname.1; kann
damit Linux-Programmen vorgaukeln, dass sie auf einem Linux-System
laufen.</para>
<para>Im Endeffekt gibt es einen Linux-Kernel innerhalb des
FreeBSD-Kernels. Die Sprungtabellen f&uuml;r Linux-
beziehungsweise FreeBSD-Systemaufrufe verweisen allerdings auf
dieselben Funktionen, die Kerneldienste wie Dateisystemoperationen,
Operationen f&uuml;r den virtuellen Speicher,
Signal&uuml;bermittlung und System&nbsp;V&nbsp;IPC bereitstellen,
Der einzige Unterschied ist, dass Bin&auml;rdateien unter FreeBSD
FreeBSD-<emphasis>glue</emphasis>-Funktionen verwenden.
Linux-Bin&auml;rdateien hingegen verwenden die
Linux-<emphasis>glue</emphasis>-Funktionen. Die meisten
&auml;lteren Betriebssysteme hatten ihre eigenen
<emphasis>glue</emphasis>-Funktionen: Funktionsadressen
in einem globalen, statischen <literal>sysent[]</literal>
Strukturfeld an Stelle von Funktionsadressen, die durch
einen dynamisch initialisierten Zeiger aus der
<literal>proc</literal> Struktur, die den Aufruf gemacht hatte,
dereferenziert wurden.</para>
<para>Welche ist die echte FreeBSD ABI? Das spielt keine Rolle.
Grunds&auml;tzlich ist der einzige Unterschied (d.h. zurzeit; dies
k&ouml;nnte sich in zuk&uuml;nftigen Versionen leicht &auml;ndern
und wird sich wahrscheinlich auch &auml;ndern), dass die
FreeBSD-<emphasis>glue</emphasis>-Funktionen statisch in
den Kernel gelinkt sind, und dass die Linux-<emphasis>glue</emphasis>-Funktionen
statisch gelinkt oder &uuml;ber ein Modul eingebunden werden
k&ouml;nnen.</para>
<para>Ja, aber ist das wirkliche eine Emulation? Nein. Es ist eine ABI
Implementation, keine Emulation. Es ist kein Emulator (oder
Simulator, um der n&auml;chsten Frage zuvorzukommen.)
beteiligt.</para>
<para>Warum wird es manchmal <quote>Linux-Emulation</quote> genannt?
Um es schwerer zu machen, FreeBSD zu verkaufen. Wirklich, das kommt
daher, weil die historische Implementation zu einer Zeit
durchgef&uuml;hrt wurde, in der es kein anderes Wort
(als Emulation) gab, das beschrieb, was vor sich ging.
Wenn der Kernel nicht entsprechend konfiguriert wurde oder das
Modul geladen wurde, war es falsch zu behaupten, FreeBSD w&uuml;rde
Linux-Bin&auml;rprogramme ausf&uuml;hren. Man ben&ouml;tigte
ein Wort, das beschrieb, was da geladen
wurde &mdash; daher <quote>Der Linux-Emulator</quote>.</para>
</sect2>
</sect1>
</chapter>
@ -3264,5 +3412,3 @@ options SHMMAXPGS=393216
sgml-parent-document: ("../book.sgml" "part" "chapter")
End:
-->