aboutsummaryrefslogtreecommitdiff
path: root/es_ES.ISO_8859-1/FAQ/hackers.sgml
diff options
context:
space:
mode:
Diffstat (limited to 'es_ES.ISO_8859-1/FAQ/hackers.sgml')
-rw-r--r--es_ES.ISO_8859-1/FAQ/hackers.sgml556
1 files changed, 0 insertions, 556 deletions
diff --git a/es_ES.ISO_8859-1/FAQ/hackers.sgml b/es_ES.ISO_8859-1/FAQ/hackers.sgml
deleted file mode 100644
index 80dc17671e..0000000000
--- a/es_ES.ISO_8859-1/FAQ/hackers.sgml
+++ /dev/null
@@ -1,556 +0,0 @@
-<!-- $FreeBSD$ -->
-<!-- The FreeBSD Documentation Spanish Project -->
- <sect>
- <heading>S&oacute;lo para hackers serios de FreeBSD<label id="hackers">
- </heading>
-
- <sect1>
- <heading>
- &iquest;Qu&eacute; son SNAPs y RELEASEs?
- </heading>
-
- <p>Hay actualmente tres ramas activas/semi-activas en el desarrollo de
- FreeBSD y en su
- <url url="http://www.FreeBSD.org/cgi/cvsweb.cgi" name="CVS Repository">:
-
- <itemize>
- <item><bf/RELENG_2_2/ AKA <bf/2.2-stable/ AKA <bf/"2.2 branch"/
- <item><bf/RELENG_3/ AKA <bf/3.x-stable/ AKA <bf/"3.0 branch"/
- <item><bf/HEAD/ AKA <bf/-current/ AKA <bf/4.0-current/
- </itemize>
-
- <p><bf/HEAD/ no es una rama actual, como las otras dos, es
- simplemente una constante simb&oacute;lica para <em/la versi&oacute;n
- de desarrollo actual/ a la cual nos referimos simplemente como
- <bf/-current/.
-
- <p>Actualmente, <bf/-current/ es el desarrollo de la versi&oacute;n 4.0 y
- la rama <bf/3.0-stable/ es <bf/RELENG_3/, separada de -current en Enero
- de 1999.
-
- <sect1>
- <heading>
- &iquest;C&oacute;mo puedo hacerme mi propia release personalizada?<label id="custrel">
- </heading>
-
- <p>Para hacer una release necesitas hacer tres cosas: primero,
- necesitas usar un kernel con el driver <htmlurl
- url="http://www.FreeBSD.org/cgi/man.cgi?vn" name="vn"> configurado.
- A&ntilde;ade esto a tu fichero de configuraci&oacute;n del kernel y
- crea un nuevo kernel:
-
- <verb>
- pseudo-device vn #Vnode driver (turns a file into a device)
- </verb>
-
- <p>Segundo, debes tener las herramientas del CVS a mano. Para hacer
- esto, puedes usar
- <url url="../../handbook/synching.html#CVSUP" name="CVSUP">
- pero en tu supfile pon el nombre de la release a cvs y borra cualquier
- tag campo de fecha:
-
- <verb>
- *default prefix=/home/ncvs
- *default base=/a
- *default host=cvsup.FreeBSD.org
- *default release=cvs
- *default delete compress use-rel-suffix
-
- ## Main Source Tree
- src-all
- src-eBones
- src-secure
-
- # Other stuff
- ports-all
- www
- doc-all
- </verb>
-
- <p>A continuaci&oacute;n ejecuta <tt/cvsup -g supfile/ para tener todos
- los bits correctos en tu ordenador.
-
- <p>Finalmente, necesitas una buena cantidad de espacio vac&iacute;o para
- crear en el la release. Digamos que est&aacute; en
- <tt>/algun/disco/grande</tt> y en el ejemplo anterior has dejado los
- ficheros del CVS en <tt>/home/ncvs</tt>:
-
- <verb>
- setenv CVSROOT /home/ncvs # or export CVSROOT=/home/ncvs
- cd /usr/src/release
- make release BUILDNAME=3.0-MY-SNAP CHROOTDIR=/algun/disco/grande/release
- </verb>
-
- <p>Una release completa ser&aacute; creada en
- <tt>/algun/disco/grande/</tt> y tendr&aacute;s una instalaci&oacute;n
- completa de tipo FTP en <tt>/algun/disco/grande/R/ftp</tt> cuando acabes.
- Si quieres crear tu SNAP usando otra rama de desarrollo diferente de
- -current, puedes a&ntilde;adir <tt/RELEASETAG=SOMETAG/ a la l&iacute;nea
- de comando anterior de creaci&oacute;n de la release. Por ejemplo,
- <tt/RELEASETAG=RELENG_2_2/ crear&iacute;a un snapshot 2.2 GAMMA.
-
- <sect1>
- <heading>&iquest;C&oacute;mo creo discos de instalaci&oacute;n personalizados?</heading>
-
- <p>El proceso completo de creacaci&oacute;n de discos de
- instalaci&oacute;n y archivos fuentes y binarios esta automatizado por
- varios targets en <tt>/usr/src/release/Makefile</tt>. La
- informaci&oacute;n alli contenida deber&iacute;a ser suficiente para que
- puedas empezar. Falta decir que este proceso necesita la ejecuci&oacute;n
- del comando "make world" y quiz&aacute;s te use mucho tiempo y espacio
- en disco.
-
- <sect1>
- <heading>``make world'' destruye mis binarios instalados.</heading>
-
- <p>S&iacute;, esta es la idea general; como su nombre sugiere,
- "make world" rehace todos los binarios del sistema, de manera que puedas
- estar seguro de tener un entorno limpio y consistente al final (que es
- por lo que tarda tanto).
-
- <p>Si la variable de entorno <tt/DESTDIR/ est&aacute; definida mientras se
- ejecuta <tt/make world/ o <tt/make install/, los binarios creados
- nuevamente seran depositados en un &aacute;rbol de directorios
- id&eacute;ntico al instalado, y a partir de
- <tt>&dollar;&lcub;DESTDIR&rcub;</tt>. Algunas combinaciones aleatorias
- de modificaciones de librer&iacute;as compartidas y programas pueden
- causar que falle el <tt/make world/.
-
- <sect1>
- <heading>
- Cuando mi sistema arranca, dice (bus speed defaulted).
- </heading>
-
- <p>Las controladoras SCSI Adaptec 1542 permiten al usuario configurar
- su velocidad de acceso al bus en software. Versiones anteriores del
- driver de la 1542 intentaban determinar la velocidad m&aacute;s alta
- factible y configurar la Adaptec a esta. Nos hemos encontrado con que esto
- hace fallar el sistema de algunos usuarios, por lo que tienes que
- definir la opci&oacute;n de configuraci&oacute;n del kernel
- <tt/TUNE&lowbar;1542/ para que esto ocurra. En algunos sistemas puede
- que puede hacer que los discos vayan m&aacute;s r&aacute;pidos, pero en
- otros puede que los datos queden corrompidos.
-
-
- <sect1>
- <heading>
- &iquest;Puedo seguir la rama current con acceso limitado a Internet?<label id="ctm">
- </heading>
-
- <p>S&iacute;, puedes hacerlo <tt/sin/ bajarte todo el c&oacute;digo
- fuente usando la
- utilidad <url url="../../handbook/synching.html#CTM" name="CTM.">
-
- <sect1>
- <heading>&iquest;C&oacute;mo partir la distribuci&oacute;n en ficheros de 240k?</heading>
-
- <p>Los sistemas BSD m&aacute;s modernos tienen una opci&oacute;n
- <tt/-b/ para partir que les permite partir los ficheros en
- tama&ntilde;os arbitrarios.
-
- <p>Aqui hay un ejemplo de <tt>/usr/src/Makefile</tt>.
-
- <verb>
- bin-tarball:
- (cd $&lcub;DISTDIR&rcub;; \
- tar cf - . \
- gzip --no-name -9 -c | \
- split -b 240640 - \
- $&lcub;RELEASEDIR&rcub;/tarballs/bindist/bin_tgz.)
- </verb>
-
- <sect1>
- <heading>&iquest;He escrito una extensi&oacute;n del kernel, a quien la
- env&iacute;o?</heading>
-
- <p>Por favor, mira en <url url="../../handbook/contrib.html"
- name="como enviar c&oacute;digo.">
-
- <p>Y gracias por pensar en nosotros!
-
- <sect1>
- <heading>&iquest;C&oacute;mo se detectan e inicializan las tarjetas ISA y PnP?</heading>
-
- <p>Brevemente, hay unos cuantos puertos de entrada/salida a los que
- todas las tarjetas PnP responden cuando el ordenador pregunta si hay
- alguien ah&iacute;. As&iacute;, cuando comienza la rutina de prueba
- de PnP, pregunta si hay alguna tarjeta PnP presente y todas las
- tarjetas responden con su n&uacute;mero de modelo a una lectura I/O
- del mismo puerto. As&iacute; el c&oacute;digo de prueba puede conocer
- el ID de cada tarjeta (asignado por Microsoft/Intel).
-
- <p>Los ID's son dos campos de 32 bits (2&circ;64) + 8 bits de
- checksum. Los primeros 32 bits son el identificador del fabricante.
- No se ha dicho publicamente, pero parece estar asumido que diferentes
- tipos de tarjeta del mismo fabricante pueden tener diferentes id's de
- fabricante. La idea de necesitar 32 bits s&oacute;lo para los
- fabricantes parece un poco excesiva.
-
- <p>La parte baja de 32 bits son un n&uacute;mero de serie,
- direcci&oacute;n ethernet, algo que haga a la tarjeta &uacute;nica. El
- fabricante no debe producir nunca una segunda tarjeta que tenga los
- mismos 32 bits de la parte baja, aunque los 32 bits de la parte alta sean
- diferentes. As&iacute; puedes tener m&uacute;ltiples tarjetas del mismo
- tipo en la misma m&aacute;quina y los 64 bits ser&aacute;n &uacute;nicos
- para cada tarjeta.
-
- <p>Los grupos de 32 bits nunca pueden ser todos cero. Esto permite
- mostrar todos los bits no-cero durante la b&uacute;squeda binaria
- inicial.
-
- <p>Una vez el sistema ha identificado todos los ID's de las tarjetas
- presentes, reactivar&aacute;a cada tarjeta, una tras otra (a
- trav&eacute;s de los mismos puertos I/O), y encontrar&aacute; los
- recursos que cada tarjeta necesita, que opciones de interrupci&oacute;n
- est&aacute;n disponibles, etc. Se realiza un escaneo sobre todas y cada
- una de las tarjetas presentes para conocer esta informaci&oacute;n.
-
- <p>Esta informaci&oacute;n se combina con la informaci&oacute;n de los
- ficheros ECU del disco y con las BIOS MLB. El soporte PnP de ECU y las
- BIOS para hardware en el MLB usualmente es sint&eacute;tico, y los
- perif&eacute;ricos no hacen PnP genuino. De todas maneras, examinando
- la informaci&oacute;n de la BIOS m&aacute;s la informaci&oacute;n
- ECU, la rutina de prueba puede causar que los dispositivos que no son
- PnP puedan evitar a esos dispositivos que el c&oacute;digo de prueba
- no puede volver a posicionar.
-
- <p>As&iacute;, los dispositivos PnP son visitados una vez m&aacute;s
- y se les asigna su I/O, DMA, IRQ, direcciones del mapa de memoria. Los
- dispositivos aparecer&aacute;n en esas direcciones y permanecer&aacute;n
- en ellas hasta que se vuelva a reinicializar la m&aacute;quina.
-
- <p>Todo el proceso se ha simplificado mucho, pero espero que hayas podido
- hacerte una idea del proceso.
-
- <sect1>
- <heading>&iquest;Soporta FreeBSD arquitecturas diferentes a x86?</heading>
-
- <p>Diferentes grupos de personas han expresado su inter&eacute;s en
- trabajar en un port multi-arquitectura de FreeBSD y FreeBSD/AXP
- (ALPHA) es un ejemplo de ese esfuerzo realizado, ahora disponible en
- forma de 3.0 SNAPshot release en <url
- url="ftp://ftp.FreeBSD.org/pub/FreeBSD/alpha/"
- name="ftp://ftp.FreeBSD.org/pub/FreeBSD/alpha">. El port de ALPHA
- funciona actualmente en diferentes tipos de m&aacute;quinas ALPHA,
- entre ellas, AlphaStation, AXPpci, PC164, Miata y Multia. Este port
- todav&iacute;a no se considera una release completa y no lo ser&aacute;
- hasta que exista una colecci&oacute;n completa de herramientas de
- instalaci&oacute;n y una distribuci&oacute;n completa en cdrom para
- instalaci&oacute;, incluyendo un n&uacute;mero razonable de ports y
- packages funcionales. FreeBSD/AXP debe considerarse software de
- calidad BETA en estos momentos. Para m&aacute;s informaci&oacute;n del
- proyecto, subscr&iacute;bete a la
- <tt>&lt;FreeBSD-alpha@FreeBSD.org&gt;</tt><ref id="mailing"
- name="lista de correo">.
-
- Tambi&eacute;n se ha expresado inter&eacute;s en un port de FreeBSD para
- arquitectura SPARC. Subscr&iacute;bete a
- <tt>&lt;FreeBSD-sparc@FreeBSD.org&gt;</tt> <ref id="mailing"
- name="la lista"> si est&aacute;s interesado en participar en el proyecto.
- Para discusiones generales en nuevas arquitecturas, participa en
- <ref id="mailing" name="la lista">
- <tt>&lt;FreeBSD-platforms@FreeBSD.org&gt;</tt>.
-
- <sect1>
- <heading>Necesito un numero de dispositivo para un driver propio</heading>
-
- <p>Esto depende de si quieres hacer que el driver est&eacute;
- p&uacute;blicamente disponible. Si la respuesta es afirmativa, por favor,
- envianos una copia del c&oacute;digo fuente del driver y las
- modificaciones apropiadas del fichero <tt>files.i386</tt>, un ejemplo de
- configuraci&oacute;n y el c&oacute;digo apropiado de <htmlurl
- url="http://www.FreeBSD.org/cgi/man.cgi?MAKEDEV" name="MAKEDEV"> para
- crear cualquier fichero especial que use tu dispositivo. Puedes enviar
- todo lo necesario a <tt>&lt;FreeBSD-hackers@FreeBSD.org&gt;</tt>.
-
- <sect1>
- <heading>Alternativas a la pol&iacute;tica de directorios</heading>
-
- <p>En respuesta a esta pregunta de pol&iacute;ticas alternativas
- para los directorios, el esquema que est&aacute; actualmente en uso
- no ha cambiado desde que lo escrib&iacute; en 1983. Escrib&iacute; esa
- pol&iacute;tica para el sistema de ficheros r&aacute;pido original, y
- nunca se ha revisado. Trabaja bi&eacute;n manteniendo los grupos de
- cilindros. Como muchos de vosotros habreis notado, el rendimiento es
- muy pobre con "find". Muchos sistemas de ficheros son creados desde
- archivos que fueron creados por una primera b&uacute;squeda en
- profundidad (tambi&eacute;n conocido como ftw). Estos directorios
- terminan esparcidos a trav&eacute;s de los grupos de cilindros. Si
- conociesemos el n&uacute;mero total de directorios a crear, la
- soluci&oacute;n ser&iacute;a crear (total / fs_ncg) por grupo de
- cilindros antes de moverlos. Obviamente, tendriamos que crear
- alg&uacute;n tipo de heur&iacute;stica para adivinar este n&uacute;mero.
- Usando un n&uacute;mero peque&ntilde;o fijo (como puede ser
- 10) har&iacute;a de orden de magnitud. Para diferencial restores de
- operaciones normales (cuando el algoritmo actual es probablemente
- m&aacute;s sensible), podr&iacute;s usar el clustering hasta 10 si
- fueran todos hechos dentro de una ventana de diez segundos. De cualquier
- manera, mi conclusi&oacute;n es que este es un &aacute;rea para la
- experimentaci&oacute;n.</p>
-
- <p>Kirk McKusick, Septiembre 1998</p>
-
- <sect1>
- <heading>Obtener todo lo posible de un "kernel panic"</heading>
-
- <p>
- <em>[Esta secci&oacute;n fue extraida de un mensaje escrito por <url
- url="mailto:wpaul@FreeBSD.org" name="Bill Paul"> en la
- <ref id="mailing" name="lista"> FreeBSD-current por <url
- url="mailto:des@FreeBSD.org" name="Dag-Erling Co&iuml;dan
- Sm&oslash;rgrav">, qui&eacute;n a fijado algunos errores y
- a&ntilde;adido algunos comentarios entre corchetes]</em>
-
- <p>
- <verb>
-From: Bill Paul <wpaul@skynet.ctr.columbia.edu>
-Subject: Re: the fs fun never stops
-To: ben@rosengart.com
-Date: Sun, 20 Sep 1998 15:22:50 -0400 (EDT)
-Cc: current@FreeBSD.org
- </verb>
-
- <p>
- <em>[&lt;ben@rosengart.com&gt; envi&oacute; el siguiente panic]</em>
- <verb>
-> Fatal trap 12: page fault while in kernel mode
-> fault virtual address = 0x40
-> fault code = supervisor read, page not present
-> instruction pointer = 0x8:0xf014a7e5
- ^^^^^^^^^^
-> stack pointer = 0x10:0xf4ed6f24
-> frame pointer = 0x10:0xf4ed6f28
-> code segment = base 0x0, limit 0xfffff, type 0x1b
-> = DPL 0, pres 1, def32 1, gran 1
-> processor eflags = interrupt enabled, resume, IOPL = 0
-> current process = 80 (mount)
-> interrupt mask =
-> trap number = 12
-> panic: page fault
- </verb>
-
- <p>[Cuando] ves un mensaje como este, no es suficiente con solo
- reproducirlo y enviarlo. El valor del puntero de instrucciones que
- he marcado arriba es importante; desafortunadamente, depende de la
- configuraci&oacute;n. En otras palabras, el valor var&iacute;a
- dependiendo de la im&aacute;den de kernel exacta que se use. Si
- est&aacute;s usando el kernel GENERIC de uno de los snapshots, entonces
- es posible que alguien pueda seguir la funci&oacute;n
- problem&aacute;tica, pero si est&aacute;s usando un kernel
- personalizado, entonces solo <em>t&uacute;</em> puedes decirnos donde
- ha ocurrido el fallo.
-
- <p>Tendr&iacute;as que hacer lo siguiente:
-
- <itemize>
- <item>Anotar el valor del puntero de la instrucci&oacute;n. Ten en
- cuenta la parte <tt/0x8:/ al inicio no es significante en este caso:
- es la parte <tt/0xf0xxxxxx/ la que queremos.
- <item>Cuando el sistema rearranca, haz lo siguiente:
- <verb>
-% nm /kernel.that.caused.the.panic | grep f0xxxxxx
- </verb>
- donde <tt/f0xxxxxx/ es el valor del puntero de la instrucci&oacute;n.
- El problema es que no obtendr&aacute;s una b&uacute;squeda exacta ya
- que los s&iacute;mbolos en la tabla de s&iacute;mbolos del kernel
- son para los puntos de entrada de las funciones y la direcci&oacute;n
- del puntero de la instrucci&oacute;n estar&aacute; en alg&uacute;n
- lugar dentro de una funci&oacute;n, no al principio. Si no obtienes
- un resultado exacto, omite el &uacute;ltimo d&iacute;gito del valor
- del puntero de la instrucci&oacute;n e intentalo otra vez, por
- ejemplo:
- <verb>
-% nm /kernel.that.caused.the.panic | grep f0xxxxx
- </verb>
- Si esto no da ning&uacute;n resultado, elimina otro d&iacute;gito.
- Repite la operaci&oacute;n hasta que obtengas alg&uacute;n tipo de
- salida. El resultado ser&aacute; una lista de posibles funciones
- que causan el panic. Este no es un sistema muy exacto de
- b&uacute;squeda de errores, pero es mejor que nada.
- </itemize>
-
- <p>Veo gente que constantemente env&iacute;a mensajes de panics como
- este, pero raramente veo que alguien se tome el tiempo de buscar
- la coincidencia entre el puntero de instrucci&oacute;n y una
- funci&oacute;n en la tabla de s&iacute;mbolos del kernel.
-
- <p>La mejor manera de hacer el seguimiento de la causa de un panic es
- capturar un "crash dump", usando <tt/gdb(1)/ para hacer una traza del
- "crash dump". Por supuesto, esto depende de que <tt/gdb(1)/ funcione
- correctamente en -current, lo que no puedo garantizar (recuerdo que
- alguien ha comentado que el nuevo <tt/gdb(1)/ en formato ELF no
- manejaba bi&eacute;n los "dumps" de un crash del kernel; algui&eacute;n
- deber&iacute;a mirar esto antes de que la 3.0 salga del estado beta).
-
- <p>En cualquier caso, el m&eacute;todo que normalmente uso es este:
-
- <itemize>
- <item>Crear un fichero de configuraci&oacute;n de kernel, opcionalmente
- a&ntilde;adiendo 'options DDB' si piensas que necesitas el debugger
- del kernel por alg&uacute;n motivo. (Uso esto principalmente para
- configurar puntos de salida si sospecho que existe alguna
- condici&oacute;n que crea un loop infinito).
- <item>Usar <tt/config -g KERNELCONFIG/ para crear el directorio
- de configuraci&oacute;n del kernel.
- <item><tt>cd /sys/compile/KERNELCONFIG; make</tt>
- <item>Esperar a que el kernel termine de compilar.
- <item><tt/cp kernel kernel.debug/
- <item><tt/strip -d kernel/
- <item><tt/mv /kernel /kernel.orig/
- <item><tt>cp kernel /</tt>
- <item>reboot
- </itemize>
-
- <p><em>[Nota: ahora que los kernels de FreeBSD 3.x son ELF por defecto
- debes usar <tt/strip -g/ en lugar de <tt/strip -d/. Si por alg&uacute;n
- motivo tu kernel es a&uacute;n a.out, usa <tt/strip -aout -d/.]</em>
-
- <p>Ten en cuenta que TU <em/NO/ QUIERES ARRANCAR CON UN KERNEL QUE TIENE
- TODOS LOS SIMBOLOS DE DEBUG EN EL. Un kernel compilado con <tt/-g/
- puede llegar facilmente a los 10MB de tama&ntilde;o. No tienes que
- arrancar esta im&aacute;n masiva, solo lo necesitas para poder usar
- despu&eacute;s <tt/gdb(1)/ (<tt/gdb(1)/ quiere la tabla de
- s&iacute;mbolos). Al contrario, quieres mantener una copia de la
- im&aacute;gen completa y crear una segunda im&aacute;gen con los
- s&iacute;mbolos de debug desactivados usando <tt/strip -d/. Es esta
- segunda im&aacute;gen la que quieres arrancar.
-
- <p>Para asegurarte de capturar un "crash dump", necesitas editar el
- fichero <tt>/etc/rc.conf</tt> y apuntar <tt/dumpdev/ a tu
- partici&oacute;n de swap. Esto har&aacute; que el script <tt/rc(8)/ use
- el comando <tt/dumpon(8)/ para activar los "crash dumps". Tambi&eacute;n
- puedes ejecutar manualmente <tt/dumpon(8)/. Despu&eacute;s de un panic,
- el "crash dump" puede ser recuperado usando <tt/savecore(8)/; si
- <tt/dumpdev/ est&aacute; en <tt>/etc/rc.conf</tt>, el script
- <tt/rc(8)/ ejecutar&aacute; <tt/savecore(8)/ automaticamente y
- pondr&aacute; el "crash dump" en <tt>/var/crash</tt>.
-
- <p>NOTA: los "crash dumps" de FreeBSD suelen tener el mismo
- tama&ntilde;o que la cantidad total de memoria f&iacute;sica del
- sistema. Esto significa que si tienes 64MB de RAM, obtendr&aacute;s
- un "crash dump" de 64MB. Debido a esto, tienes que asegurarte de tener
- suficiente espacio libre en <tt>/var/crash</tt>. Alternativamente puedes
- ejecutar <tt/savecore(8)/ manualmente y hacer la recuparaci&oacute;n en
- otro directorio donde tengas m&aacute;s espacio libre. Es posible
- limitar el tama&ntilde;o del "crash dump" usando <tt/options MAXMEM=(foo)/
- para indicar la cantidad de memoria que el kernel puede ocupar. Por
- ejemplo, si tienes 128MB de RAM, puedes limitar el uso de memoria del
- kernel a 16MB para que el "crash dump" sea de 16MB y no de 128MB.
-
- <p>Una vez hayas recuperado el "crash dump", puedes obtener una traza
- del stack con <tt/gdb(1)/ de la manera siguiente:
-
- <p>
- <verb>
-% gdb -k /sys/compile/KERNELCONFIG/kernel.debug /var/crash/vmcore.0
-(gdb) where
- </verb>
-
- <p>Es posible que aparezcan muchas l&iacute;neas de informaci&oacute;n:
- es una buena idea usar el comando <tt/script(1)/ para capturarlas
- todas. Usando la im&aacute;gen del kernel con todos los s&iacute;mbolos
- de debug deber&iacute; mostrar la l&iacute;nea exacta de c&oacute;digo
- fuente del kernel donde ha ocurrido el panic. Normalmente, tienes que
- leer la traza del stack de abajo hacia arriba para poder conocer la
- secuencia exacta de eventos que han provocado el crash. Tambi&eacute;n
- puedes usar <tt/gdb(1)/ para mostrar los contenidos de las diferentes
- variables o estructuras para examinar el estado del sistema en el
- momento del crash.
-
- <p>Ahora, si eres realmente curioso y tienes un segundo ordenador,
- puedes configurar <tt/gdb(1)/ para hacer un debug remoto de manera
- que puedes usar <tt/gdb(1)/ en un sistema para revisar el kernel
- de otro sistema, de la misma manera que lo har&iacute;as en la
- m&aacute;quina local.
-
- <p><em>[Bill a&ntilde;ade: "Olvid&eacute; mencionar una cosa: si tienes
- DDB activado, puedes forzar un panic (y un crash dump) tecleando
- "panic" en el prompt del ddb. Es posible que el debugger se pare
- durante la fase del panic. Si esto ocurre, teclea "continue" y el
- crash dump finalizar&aacute;"]</em>
-
- <sect1>
- <heading>dlsym() no funciona con ejecutables ELF!</heading>
-
- <p>Las herramientas ELF no hacen por defecto que los s&iacute;mbolos
- definidos en un ejecutable sean visibles por el linker din&aacute;mico.
- Consecuentemente, <tt/dlsym()/ buscar&aacute; en datos obtenidos desde
- llamadas a <tt>dlopen(NULL, flags)</tt>, lo que provoca que no se
- encuentren esos s&iacute;mbolos.
-
- <p>Si quieres buscar, usando <tt/dlsym()/ s&iacute;mbolos presentes
- en el ejecutable principal de un proceso, necesitas linkar el
- ejecutable usando la opci&oacute;n <tt>-export-dynamic</tt> en el
- <htmlurl url="http://www.FreeBSD.org/cgi/man.cgi?ld"
- name="linkador ELF">.
-
- <sect1>
- <heading>Incrementando o reduciendo el espacio de direcciones del
- kernel</heading>
-
- <p>Por defecto, el espacio de direcciones del kernel es de 256MB en
- FreeBSD 3.x y 1GB en FreeBSD 4.x. Si gestionas un servidor de red
- muy cargado (por ejemplo, servidores FTP o HTTP con mucho
- tr&aacute;fico), es posible que notes que 256MB no es
- suficiente.
-
- <p>As&iacute; que... como incremento el espacio de direcciones?. Hay
- dos aspectos a tener en cuenta. Primero, necesitas indicarle al kernel
- que reserve una mayor parte del espacio de direcciones para &eacute;l
- mismo. Segundo, ya que el kernel se carga al inicio del espacio de
- direcciones, necesitas disminuir la direcci&oacute;n de carga.
-
- <p>El primer aspecto lo solucionamos incrementando el valor de
- <tt/NKPDE/ en <tt>src/sys/i386/include/pmap.h</tt>. Esta es una entrada
- de ejemplo para 1GB de espacio de direcciones:
-
- <verb>
-#ifndef NKPDE
-#ifdef SMP
-#define NKPDE 254 /* addressable number of page tables/pde's */
-#else
-#define NKPDE 255 /* addressable number of page tables/pde's */
-#endif /* SMP */
-#endif
- </verb>
-
- <p>Para encontrar el valor correcto de <tt/NKPDE/, divide el espacio de
- direcciones deseado (en megabytes) por cuatro, despu&eacute;s resta uno
- por UP y dos por SMP.
-
- <p>Para solucionar el segundo aspecto, necesitas calcular la
- direcci&oacute;n correcta de carga: simplemente resta el tama&ntilde;o
- del espacio de direcciones (en bytes) de 0x100100000; el resultado
- es 0xc0100000 para 1GB de espacio de direcciones. Ajusta
- <tt/LOAD_ADDRESS/ en <tt>src/sys/i386/conf/Makefile.i386</tt> a ese
- valor; a continuaci&oacute;n pon el contador al inicio de la
- secci&oacute;n listado en <tt>src/sys/i386/conf/kernel.script</tt>
- al mismo valor, como sigue:
-
- <verb>
-OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
-OUTPUT_ARCH(i386)
-ENTRY(btext)
-SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/obj/elf/home/src/tmp/usr/i386-unknown-FreeBSDelf/lib);
-SECTIONS
-{
- /* Read-only sections, merged into text segment: */
- . = 0xc0100000 + SIZEOF_HEADERS;
- .interp : { *(.interp) }
- </verb>
-
- <p>Reconfigura y compila el kernel. Probablemente tengas problemas con
- <tt/top(1)/, <tt/ps(1)/ y programas as&iacute;; haciendo un
- <tt/make world/ deber&iacute;n solucionarse esos problemas (o una
- recompilaci&oacute;n manual de <tt/libkvm/, <tt/ps/ y <tt/top/
- despu&eacute;s de copiar el <tt/pmap.h/ parcheado a
- <tt>/usr/include/vm/</tt>.
-
- <p>NOTA: el tama&ntilde;o del espacio de direcciones debe ser un
- m&uacute;ltiplo de cuatro megabytes.
-
- <p><em>[<url url="mailto:dg@FreeBSD.org" name="David Greenman">
- a&ntilde;ade: </em>Pienso que el espacio de direcciones del kernel
- necesita ser una potencia de 2, pero no estoy totalmente seguro.]
-
-</sect>