El kernel LINUX -...

18
Taller de GNU/Linux – El kernel Linux Hoja 1/18 Universidad Nacional de La Matanza Ingeniería en Informática Taller de GNU/Linux El kernel LINUX Kernel El kernel o núcleo se podría definir como el corazón del sistema operativo. Es el encargado de que el software y el hardware del ordenador puedan trabajar juntos. Las funciones mas importantes del mismo, aunque no las únicas, son: Administración de la memoria, para todos los procesos en ejecución. Administración del tiempo de procesador. Es el encargado de que las aplicaciones puedan acceder a los periféricos y dispositivos de nuestra computadora de una manera cómoda. Fig.1:Arquitectura general del Kernel Linux. (Obtenido de “Anatomy of the Linux kernel” por . M. Tim Jones) Además de administrar los recursos de hardware, el kernel, se encarga de proporcionar métodos normalizados para la utilización de los mismos, permitiendo que las aplicaciones se abstraigan de las diferencias entre distintos  tipos de hardware. En las figuras se ilustra este concepto. 

Transcript of El kernel LINUX -...

Page 1: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 1/18

Universidad Nacional de La MatanzaIngeniería en Informática

Taller de GNU/Linux 

El kernel LINUX 

Kernel

El kernel o núcleo se podría definir como el corazón del sistema operativo. Es el encargado de que el software  y   el   hardware  del   ordenador   puedan   trabajar   juntos.  Las   funciones  mas   importantes   del mismo, aunque no las únicas, son:

● Administración de la memoria, para todos los procesos en ejecución. ● Administración del tiempo de procesador. ● Es el encargado de que las aplicaciones puedan acceder a los periféricos y dispositivos de 

nuestra computadora de una manera cómoda.

Fig.1:Arquitectura general del Kernel Linux. (Obtenido de “Anatomy of the Linux kernel” por . M. Tim  Jones)

Además   de   administrar   los   recursos   de  hardware,   el   kernel,   se   encarga  de  proporcionar  métodos normalizados para la utilización de los mismos, permitiendo que las aplicaciones se abstraigan de las diferencias entre distintos  tipos de hardware. En las figuras se ilustra este concepto. 

Page 2: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 2/18

Fig.2: Diagrama conceptual y simplificado de las capas de un sistema operativo GNU/Linux. 

Fig.3: Arquitectura general del S.O. GNU/linux. (Obtenido de “Anatomy of the Linux kernel” por . M. Tim  Jones). Nacimiento de Linux

Linux hace su aparición a principios de la década de los noventa. Era el año 1991 y por aquel entonces un estudiante de informática de la Universidad de Helsinki (Finlandia), llamado Linus Torvalds empezó a programar para su tesis final un núcleo de sistema operativo. Luego se convirtió en un desarrollo de muchos programadores alrededor del mundo, que gracias a Internet pudieron continuar el proyecto. 

Este   comienzo  estuvo   inspirado   en  Minix,   un  pequeño   sistema  Unix  desarrollado  por   el  profesor Andrew Tanenbaum con fines educativos y explicado muy bien en su Libro "Sistemas Operativos". 

Page 3: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 3/18

Las primeras discusiones sobre Linux fueron en el grupo de noticias   comp.os.minix,   en   estas   discusiones   se   hablaba sobre todo del desarrollo de un pequeño sistema Unix para usuarios   de   Minix   que   querían   más.   Disconforme   con Minix,   Linus   comienza   el   desarrollo   de   un   kernel   que pudiera ejecutar en su PC.

Fig.4: Linus Torvalds. 

Licencia

El  éxito  de  Linux   se   debe   en  parte   a   que  Linus  decide liberar su código bajo licencia GPL (creada por el proyecto GNU), lo que lo hace atractivo para otros programadores deseosos de colaborar al  proyecto.  Esta  licencia   hizo muy rápido el  desarrollo del nuevo kernel y permitió su crecimiento sostenido sin derivar en productos propietarios.

Avances

Linus nunca anunció la versión 0.01 de «Linux» (1991) porque no era ni siquiera ejecutable, solamente incluía los principios del núcleo; estaba escrito en lenguaje ensamblador y asumía que el usuario tenía acceso a un sistema Minix para su compilación. Aprovechó en sus comienzos las características de conmutación de tareas con que contaba el flamante Intel 386. 

Mas tarde durante 1991, Linus anunció la primera versión «Oficial» de Linux (versión 0.02). Esta vez, Linus pudo ejecutar Bash (GNU Bourne Again Shell) y gcc (El compilador GNU de C), pero no mucho más funcionaba. 

En este estado de desarrollo ni siquiera se pensaba en términos de soporte, documentación, e incluso distribución. Después de la versión 0.03, Linus saltó en la numeración hasta la 0.10. Desde entonces, más  y  más  programadores  a   través  de  Internet  empezaron a  trabajar en el  proyecto y,  después  de sucesivas revisiones, Linus incrementó el número de versión hasta la 0.95 en Marzo de 1992. Más de un año después, en Diciembre de 1993, el núcleo del sistema estaba en la versión 0.99 y la versión 1.0 no llegó hasta marzo de 1994.

Page 4: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 4/18

Año Versión del Kernel Linux

1991 0.1

1994 1.0

1995 1.2

1996 2.0

1999 2.2

2001 2.4

2004 2.6

La versión actual (año 2006) estable del núcleo es la 2.6 y sigue avanzando día a día con la meta de perfeccionar, mejorar el sistema y mantenerlo actualizado con los últimos avances de la tecnología informática y el  nuevo hardware existente.  Los  archivos  históricos del  kernel  y sus  fechas pueden encontrarse en:  http://ftp.cdut.edu.cn/pub2/linux/kernel/history/Master.html

Fig.5: Pequeña historia de las releases más importantes. (Obtenido de “Anatomy of the Linux kernel” por  M. Tim Jones). 

Linux y el Proyecto GNU

A pesar de ser 95 % similar en características y funcionamiento a un sistema UNIX, el kernel de Linux no usa ni siquiera una línea del UNIX de la empresa AT&T, dueña actual de los derechos de UNIX, ni de ningún otro UNIX comercial. Por esto es que Linus pudo licenciarlo con la licencia GPL.

Page 5: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 5/18

Una   vez   que   el   núcleo   estuvo   «usable»,   los   programadores   comenzaron   a   buscar   aplicaciones   y utilidades para agregar y hacer el sistema más útil, ese es el momento en que entra el proyecto GNU, iniciado en 1984 por la Free Software Foundation (FSF), entidad creada por Richard M. Stallman (o simplemente RMS), con el fin de hacer un sistema operativo libre. Dado que existía ya mucho software en el proyecto GNU, los programadores comenzaron a unir el núcleo Linux con dichas herramientas GNU, conformando lo que hoy conocemos como sistema GNU/Linux (o simplemente Linux, como se suele llamar equivocadamente).  De estos aportes provenientes del proyecto GNU, los más importantes y conocidos son: El compilador GNU GCC  de lenguaje “C” con el cual se compila el mismo kernel y las aplicaciones; la librería estándar de C del proyecto GNU “glibc” y el intérprete de comando BASH entre otros.

La lista de desarrollo

Los  desarrolladores  del  kernel  Linux utilizan  para  comunicarse  una   lista  de  correo  electrónico  en vger.kernel.org . A través de ésta lista intercambian ideas, correcciones, problemas, etc. 

Desarrolladores

Son  muchos   los  desarrolladores  que  han   realizados  y   realizan  contribuciones  al  kernel  de  Linux. Algunos juegan un rol principal en el desarrollo y son líderes reconocidos dentro de la comunidad Linux. 

A la cabeza del desarrollo esta por supuesto Linus Torvalds, y es él quien, con ayuda de otros, decide que contribuciones se aportan al desarrollo del kernel oficial y cuales no. En casos de conflictos, la decisión final la tiene siempre Linus. No existe ningún impedimento para modificar y cambiar el kernel Linux, sin embargo, solo existe un kernel Linux oficial.

Page 6: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 6/18

Además de Linus, otra personalidad importante es Alan Cox, que contribuyó mucho con el soporte para multiprocesadores y  es quien  recolecta  una gran cantidad de nuevos parches para reenviárselos luego a Linus. 

Existen   por   lo   menos   290   desarrolladores   responsables (Manteiners) listados en la documentación del kernel actual. Un mantainer es  un desarrollador  que está  a   la cabeza de algunas  de   las  distintas  áreas  o   subsistemas  del  kernel  de Linux.   Además   de   las   contribuciones   propias,   estos manteiners, reciben contribuciones de otros desarrolladores. 

Fig. 6: Alan Cox 

Esta estructura de desarrollo con Linus a  la cabeza,  no está  establecida ni definida explícitamente. Simplemente se forma a medida que las personas se conocen a través de la red, se envían parches, reportes de bugs, etc. 

Pueden ser varios los motivos por los que un desarrollador decide invertir tiempo y esfuerzo en el desarrollo del kernel de Linux. Algunos pertenecen a empresas a las cuales les interesa aportar al kernel para   incorporar  o  mantener  determinada  característica.  Ejemplos  de  estos  casos  son  Suse,   IBM y RedHat por mencionar algunas.  Otros contribuyen, para obtener reputación, para demostrar nuevos conceptos, para impulsar los sistemas Linux, por creencias filosóficas  o simplemente  por placer.

Fig. 7: Diagrama conceptual de la jerarquía de desarrolladores.

Page 7: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 7/18

Versiones del Kernel Linux

Existen dos ramas oficiales del Kernel Linux: 

Versión de producción: La versión de producción, es la versión estable hasta el momento. Esta versión es el resultado final de las versiones de desarrollo o experimentales. Cuando el equipo de desarrollo del kernel experimental, decide que ha conseguido un kernel estable y con la suficiente calidad, se lanza una versión de producción o estable. Esta versión es la que se debería utilizar para un uso normal del sistema, ya que son las versiones consideradas mas estables y libres de fallos en el momento de su lanzamiento. Las modificaciones hechas a una versión estable del kernel son solo para corregir errores, fallos de seguridad, etc. Para mantener la cantidad de bugs al mínimo posible no se agregan nuevas capacidades ni se hacen mejoras sustanciales. 

Versión de desarrollo:  Esta  versión es   experimental  y  es   la  que  utilizan   los  desarrolladores  para programar, comprobar y verificar nuevas características, correcciones, agregados, etc. Estos núcleos suelen ser inestables y no se deberían usar sin estar bien consiente de las consecuencias.

Como interpretar los números de las versiones: 

Las versiones del kernel se numeran con 3 números, de la siguiente forma: XX.YY.ZZ 

XX: Numero Mayor. Indica la serie principal del kernel. Hasta el momento sólo existen la 1 y 2. Este número cambia cuando el código del kernel ha sufrido un cambio muy importante. 

YY: Numero Medio. Indica si la versión es de desarrollo o de producción. Un número impar, significa que es de desarrollo, uno par, que es de producción. 

ZZ:  Numero  Menor.   Indica  una  nueva  versión  del   kernel,   en   las   que   lo  único  que   se   ha modificado, son fallos de programación (bugs), correcciones y cambios menores.

Ejemplos:

ej1: versión del kernel 2.0.0: Kernel de la serie 2, versión de producción 0 (0 par), primera versión. ej2: versión del kernel 2.0.1: Kernel de la serie 2, versión 0, en el que se han corregido errores de programación presentes en la versión 2.0.0 (ZZ=1) ej3: versión del kernel 2.2.17: versión 17 del kernel estable 2.2. ej4: versión del kernel 2.5.3: versión 3 del kernel inestable o de desarrollo 2.5.

Page 8: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 8/18

ej5: versión del kernel 2.6.12: versión 12 del kernel estable 2.6. 

Kernel monolítico:

El kernel Linux posee muchos módulos que implementan ciertas funcionalidades. Muchos de éstos módulos pueden insertarse o removerse del kernel en forma dinámica (mientras está funcionando ) o pueden incorporarse en forma fija al momento de la compilación.   Esto permite probar módulos o quitarlos sin detener el sistema y armar kernels a medida solo con los módulos indispensables para el funcionamiento de un sistema en particular.

A pesar de esto, el kernel de Linux es monolítico y la existencia de estos módulos no debe confundirse con el concepto de microkernel.

Arquitecturas de hardware: Linux se desarrolló originalmente para correr en computadoras tipo PC compatibles con Intel 386 y 486.   Sin   embargo   gracias   a   la   portabilidad   del   lenguaje   C   y   a   la   colaboración   de   muchos desarrolladores, hoy en día también corre en procesadores ARM, DEC Aplha, SUN Sparcs, M68000, MIPS y PowerPC entre otros. 

Por esta razón GNU/Linux es el  el sistema operativo que más plataformas de hardware soporta.

El código  fuente

El código fuente de un kernel Linux como el 2.6.8 utiliza   actualmente aproximadamente 218Mbytes para su almacenamiento y 34Mbytes comprimido con tar y bz2. Esto incluye código fuente para todas las arquitecturas soportadas y la documentación.

Los   archivos     se   encuentran   organizados   en   directorios.     En   un  kernel   2.6.8   el   primer   nivel   de directorios es:

Documentation, arch, crypto, drivers, fs, include, init, ipc, kernel, lib, mm, net, scripts, security, sound, usr.

Page 9: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 9/18

Cambiando el kernel:

Toda distribución de GNU/Linux viene con por lo menos un kernel ya compilado (imágen) con la que se instala inicialmente.  Sin embargo existen varios motivos por el cual podemos desear cambiarlo:

● Para utilizar un kernel optimizado específicamente para nuestro procesador.● Para modificar algunas de las opciones.● Para utilizar un kernel que posea sólo los módulos necesarios.● Para incorporar módulos “no oficiales” a nuestro kernel.● Para utilizar una versión mas nueva del kernel.● Para aprender los pasos involucrados.

A la hora de cambiar el kernel, existen dos grandes opciones:

● Instalar un kernel ya compilado.● Instalar un kernel compilado por uno mismo.

Las   distintas   distribuciones   de   GNU/Linux   por   lo   general   ofrecen   una   variedad   de   kernels   ya compilados   con   diferentes   opciones.   Estos   kernels   siguen   siendo   de   propósito   general,   pero optimizados por ejemplo para algún modelo de procesador.  En una distribución como Debian, existen los siguientes kernels ya compilados y listos para instalar:

kernel-image-2.6-amd64-generic - Linux kernel image for version 2.6 on generic x86_64 systemskernel-image-2.6-amd64-k8 - Linux kernel image for version 2.6 on AMD64 systemskernel-image-2.6-amd64-k8-smp - Linux kernel image for version 2.6 on AMD64 SMP systemskernel-image-2.6-em64t-p4 - Linux kernel image for version 2.6 on Intel EM64T systemskernel-image-2.6-em64t-p4-smp - Linux kernel image for version 2.6 on Intel EM64T SMP systemskernel-image-2.6.8-11-amd64-generic - Linux kernel image for version 2.6.8 on generic x86_64 systemskernel-image-2.6.8-11-amd64-k8 - Linux kernel image for version 2.6.8 on AMD64 systemskernel-image-2.6.8-11-amd64-k8-smp - Linux kernel image for version 2.6.8 on AMD64 SMP systemskernel-image-2.6.8-11-em64t-p4 - Linux kernel image for version 2.6.8 on Intel EM64T systemskernel-image-2.6.8-11-em64t-p4-smp - Linux kernel image for version 2.6.8 on Intel EM64T SMP systemskernel-image-2.4.27-speakup-di - Linux kernel binary image for the Debian installerkernel-image-2.4.27-2-386-di - Linux kernel binary image for the Debian installerkernel-image-2.6.8-2-386-di - Linux kernel binary image for the Debian installerkernel-image-netbootable - net-bootable kernel for use with diskless systemskernel-image-2.4-k7-smp - Linux kernel image for version 2.4 on AMD K7 SMPkernel-image-2.4.27-2-k7-smp - Linux kernel image for version 2.4.27 on AMD K7 SMPkernel-image-2.6-k7-smp - Linux kernel image for version 2.6 on AMD K7 SMP.kernel-image-2.6.8-2-k7-smp - Linux kernel image for version 2.6.8 on AMD K7 SMP.kernel-image-2.4-k6 - Linux kernel image for version 2.4 on AMD K6/K6-II/K6-IIIkernel-image-2.4.27-2-k6 - Linux kernel image for version 2.4.27 on AMD K6/K6-II/K6-IIIkernel-image-2.6-386 - Linux kernel image for version 2.6 on 386.kernel-image-2.4-586tsc - Linux kernel image for version 2.4 on Pentium-Classickernel-image-2.4.27-2-586tsc - Linux kernel image for version 2.4.27 on Pentium-Classickernel-image-2.4-686-smp - Linux kernel image for version 2.4 on PPro/Celeron/PII/PIII/P4 SMPkernel-image-2.6-686-smp - Linux kernel image for version 2.6 on PPro/Celeron/PII/PIII/P4 SMP.kernel-image-2.4-k7 - Linux kernel image for version 2.4 on AMD K7kernel-image-2.4-386 - Linux kernel image for version 2.4 on 386kernel-image-2.4.27-2-k7 - Linux kernel image for version 2.4.27 on AMD K7kernel-image-2.6-k7 - Linux kernel image for version 2.6 on AMD K7.

Page 10: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 10/18

kernel-image-2.6.8-2-k7 - Linux kernel image for version 2.6.8 on AMD K7.kernel-image-2.6-686 - Linux kernel image for version 2.6 on PPro/Celeron/PII/PIII/P4.kernel-image-2.4-686 - Linux kernel image for version 2.4 on PPro/Celeron/PII/PIII/P4kernel-image-2.4.27-2-386 - Linux kernel image for version 2.4.27 on 386kernel-image-2.4.27-2-686 - Linux kernel image for version 2.4.27 on PPro/Celeron/PII/PIII/P4kernel-image-2.4.27-2-686-smp - Linux kernel image for version 2.4.27 on PPro/Celeron/PII/PIII/P4 SMPkernel-image-2.4.27-speakup - Linux kernel image for version 2.4.27-speakupkernel-image-2.6.8-2-386 - Linux kernel image for version 2.6.8 on 386.kernel-image-2.6.8-2-686 - Linux kernel image for version 2.6.8 on PPro/Celeron/PII/PIII/P4.kernel-image-2.6.8-2-686-smp - Linux kernel image for version 2.6.8 on PPro/Celeron/PII/PIII/P4 SMP.kernel-image-2.4.18 - Linux kernel binary image for version 2.4.18.kernel-image-2.4.20 - Linux kernel binary image for version 2.4.20.

Para   utilizar   estos   kernel   ya   compilados,   simplemente   se   deben   instalar   con   las   herramientas   de administración de paquetes propias de cada distribución.

En cambio para cambiar por un kernel  compilado por uno mismo,   los  pasos  involucrados son  los siguientes:

● Obtener los fuentes del kernel y descomprimirlos (normalmente en /usr/src/).● Aplicar parches o modificaciones al código (Opcional).● Configurar las opciones de compilación.● Compilar el kernel.● Instalarlo en nuestro sistema.● Reiniciar la computadora si se desea probar el nuevo kernel.

Se darán aquí conceptos generales para introducir al lector en los pasos necesarios en la compilación de un kernel Linux, sin pretender ser una guía paso a paso. Consultar la documentación pertinente antes de realizar el proceso de configuración, compilación e instalación del kernel.

Obteniendo el código fuente del kernel

El  kernel   se   puede  bajar   de  un  gran  número  de   servidores   en   Internet.  El   servidor   principal   es: http://www.kernel.org. De éste sitio puede bajarse el código fuente del kernel, en formato .tar.gz. (tar  y gzip) o  tar.bz2 (tar y bzip2). Para utilizar el nuevo kernel  bajado, se  lo debe descomprimir, compilar e instalar en el sistema.

Las fuentes completas del  kernel poseen varios mega bytes y cada nueva versión (número menor) involucra pequeños cambios en relación al código completo. Por este motivo la distribución de las versiones también se realiza con parches incrementales que se aplican  a la versión anterior.

Las distribuciones por lo general brindan otra forma de obtener el código fuente del kernel. Esta es 

Page 11: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 11/18

instalando el  paquete correspondiente  a   los   fuentes  del  kernel  que se  utilizaron para  construir   los diferentes kernels incluidos en la distribución.

Por ejemplo en la distribución Debian están disponibles los siguientes paquetes que contienen el código fuente del kernel:

kernel-source-2.4.27 - Linux kernel source for version 2.4.27 with Debian patcheskernel-source-2.6.8 - Linux kernel source for version 2.6.8 with Debian patcheskernel-source-2.2.25 - Linux kernel source for version 2.2.25

En todos los casos, los fuentes del kernel se encontrarán comprimidos por lo que se deberá proceder a su descompresión con el comando “tar”.  

Dentro   del   subdirectorio   “Documentation”     de   los   fuentes   se   podrá   encontrar   gran   cantidad   de información relacionada.

Aplicar parches:

Una vez que se dispone de los fuentes del kernel, pueden realizarse modificaciones al mismo aplicando parches “no oficiales” o modificando directamente los archivos fuente. 

Configuración del kernel:

Antes de compilar el kernel Linux, se pueden configurar una gran cantidad de opciones. Se puede elegir qué módulos serán incorporados en forma fija, qué módulos podrán insertarse y cuales no.Para esto, el kernel posee un archivo de configuración. Este archivo de configuración puede crearse y editarse en forma manual, pero lo más común es hacerlo a través de una interfase amigable (menú de texto, Qt, GTK). Para configurar el kernel mediante alguna  de estas  interfaces es necesario alguno de los siguientes comandos: 

● "make menuconfig"  Text based color menus, radiolists & dialogs.        ● "make xconfig"     X windows (Qt) based configuration tool.             ● "make gconfig"     X windows (Gtk) based configuration tool.            ● "make oldconfig"   Default all questions based on the contents of your existing ./.config file. 

Ejecutar “make help” para obtener la lista completa y su explicación.

Para acceder a esta configuración interactiva es necesario tener instalado por lo menos el compilador de 

Page 12: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 12/18

C, Make y la librería correspondiente a la  interface seleccionada.

Fig. 8: Configuración del kernel con la opción “make menuconfig”.

Compilación del kernel:

Una vez configuradas  las  opciones  deseadas  se procede a   la  compilación.    Los  archivos  Makefile permiten automatizar el proceso de compilación.  Para compilar el kernel es necesario tener instalados el   compilador   de   C,   Make   ,   binutils   y   otros   componentes   según   se   menciona   en “Documentation/Changes”.

El kernel se compila simplemente con el comando “make” o “make all”. Si todo es correcto se obtendrá un  nuevo kernel  compilado  junto con sus  módulos   listos  para  instalar.  Ejecutar  “make help”  para obtener la lista completa de opciones de compilación y su explicación.

Instalación del kernel:

Page 13: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 13/18

El   proceso   de   instalación   consiste   básicamente   en   colocar   el   archivo   imagen   obtenido   (kernel compilado)   en   el   lugar   apropiado   dentro   del   sistema   de   archivos.   Además   se   debe   configurar adecuadamente al administrador de arranque (grub, lilo u otro) para que en el próximo arranque se utilice el nuevo kernel. Como mecanismo de seguridad siempre se deja disponible la opción de arrancar con el kernel anterior para estar seguros que el sistema podrá utilizarse en caso que el nuevo kernel no funcione correctamente.

La instalación del kernel puede hacerse con el comando “make install” que realiza automáticamente las acciones mencionadas.

Otras variantes:

Los pasos explicados aquí son generales, sin embargo algunas distribuciones de GNU/Linux poseen mecanismos especiales que facilitan esta labor. Por ejemplo en un sistema Debian GNU/Linux existe la herramienta make­kpkg que se utiliza para compilar los fuentes del kernel y   crear paquetes Debian (.deb) del kernel,  listos para instalar en el sistema. Esto facilita la tarea de administración , instalación de nuevos kernels y su reemplazo.

El arranque:

El administrador de arranque transfiere el hilo de ejecución al kernel, quien comienza entre otras cosas con la detección del hardware del sistema. Durante este proceso de arranque el kernel nos brinda una gran cantidad de información por pantalla. Además esta información puede consultarse con el comando “dmesg” o consultando varios archivos de log en “/var/log” (syslog, kern.log, dmesg y otros ).  A modo de ejemplo se muestra el registro de arranque de un kernel Linux:

Linux version 2.6.12.4-djb (root@ugvlinux) (gcc versión 3.3.5 (Debian 1:3.3.5-13)) #1 Tue Feb 7 16:46:05 ART 2006BIOS-provided physical RAM map: BIOS-e820: 0000000000000000 - 000000000009fc00 (usable) BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved) BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved) BIOS-e820: 0000000000100000 - 000000000fffc000 (usable) BIOS-e820: 000000000fffc000 - 000000000ffff000 (ACPI data) BIOS-e820: 000000000ffff000 - 0000000010000000 (ACPI NVS) BIOS-e820: 00000000fec00000 - 00000000fec01000 (reserved) BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved) BIOS-e820: 00000000ffff0000 - 0000000100000000 (reserved)0MB HIGHMEM available.255MB LOWMEM available.On node 0 totalpages: 65532 DMA zone: 4096 pages, LIFO batch:1 Normal zone: 61436 pages, LIFO batch:31

Page 14: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 14/18

HighMem zone: 0 pages, LIFO batch:1DMI 2.3 present.Allocating PCI resources starting at 10000000 (gap: 10000000:eec00000)Built 1 zonelistsKernel command line: root=/dev/hda2 ro acpi=off Found and enabled local APIC!mapped APIC to ffffd000 (fee00000)Initializing CPU#0PID hash table entries: 1024 (order: 10, 16384 bytes)Detected 1529.732 MHz processor.Using tsc for high-res timesourceConsole: colour VGA+ 80x25Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)Memory: 252412k/262128k available (1559k kernel code, 9092k reserved, 713k data, 168k init, 0k highmem)Checking if this processor honours the WP bit even in supervisor mode... Ok.Calibrating delay loop... 3022.84 BogoMIPS (lpj=1511424)Security Framework v1.0.0 initializedMount-cache hash table entries: 512CPU: After generic identify, caps: 0383fbff c1c3fbff 00000000 00000000 00000000 00000000 00000000CPU: After vendor identify, caps: 0383fbff c1c3fbff 00000000 00000000 00000000 00000000 00000000CPU: L1 I Cache: 64K (64 bytes/line), D cache 64K (64 bytes/line)CPU: L2 Cache: 256K (64 bytes/line)CPU: After all inits, caps: 0383fbff c1c3fbff 00000000 00000020 00000000 00000000 00000000Intel machine check architecture supported.Intel machine check reporting enabled on CPU#0.CPU: AMD Athlon(TM) XP 1800+ stepping 00Enabling fast FPU save and restore... done.Enabling unmasked SIMD FPU exception support... done.Checking 'hlt' instruction... OK.checking if image is initramfs...it isn't (bad gzip magic numbers); looks like an initrdFreeing initrd memory: 3968k freedNET: Registered protocol family 16PCI: PCI BIOS revision 2.10 entry at 0xf19a0, last bus=1PCI: Using configuration type 1mtrr: v2.0 (20020519)ACPI: Subsystem revision 20050309ACPI: Interpreter disabled.Linux Plug and Play Support v0.97 (c) Adam BelayPCI: Probing PCI hardwarePCI: Probing PCI hardware (bus 00)Enabling SiS 96x SMBus.Boot video device is 0000:01:00.0PCI: Using IRQ router SIS [1039/0018] at 0000:00:02.0PCI: IRQ 0 for device 0000:00:02.1 doesn't match PIRQ mask - try pci=usepirqmaskPCI: Found IRQ 10 for device 0000:00:02.1PCI: Sharing IRQ 10 with 0000:00:05.0VFS: Disk quotas dquot_6.5.1Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)Initializing Cryptographic APIisapnp: Scanning for PnP cards...isapnp: No Plug & Play device foundPNP: No PS/2 controller found. Probing ports directly.serio: i8042 AUX port at 0x60,0x64 irq 12serio: i8042 KBD port at 0x60,0x64 irq 1Serial: 8250/16550 driver $Revision: 1.90 $ 48 ports, IRQ sharing enabledttyS0 at I/O 0x3f8 (irq = 4) is a 16550AttyS1 at I/O 0x2f8 (irq = 3) is a 16550Aio scheduler noop registeredio scheduler anticipatory registeredio scheduler deadline registeredio scheduler cfq registeredRAMDISK driver initialized: 16 RAM disks of 8192K size 1024 blocksizeNET: Registered protocol family 2IP: routing cache hash table of 2048 buckets, 16KbytesTCP established hash table entries: 16384 (order: 5, 131072 bytes)TCP bind hash table entries: 16384 (order: 4, 65536 bytes)

Page 15: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 15/18

TCP: Hash tables configured (established 16384 bind 16384)RAMDISK: cramfs filesystem found at block 0RAMDISK: Loading 3968KiB [1 disk] into ram disk...|#/#-#\#done.VFS: Mounted root (cramfs filesystem) readonly.input: AT Translated Set 2 keyboard on isa0060/serio0Freeing unused kernel memory: 168k freedNET: Registered protocol family 1SCSI subsystem initializedlibata version 1.11 loaded.Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xxSIS5513: IDE controller at PCI slot 0000:00:02.5SIS5513: chipset revision 208SIS5513: not 100% native mode: will probe irqs laterSIS5513: SiS745 ATA 100 (2nd gen) controller ide0: BM-DMA at 0xd800-0xd807, BIOS settings: hda:DMA, hdb:pio ide1: BM-DMA at 0xd808-0xd80f, BIOS settings: hdc:DMA, hdd:DMAProbing IDE interface ide0...hda: ST320014A, ATA DISK driveide0 at 0x1f0-0x1f7,0x3f6 on irq 14Probing IDE interface ide1...hdc: HL-DT-ST RW/DVD GCC-4320B, ATAPI CD/DVD-ROM drivehdd: QUANTUM BIGFOOT2100A, ATA DISK driveide1 at 0x170-0x177,0x376 on irq 15Probing IDE interface ide2...Probing IDE interface ide3...Probing IDE interface ide4...Probing IDE interface ide5...hda: max request size: 128KiBhda: 39102336 sectors (20020 MB) w/2048KiB Cache, CHS=38792/16/63, UDMA(100)hda: cache flushes supported hda: hda1 hda2 hda3hdd: max request size: 128KiBhdd: 4127760 sectors (2113 MB) w/87KiB Cache, CHS=4095/16/63, DMAhdd: cache flushes not supported hdd: hdd1 hdd2EXT3-fs: mounted filesystem with ordered data mode.kjournald starting. Commit interval 5 secondsAdding 248996k swap on /dev/hda3. Priority:-1 extents:1EXT3 FS on hda2, internal journalGeneric RTC Driver v1.07apm: BIOS version 1.2 Flags 0x03 (Driver version 1.16ac)device-mapper: 4.4.0-ioctl (2005-01-12) initialised: [email protected] agpgart interface v0.101 (c) Dave Jonesagpgart: Detected SiS 745 chipsetagpgart: AGP aperture is 64M @ 0xe8000000usbcore: registered new driver usbfsusbcore: registered new driver hubohci_hcd: 2004 Nov 08 USB 1.1 'Open' Host Controller (OHCI) Driver (PCI)PCI: Found IRQ 9 for device 0000:00:02.2ohci_hcd 0000:00:02.2: Silicon Integrated Systems [SiS] USB 1.0 Controllerohci_hcd 0000:00:02.2: new USB bus registered, assigned bus number 1ohci_hcd 0000:00:02.2: irq 9, io mem 0xe6800000hub 1-0:1.0: USB hub foundhub 1-0:1.0: 3 ports detectedPCI: Found IRQ 9 for device 0000:00:02.3ohci_hcd 0000:00:02.3: Silicon Integrated Systems [SiS] USB 1.0 Controller (#2)ohci_hcd 0000:00:02.3: new USB bus registered, assigned bus number 2ohci_hcd 0000:00:02.3: irq 9, io mem 0xe6000000hub 2-0:1.0: USB hub foundhub 2-0:1.0: 3 ports detectedusb 1-2: new full speed USB device using ohci_hcd and address 2Initializing USB Mass Storage driver...scsi0 : SCSI emulation for USB Mass Storage devicesusbcore: registered new driver usb-storageUSB Mass Storage support registered.PCI: Found IRQ 10 for device 0000:00:05.0PCI: Sharing IRQ 10 with 0000:00:02.18139too Fast Ethernet driver 0.9.27

Page 16: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 16/18

PCI: Found IRQ 5 for device 0000:00:0a.0eth0: RealTek RTL8139 at 0xa800, 00:e0:7d:e3:74:1f, IRQ 5eth0: Identified 8139 chip type 'RTL-8100B/8139D'hdc: ATAPI 40X DVD-ROM CD-R/RW drive, 2048kB Cache, UDMA(33)Uniform CD-ROM driver Revision: 3.20eth0: link downinput: GenPS/2 Genius Wheel Mouse on isa0060/serio1mice: PS/2 mouse device common for all miceAttached scsi generic sg0 at scsi0, channel 0, id 0, lun 0, type 0NET: Registered protocol family 10Disabled Privacy Extensions on device c030ae60(lo)IPv6 over IPv4 tunneling drivereth0: no IPv6 routers present

Los módulos

Los módulos  son pequeñas  porciones de código compilado que pueden  insertarse y  removerse del kernel durante su ejecución. Estas porciones de código implementan una funcionalidad específica del kernel. Al momento de configurar el kernel podemos elegir  algunas características generales acerca de los módulos: 

● Habilitar la posibilidad de cargar módulos durante la ejecución del kernel:  Nos permitirá insertar módulos dentro del kernel en ejecución actual. 

● Posibilidad de descargar módulos. Nos permitirá remover módulos.● Carga automática  de módulos.  El  kernel  podrá  cargar automáticamente  los  módulos  que 

considere necesarios a medida que los necesite.

Luego, para cada una de estas funcionalidades implementadas como módulos podremos optar entre las siguientes opciones:

● La funcionalidad no estará   incluida ni podrá  cargarse posteriormente como módulo. Esto ahorra recursos al no incluir características innecesarias y mejora la seguridad del sistema ya que es imposible cargar esa funcionalidad en el kernel.

● La funcionalidad estará incluida en el kernel sin necesidad de cargarlo explícitamente como módulo. No podrá removerse la funcionalidad. 

● La funcionalidad estará disponible como módulo. En caso de ser necesario se podrá insertar el módulo en cuestión. También podrá removerse.

Page 17: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 17/18

Fig. 9: Configuración del soporte para carga de módulos.

Las herramientas mas comunes para manejar módulos del kernel son:

● modprobe: Inserta y remueve módulos del kernel.● lsmod: Lista los módulos cargados.● modinfo: Brinda información sobre cada módulo.● insmod :  Inserta módulos● rmmod: Remueve módulos.

Por ejemplo para obtener información sobre el módulo “msdos”: # modinfo msdosfilename: /lib/modules/2.6.12.4-djb/kernel/fs/msdos/msdos.kolicense: GPLauthor: Werner Almesbergerdescription: MS-DOS filesystem supportvermagic: 2.6.12.4-djb preempt K7 gcc-3.3depends: fat

Para insertar el módulo: # modprobe msdos

Y para remover el modulo: # modprobe -r msdos

Page 18: El kernel LINUX - tallergnulinux.sourceforge.nettallergnulinux.sourceforge.net/apuntes/teorico/El_kernel_LINUX.pdf · Además de administrar los recursos de hardware, el kernel, se

Taller de GNU/Linux – El kernel Linux Hoja 18/18

Logo

El logo o mascota asociada al kernel Linux y en general al sistema operativo GNU/Linux es el pingüino llamado   Tux     creado   por   Larry   Ewing.   Los   logos   pueden   obtenerse   de   la   página http://www.isc.tamu.edu/~lewing/linux/

Se   puede   encontrar   la   historia   del   porqué   de   esta   mascota   en   la   siguiente   dirección: http://www.sjbaker.org/tux

Fig. 10: Tux creado por Larry Ewing.

Lecturas complementarias

Un artículo  muy interesante  sobre el kernel Linux: “Anatomy of the Linux kernel”, History and architectural decomposition. M. Tim Jones.http://www.ibm.com/developerworks/linux/library/l­linux­kernel/

Para conocer a fondo y agregar dispositivos al kernel: “Linux Device Drivers”. Por Jonathan Corbet, Alessandro Rubini y Greg Kroah­Hartman.http://lwn.net/Kernel/LDD3/ o http://www.xml.com/ldd/chapter/book/

Copyright © 2007 Diego J. Brengi ­ [email protected] Está  permitida la copia textual y distribución de este artículo en su totalidad por cualquier medio,  siempre y cuando esta nota se preserve. 

Archivo original en formato OpenOffice. Se agradecerán los aportes, correcciones y comentarios. Creado: 2002  por DJB (Primer borrador)  Modificado:  Septiembre  2007 por DJB.