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:
parent
dc2e41ebb2
commit
98bfe8e4c6
Notes:
svn2git
2020-12-08 03:00:23 +00:00
svn path=/head/; revision=15418
1 changed files with 161 additions and 15 deletions
|
@ -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ärkompatibilität zu verschiedenen
|
||||
anderen Unix-artigen Betriebssystemen, darunter auch Linux. Nun
|
||||
anderen &unix; Betriebssystemen, darunter auch Linux. Nun
|
||||
könnten Sie sich fragen, warum FreeBSD in der Lage sein
|
||||
muss, Linux-Binärprogramme auszufü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ührende Themen</title>
|
||||
|
||||
<para>Wenn Sie sich fragen, wie die Linux-Binärkompatibilität
|
||||
unter FreeBSD realisiert wurde, sollten Sie diesen (englischen)
|
||||
Abschnitt lesen. Der Groß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><199906020108.SAA07001@usr09.primenet.com></literal>).
|
||||
</para>
|
||||
unter FreeBSD realisiert wurde, sollten Sie diesen Abschnitt lesen.
|
||||
Der Groß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><199906020108.SAA07001@usr09.primenet.com></literal>).</para>
|
||||
|
||||
<para>Dieser Abschnitt ist noch nicht ü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ügt ü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ügt über eine Liste von Ladern, anstelle
|
||||
eines einzigen, auf <literal>#!</literal>
|
||||
zurückgreifenden Laders, um Shell-Interpreter oder Shell-Skripte
|
||||
auszuführen.</para>
|
||||
|
||||
<para>Historisch gesehen untersuchte der einzige, auf
|
||||
UNIX-Plattformen vorhandene Lader die "magische Zahl"
|
||||
(in der Regel die ersten 4 oder 8 Bytes der Datei), um
|
||||
festzustellen, ob der Binärtyp dem System bekannt war.
|
||||
War dies der Fall, wurde der Binärlader aufgerufen.</para>
|
||||
|
||||
<para>Wenn es sich nicht um den zum System gehörigen Binärtyp
|
||||
handelte, gab &man.execve.2; einen Fehler zurück,
|
||||
und die Shell versuchte stattdessen, die Datei als Shell-Befehl
|
||||
auszuführen.</para>
|
||||
|
||||
<para>Dabei wurde als Standardeinstellung <quote>was auch immer die
|
||||
aktuelle Shell ist</quote> festgelegt.</para>
|
||||
|
||||
<para>Später wurde ein Hack in &man.sh.1; eingefü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ür Interpreter befindet. Der
|
||||
auszuführende Interpreter wird im ersten, durch
|
||||
Leerzeichen getrennten Feld, der <literal>#!</literal>-Zeile
|
||||
angegeben. Läßt sich der Interpreter nicht ermitteln,
|
||||
wird auf <filename>/bin/sh</filename> zurückgegriffen.</para>
|
||||
|
||||
<indexterm><primary>ELF</primary></indexterm>
|
||||
|
||||
<para>Für die Linux ABI-Unterstützung erkennt FreeBSD
|
||||
die magische Zahl als ELF-Binärdatei (Zu diesem Zeitpunkt wird
|
||||
nicht zwischen FreeBSD, Solaris, Linux oder anderen Systemen
|
||||
unterschieden, die über ELF-Binärdateien
|
||||
verfü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ärdateien nicht vorhanden ist.</para>
|
||||
|
||||
<para>Damit Linux-Binärdateien (unter FreeBSD) funktionieren,
|
||||
mü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äre das ein
|
||||
<literal>sysent[]</literal>-Strukturfeld, das die Systemaufrufe
|
||||
enthält). Der Prozess wird weiterhin speziell gekennzeichnet,
|
||||
so dass der Trap-vector im Signal-trampoline-code eine spezielle
|
||||
Behandlung erfährt und das Linux-Kernelmodul verschiedene
|
||||
kleinere Korrekturen vornehmen kann.</para>
|
||||
|
||||
<para>Der Linux-Systemaufrufvektor enthält neben anderen
|
||||
Dingen eine Liste der <literal>sysent[]</literal>-Einträge,
|
||||
deren Adressen sich im Kernelmodul befinden.</para>
|
||||
|
||||
<para>Wenn ein Linux-Programm einen Systemaufruf ausführt,
|
||||
dereferenziert die Trap-Behandlungsroutine den Zeiger auf die
|
||||
Eintrittspunkte für die Systemaufrufe und erhält damit die
|
||||
Linux-Eintrittspunkte und nicht die FreeBSD-Eintrittspunkte.</para>
|
||||
|
||||
<para>Zusätzlich <emphasis>verä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ägt, wird im
|
||||
(FreeBSD)-<filename>/<replaceable>Originalpfad</replaceable></filename>
|
||||
-Verzeichnis gesucht. Dadurch wird sichergestellt, dass
|
||||
Binärdateien, die zur Ausführung andere
|
||||
Binärdateien benötigen, ausgeführt
|
||||
werden können (so dass alle Linux-Werkzeuge unter der
|
||||
ABI laufen). Dies bedeutet auch,
|
||||
dass Linux-Binärdateien FreeBSD-Binärdateien
|
||||
laden und ausführen können, wenn keine passenden
|
||||
Linux-Binä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ür Linux-
|
||||
beziehungsweise FreeBSD-Systemaufrufe verweisen allerdings auf
|
||||
dieselben Funktionen, die Kerneldienste wie Dateisystemoperationen,
|
||||
Operationen für den virtuellen Speicher,
|
||||
Signalübermittlung und System V IPC bereitstellen,
|
||||
Der einzige Unterschied ist, dass Binärdateien unter FreeBSD
|
||||
FreeBSD-<emphasis>glue</emphasis>-Funktionen verwenden.
|
||||
Linux-Binärdateien hingegen verwenden die
|
||||
Linux-<emphasis>glue</emphasis>-Funktionen. Die meisten
|
||||
ä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ätzlich ist der einzige Unterschied (d.h. zurzeit; dies
|
||||
könnte sich in zukünftigen Versionen leicht ändern
|
||||
und wird sich wahrscheinlich auch ä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 über ein Modul eingebunden werden
|
||||
kö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ä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ü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ürde
|
||||
Linux-Binärprogramme ausführen. Man benötigte
|
||||
ein Wort, das beschrieb, was da geladen
|
||||
wurde — 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:
|
||||
-->
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue