diff options
author | J. Vicente Carrasco <carvay@FreeBSD.org> | 2008-12-08 23:37:41 +0000 |
---|---|---|
committer | J. Vicente Carrasco <carvay@FreeBSD.org> | 2008-12-08 23:37:41 +0000 |
commit | fcaf7cf9ecf999a725bc5742ba50d744e97b9f1e (patch) | |
tree | fca075b762a920dfd50828ab2190adc913cff2fb /es_ES.ISO8859-1/books | |
parent | 70f28eb8bd314c5612932c0864e86b8e50d74b53 (diff) | |
download | doc-fcaf7cf9ecf999a725bc5742ba50d744e97b9f1e.tar.gz doc-fcaf7cf9ecf999a725bc5742ba50d744e97b9f1e.zip |
Add last section of chapter. We have linuxemu
chapter up to date.
Submitted by: Jose A. Accino accino at uma dot es
Notes
Notes:
svn path=/head/; revision=33396
Diffstat (limited to 'es_ES.ISO8859-1/books')
-rwxr-xr-x | es_ES.ISO8859-1/books/handbook/linuxemu/chapter.sgml | 202 |
1 files changed, 184 insertions, 18 deletions
diff --git a/es_ES.ISO8859-1/books/handbook/linuxemu/chapter.sgml b/es_ES.ISO8859-1/books/handbook/linuxemu/chapter.sgml index 3f67429f55..f577619306 100755 --- a/es_ES.ISO8859-1/books/handbook/linuxemu/chapter.sgml +++ b/es_ES.ISO8859-1/books/handbook/linuxemu/chapter.sgml @@ -5,7 +5,7 @@ The FreeBSD Spanish Documentation Project %SOURCE% en_US.ISO8859-1/books/handbook/linuxemu/chapter.sgml - %SRCID% 0.0 + %SRCID% 1.136 $FreeBSD$ --> @@ -3556,23 +3556,189 @@ options SHMMAXPGS=393216 <sect1 id="linuxemu-advanced"> <title>Temas avanzados</title> - <para>Pendiente de traducción</para> - <!-- + <para>Si siente curiosidad por saber cómo funciona + la compatibilidad con Linux esta es la sección que + debe leer. La mayor parte de lo que sigue está + basado casi en su totalidad en un mensaje enviado por Terry + Lambert <email>tlambert@primenet.com</email> a la lista &a.chat; + (Message ID: <literal><199906020108.SAA07001@usr09.primenet.com></literal>).</para> + <sect2> - </sect2> - --> - </sect1> -</chapter> - -<!-- - Local Variables: - mode: sgml - sgml-declaration: "../chapter.decl" - sgml-indent-data: t - sgml-omittag: nil - sgml-always-quote-attributes: t - sgml-parent-document: ("../book.sgml" "part" "chapter") - End: ---> + <title>¿Cómo funciona?</title> + <indexterm><primary>cargador de clase en + ejecución</primary></indexterm> + + <para>&os; dispone de una abstracció denominada + <quote>cargador de clase en ejecución</quote>. Esto no + es más que un bloque de có:digo incrustado + en la llamada &man.execve.2; del sistema.</para> + + <para>Históricamente las plataformas &unix; + disponían de un único cargador + de binarios, que en última instancia + (<emphasis>fallback</emphasis>) recurría + al cargador <literal>#!</literal> para ejecutar + cualesquiera intérpretes o scripts de la shell. Ese + cargador único examinaba el número + mágico (generalmente los 4 u 8 primeros bytes + del fichero) para ver si era un binario reconocible + por el sistema y, en tal caso, invocaba al cargador + binario.</para> + + <para>Si no era de tipo binario, la llamada &man.execve.2; + devolvía un error y la shell intentaba empezar + a ejecutarlo como órdenes shell, tomando por + defecto como punto de partida + <quote>la shell actual, sea cual sea</quote>.</para> + + <para>Posteriormente se pensó en hacer una + modificación de manera que &man.sh.1; examinara + los dos primeros caracteres, de modo que si eran + <literal>:\n</literal> se llamaba a la shell + &man.csh.1; en su lugar (parece ser que en SCO + fueron los primeros en utilizar ese truco).</para> + + <para>Lo que ocurre ahora es que &os; dispone de una + lista de cargadores, en lugar de uno solo. &os; + recorre esa lista de cargadores, con un cargador genérico + <literal>#!</literal> que sabe reconocer los + intérpretes en base a los caracteres que + siguen al siguiente espacio en blanco, con + <filename>/bin/sh</filename> como último + recurso.</para> + + + <indexterm><primary>ELF</primary></indexterm> + + <para>Para dar soporte a la ABI + (<quote>Application Binary Interface</quote>) de Linux, + &os; interpreta el número mágico como un + binario ELF (<quote>Executable and Linking + Format</quote>): En este punto no hace distinción + entre &os;, &solaris;, &linux; o cualquier otro SO que tenga un + tipo de imagen ELF.</para> + + <indexterm><primary>Solaris</primary></indexterm> + + <para>El cargador ELF busca entonces una marca + (<emphasis>brand</emphasis>) especial, una + sección de comentarios en la imagen ELF + que no está presente en los binarios ELF de + SVR4/&solaris;.</para> + + <para>Para que los binarios de Linux funcionen deben + estar marcados con &man.brandelf.1; como tipo + <literal>Linux</literal>:</para> + + <screen>&prompt.root; <userinput>brandelf -t Linux file</userinput></screen> + + <para>Hecho esto el cargador ELF verá la + marca <literal>Linux</literal> en el fichero.</para> + <indexterm> + <primary>ELF</primary> + <secondary>marcado</secondary> + </indexterm> + + <para>Cuando el cargador ELF ve la marca + <literal>Linux</literal> sustituye un puntero en la + estructura <literal>proc</literal>. Todas las + llamadas del sistema se indexan a través de + este puntero (en un sistema &unix; tradicional + sería el «array» de estructura + <literal>sysent[]</literal> que contiene las llamadas + del sistema). Además, el proceso se marca + con unos indicadores (<quote>flags</quote>) para que + el vector trampa del código de envío + señales lo maneje de una forma determinada, + así como otros arreglos (menores) que + serán utilizados por el módulo Linux + del kernel.</para> + + <para>El vector de llamada del sistema Linux contiene, + entre otras cosas, una lista de entradas + <literal>sysent[]</literal> cuyas direcciones residen + en el módulo del kernel.</para> + + <para>Cuando el binario Linux realiza una llamada al + sistema, el código trampa extrae el puntero + a la función de la llamada del sistema de la estructura + <literal>proc</literal>, y así obtiene los puntos de + entrada a las llamadas del sistema Linux, no las + de &os;.</para> + + <para>Además, el modo Linux cambia la raíz + de las búsquedas de una forma dinámica. En + efecto, esto es lo que hace la opción + <option>union</option> cuando se monta un sistema de ficheros + (¡y que <emphasis>no</emphasis> es lo mismo que el + sistema de ficheros <literal>unionfs</literal>!). Primero + se hace un intento de buscar el fichero en el directorio + <filename>/compat/linux/<replaceable>ruta-original</replaceable></filename> + y <emphasis>solo después</emphasis>, si lo anterior + falla, se repite la búsqueda en el + directorio + <filename>/<replaceable>ruta-original</replaceable></filename>. Esto + permite que se puedan ejecutar binarios que necesitan de + otros binarios (por ejemplo las herramientas de + programación (<quote>toolchain</quote>) de Linux + pueden ejecutarse en su totalidad bajo la ABI de + Linux). Esto significa también que los binarios + Linux pueden cargar y ejecutar binarios &os; si los binarios + Linux equivalentes no se hallan presentes y que se puede poner + una orden &man.uname.1; en el árbol de directorios + <filename>/compat/linux</filename> para poder estar seguros de + que los binarios Linux no puedan decir que no estaban + ejecutándose en Linux.</para> + + <para>En efecto, hay un kernel Linux en el kernel + &os;; las distintas funciones subyacentes que + implementan todos los servicios proporcionados + por el kernel son idénticas en ambas, las + tablas de entradas de llamadas del sistema en &os; y en + Linux: operaciones del sistema de ficheros, operaciones + de memoria virtual, envío de señales + IPC System V, etc. La única diferencia es que + los binarios &os; reciben sus funciones de + conexión (<quote><emphasis>glue</emphasis></quote>) + y los binarios Linux las suyas (la mayoría de los + sistemas operativos más antiguos solo tienen sus + propias funciones de conexión: + direcciones de funciones en un <quote>array</quote> de + estructura <literal>sysent[]</literal> estática y + global, en lugar de direcciones de funciones que se extraen + a partir de un puntero inicializado dinámicamente + en la estructura <literal>proc</literal> del proceso que hace + la llamada).</para> + + + <para>¿Cuál es entonces la ABI nativa de &os;? No + importa. Básicamente, la única diferencia + es (ahora mismo; esto podría cambiar y probablemente lo + hará en una release futura) que las funciones de + conexión de &os; están enlazadas + estáticamente en el kernel mientras que las de + Linux pueden estarlo también estáticamente o + se puede acceder a ellas por medio de un módulo + del kernel.</para> + + <para>Bien, pero ¿de verdad es esto una + emulación? No. Es una implementación ABI, no + una emulación. No hay un emulador involucrado (ni + un simulador, para adelantarnos a la siguiente + pregunta).</para> + + <para>Entonces ¿por qué a veces se le llama + <quote>emulación Linux</quote>? ¡Para hacer + más difícil el vender &os;! En serio, se + debe a que la primera implementación se hizo + en un momento en que realmente no había ninguna + palabra distinta a esa para describir lo que se estaba + haciendo; decir que &os; ejecutaba binarios Linux no era + cierto si no se compilaba el código o se cargaba + un módulo; hacía falta una forma de + describir todo esto y acabamos usando + <quote>emulador Linux</quote>.</para> + </sect2> + </sect1> |