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
|
The FreeBSD German Documentation Project
|
||||||
|
|
||||||
$FreeBSD$
|
$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
|
basiert auf: 1.80
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@
|
||||||
</indexterm>
|
</indexterm>
|
||||||
|
|
||||||
<para>FreeBSD bietet Binärkompatibilität zu verschiedenen
|
<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
|
könnten Sie sich fragen, warum FreeBSD in der Lage sein
|
||||||
muss, Linux-Binärprogramme auszuführen? Die Antwort
|
muss, Linux-Binärprogramme auszuführen? Die Antwort
|
||||||
auf diese Frage ist sehr einfach. Viele Unternehmen und Entwickler
|
auf diese Frage ist sehr einfach. Viele Unternehmen und Entwickler
|
||||||
|
@ -165,7 +165,7 @@ Id Refs Address Size Name
|
||||||
1 2 0xc0100000 16bdb8 kernel
|
1 2 0xc0100000 16bdb8 kernel
|
||||||
7 1 0xc24db000 d000 linux.ko</screen>
|
7 1 0xc24db000 d000 linux.ko</screen>
|
||||||
<indexterm>
|
<indexterm>
|
||||||
<primary>Kernel-Option</primary>
|
<primary>Kerneloption</primary>
|
||||||
<secondary>LINUX</secondary>
|
<secondary>LINUX</secondary>
|
||||||
</indexterm>
|
</indexterm>
|
||||||
|
|
||||||
|
@ -3236,21 +3236,169 @@ options SHMMAXPGS=393216
|
||||||
</sect2>
|
</sect2>
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
|
<!-- j.kois@web.de, 08. Dezember 2002 -->
|
||||||
<sect1>
|
<sect1>
|
||||||
<title>Weiterführende Themen</title>
|
<title>Weiterführende Themen</title>
|
||||||
|
|
||||||
<para>Wenn Sie sich fragen, wie die Linux-Binärkompatibilität
|
<para>Wenn Sie sich fragen, wie die Linux-Binärkompatibilität
|
||||||
unter FreeBSD realisiert wurde, sollten Sie diesen (englischen)
|
unter FreeBSD realisiert wurde, sollten Sie diesen Abschnitt lesen.
|
||||||
Abschnitt lesen. Der Großteil der folgenden Informationen
|
Der Großteil der folgenden Informationen stammt aus einer
|
||||||
stammt aus einer E-Mail, die von Terry Lambert
|
E-Mail, die von Terry Lambert (<email>tlambert@primenet.com</email>)
|
||||||
(<email>tlambert@primenet.com</email>) an die FreeBSD-Chat-
|
an die FreeBSD-Chat-Mailingliste
|
||||||
Mailingliste (<email>freebsd-chat@FreeBSD.org</email>) geschrieben wurde
|
(<email>freebsd-chat@FreeBSD.org</email>) geschrieben wurde
|
||||||
(Message ID: <literal><199906020108.SAA07001@usr09.primenet.com></literal>).
|
(Message ID: <literal><199906020108.SAA07001@usr09.primenet.com></literal>).</para>
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>Dieser Abschnitt ist noch nicht übersetzt. Lesen Sie bitte
|
<sect2>
|
||||||
<ulink url="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/linuxemu.html">
|
<title>Wie funktioniert es?</title>
|
||||||
diesen Abschnitt in englischer Sprache</ulink>.</para>
|
<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>
|
</sect1>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
|
@ -3264,5 +3412,3 @@ options SHMMAXPGS=393216
|
||||||
sgml-parent-document: ("../book.sgml" "part" "chapter")
|
sgml-parent-document: ("../book.sgml" "part" "chapter")
|
||||||
End:
|
End:
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue