<bluehttp://www.moses.uklinux.net/patches/lki.sgml>
Esta guía es ahora parte del Proyecto de Documentación de Linux y también
puede ser descargada en varios formatos desde:
<bluehttp://www.linuxdoc.org/guides.html>
o puede ser leída en linea (la última versión en Inglés) en:
<bluehttp://www.moses.uklinux.net/patches/lki.html>
Esta documentación es software libre; puedes redistribuirla y/o modifi-
carla bajo los términos de la GNU General Public License tal como ha
sido publicada por la Free Software Foundation en la versión 2 de la Li-
cencia, o (a tu elección) por cualquier versión posterior. El autor esta
trabajando como ingeniero decano del núcleo Linux en VERITAS Software
Ltd y escribió este libro con el propósito de dar soporte al pequeño en-
trenamiento de cursos/charlas que dió sobre este tema,
internamente en
VERITAS. Gracias a:
Juan J. Quintela (
[email protected]), Francis
Galiegue (
[email protected]), Hakjun Mun (
[email protected]),
Matt Kraai
Nicholas Dronen
(
[email protected]), Samuel S Chessman (
[email protected]), Nadeem
Hasan (
[email protected]) por varias correcciones y sugerencias.
El
capítulo del Caché de Páginas de Linux fue escrito por Christoph Hellwig
(
[email protected]). El capítulo sobre los mecanismos IPC fue escrito por
Russell Weight (
[email protected]) y Mingming Cao (
[email protected])
Dentro del núcleo Linux 2.4
(
[email protected]),
Tigran Aivazian
[email protected]
23 Agosto 2001 (4 Elul 5761)
Contents
1 Arrancando
1.1 Construyendo la Imagen del Núcleo Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Arrancando: Vista General
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 Arrancando: BIOS POST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.4 Arrancando: sector de arranque y configuración . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5 Usando LILO como cargador de arranque . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.6
Inicialización de Alto Nivel
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.7 Arranque SMP en x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.8 Liberando datos y código de inicialización . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.9 Procesando la linea de comandos del núcleo . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 Procesos y Manejo de Interrupciones
2.1 Estructura de Tareas y Tabla de Procesos . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Creación y terminación de tareas e hilos del núcleo . . . . . . . . . . . . . . . . . . . . . . . .
2.3 Planificador Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4
Implementación de la lista enlazada (de) Linux . . . . . . . . . . . . . . . . . . . . . . . . . .
2.5 Colas de espera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.6 Cronómetros del núcleo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.7 Bottom Halves
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
2
4
4
4
7
8
10
10
11
13
13
16
19
21
23
25
25
1. Arrancando
3.4 Administración de estructuras de ficheros
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.5 Administración de Puntos de Montaje y Superbloque . . . . . . . . . . . . . . . . . . . . . . .
3.6 Ejemplo de un Sistema de Ficheros Virtual: pipefs . . . . . . . . . . . . . . . . . . . . . . . .
3.7 Ejemplo de Sistema de Ficheros de Disco: BFS . . . . . . . . . . . . . . . . . . . . . . . . . .
3.8 Dominios de Ejecución y Formatos Binarios . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4 Memoria Intermedia de Páginas Linux
5 Mecanismos IPC
5.1 Semáforos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.1.1
Interfaces de la Llamada al sistema de los Semáforos . . . . . . . . . . . . . . . . . . .
5.1.2 Estructuras Específicas de Soporte de Semáforos . . . . . . . . . . . . . . . . . . . . .
5.1.3 Funciones de Soporte de Semáforos . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Colas de Mensajes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2.1
Interfaces de las llamadas al sistema de Colas . . . . . . . . . . . . . . . . . . . . . . .
5.2.2 Estructuras Específicas de Mensajes . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2.3 Funciones de Soporte de Mensajes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3 Memoria Compartida
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.1
Interfaces de las llamadas al sistema de la Memoria Compartida . . . . . . . . . . . .
5.3.2 Estructuras de Soporte de Memoria Compartida . . . . . . . . . . . . . . . . . . . . .
5.3.3 Funciones de Soporte De Memoria Compartida . . . . . . . . . . . . . . . . . . . . . .
5.4 Primitivas IPC de Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.4.1 Primitivas IPC de Linux Genéricas usadas con Semáforos, Mensajes y Memoria Com-
partida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.4.2 Estructuras Genéricas IPC usadas con Semáforos, Mensajes, y Memoria Compartida .
6 Sobre la traducción
1 Arrancando
2
42
45
49
51
53
54
56
57
57
59
60
65
65
68
70
72
72
74
75
77
77
78
79
1.1 Construyendo la Imagen del Núcleo Linux
Esta sección explica los pasos dados durante la compilación del núcleo Linux y la salida producida en cada
etapa. El proceso de construcción depende de la arquitectura, por lo tanto me gustaría enfatizar que sólo
consideraremos la construcción de un núcleo Linux/x86.
Cuando el usuario escribe ’make zImage’ o ’make bzImage’ la imagen inicializable del núcleo resultante es
almacenado como arch/i386/boot/zImage o arch/i386/boot/bzImage respectivamente. Aquí está como
es construida la imagen:
1. Los archivos fuente en C y ensamblador son compilados en formato de objetos reasignables ELF (.o)
y algunos de ellos son agrupados lógicamente en archivos (.a) usando ar(1).
1. Arrancando
3
2. Usando ld(1), los anteriores .o y .a son enlazados en vmlinux, el cual es un fichero ejecutable ELF
32-bits LSB 80386 estáticamente enlazado al que no se le han eliminado los símbolos de depuración.
3. System.map es producido por nm vmlinux, donde los símbolos irrelevantes o que no interesan son
desechados.
4. Se entra en el directorio arch/i386/boot.
5. El código de ensamblador del sector de arranque bootsect.S es preprocesado con o sin -
D BIG KERNEL , dependiendo de cuando el objetivo es bzImage o zImage, en bbootsect.s
o bootsect.s respectivamente.
6. bbootsect.s es ensamblado y entonces convertido en la forma ’raw binary’ llamada bbootsect (o
bootsect.s ensamblado y convertido a raw en bootsect para zImage).
7. El código de configuración setup.S (setup.S incluye video.S) es preprocesado en bsetup.s para
bzImage o setup.s para zImage. De la misma forma que el código del sector de arranque, la diferencia
radica en que -D BIG KERNEL está presente para bzImage. El resultado es entonces convertido
en la forma ’raw binary’ llamada bsetup.
8. Se entra en el directorio arch/i386/boot/compressed y se convierte /usr/src/linux/vmlinux a
$tmppiggy (nombre temporal) en el formato binario raw, borrando las secciones ELF .note y .comment.
9. gzip -9 < $tmppiggy > $tmppiggy.gz
10. Se enlaza $tmppiggy.gz en ELF reasignable (ld -r) piggy.o.
11. Compila
las
rutinas
misc.c
arch/i386/boot/compressed) en los objetos ELF head.o y misc.o.
head.S
compresión
de
y
(todavía
en
el
directorio
12. Se enlazan todas ellas: head.o, misc.o y piggy.o en bvmlinux (o vmlinux para zImage, ¡no confundas
esto con /usr/src/linux/vmlinux!). Destacar la diferencia entre -Ttext 0x1000 usado para vmlinux
y -Ttext 0x100000 para bvmlinux, esto es, el cargador de compresión para bzImage es cargado más
arriba.
13. Se convierte bvmlinux a ’raw binary’ bvmlinux.out borrando las secciones ELF .note y .comment.
14. Se vuelve atrás al directorio arch/i386/boot y, usando el programa tools/build, se concatenan todos
ellos: bbootsect, bsetup y compressed/bvmlinux.out en bzImage (borra la ’b’ extra anterior para
zImage). Esto escribe variables importantes como setup sects y root dev al final del sector de
arranque.
El tamaño del sector de arranque es siempre de 512 bytes. El tamaño de la configuración debe ser mayor
que 4 sectores, pero está limitado superiormente sobre los 12k - la regla es:
0x4000 bytes >= 512 + sectores configuración * 512 + espacio para la pila mientras está funcionando el
sector de arranque/configuración
Veremos más tarde de dónde viene esta limitación.
El límite superior en el tamaño de bzImage producido en este paso está sobre los 2.5M para arrancarcon
LILO y 0xFFFF párrafos ((0xFFFF0 = 1048560 bytes) para arrancar imágenes directamentee, por ejemplo
desde un diskette o CD-ROM (con el modo de emulación El-Torito).
Destacar que mientras que tools/build valida el tamaño del sector de arranque, la imagen del núcleo
y el límite inferior del tamaño de la configuración, no chequea el límite *superior* de dicho tamaño de
configuración. Entonces, es fácil construir un núcleo defectuoso justamente sumándole algún gran ”.espacio”
al final de setup.S.
1. Arrancando
4
1.2 Arrancando: Vista General
Los detalles del proceso de arranque son específicos de cada arquitectura, por lo tanto centraremos nuestra
atención en la arquitectura IBM PC/IA32. Debido al diseño antiguo y a la compatibilidad hacia atrás, el
firmware del PC arranca el sistema operativo a la vieja usanza. Este proceso puede ser separado en las
siguientes seis etapas l
Comentarios de: Dentro núcleo Linux 2.4 (0)
No hay comentarios