Escrito por Sumiciu el martes, 12 xunu de 2007
Esta es una traducción de este artículo sobre un vistazo muy por encima al núcleo de GNU/Linux aparecido entre los artículos de la base de conocimiento de IBM y que considero bastante importante para empezar a entender algunos detalles del S.O.
El kernel de Linux es el núcleo de un sistema operativo extenso y complejo, y aunque su tamaño es enorme, esta correctamente organizado en subsistemas y capas. En este artículo, se explorará la estructura general del kernel de Linux y se conseguirá conocer sus subsistemas e interfaces del núcleo más importantes.[...]
Dado que la meta de este artículo es introducirse en el kernel de Linux y explorar su arquitectura y componentes principales, empezaremos con una vuelta rápida por la historia del kernel, después nos centraremos en la arquitectura del kernel de Linux a vista de pájaro y, finalmente, examinaremos sus subsistemas más importantes. El kernel de Linux tiene más de seis millones de líneas de código, por lo tanto, esta introducción no es exhaustiva. Los recursos ayudarán a profundizar.
Un pequeño viaje a través de la historia de Linux
Aunque podría decirse que Linux es el sistema operativo de código abierto más popular, su historia es realmente bastante corta considerando la línea temporal de los sistemas operativos. En los primero momentos de la computación, los programadores desarrollaban sobre el hardware directamente en el lenguaje que él entendía. La falta de un sistema operativo significaba que únicamente una aplicación (y por lo tanto un único usuario) podía usar una dispositivo enorme y caro de cada vez. Los primeros sistemas operativos fueron desarrollados en los años 50 para proveer de una experiencia de desarrollo más simple. Algunos ejemplos son General Motors Operating System (GMOS) desarrollado para el IBM 701 y el FORTRAN Monitor System (FMS) desarrollado por la aviación americana para el IBM 709.
En los años 60, el Instituto Tecnológico de Massachussets (MIT) y un grupo de compañías desarrollaron un sistema operativo experimental llamado Multics (Multiplexed Information and Computing Service) para la GE-654. Uno de los desarrolladores de este sistema, AT&T, abandonó Multics y desarrolló su propio sistema operativo en 1970 llamado Unics. Junto con este sistema operativo vino el lenguaje C, para el que fue desarrollado y, posteriormente, reescrito con el fin de hacer el desarrollo del sistema operativo portable.
Veinte años más tarde, Andrew Tanenbaum creo una versión de UNIX con un microkernel llamada MINIX que corría en pequeños PC. Este sistema operativo de código abierto inspiró el desarrollo inicial de Linux por parte de Linus Torvals a principios de los 90 (ver figura 1).
Linux evolucionó rápidamente para transformarse de ser un proyecto de una sola persona a un proyecto de desarrollo de extensión mundial que involucraba a miles de programadores. Una de las más importantes decisiones para Linux fue la adopción de la Licencia Pública General de la GNU (GPL). Bajo la GPL, el kernel de Linux fue protegido contra el la explotación comercial, y además beneficiado por el espacio de desarrollo del proyecto GNU. Esto permitió que aplicaciones útiles como GCC y varias shell fueran soportadas.
Ahora, visión a grandes rasgos sobre la arquitectura del sistema operativo GNU/Linux. Puedes pensar en un sistema operativo desde dos niveles, señalados en la figura 2.
En la parte más alta está el espacio de usuario o aplicación. Aquí es donde las aplicaciones de usuario son ejecutadas. Por debajo del espacio de usuario esta el espacio del núcleo donde aparece el kernel de Linux.
También está la librería de C de GNU (glibc) que provee la interfaz de llamadas al sistema que conecta con el kernel y provee del mecanismo de transición entre las aplicaciones usuario y el núcleo. Esto es importante, ya que el kernel y las aplicaciones de usuario ocupan diferentes áreas de direcciones protegidas. Y mientras cada proceso de usuario ocupa su propio espacio de direcciones virtual, el kernel ocupa un espacio de direcciones único.
Podemos ir más allá dentro del kernel dividiéndolo en tres niveles a grandes rasgos. En lo más alto esta la interfaz de llamadas al sistema, que implementa las funciones básicas tales como read o write. Por debajo de ella, se encuentra el código del kernel, o mejor dicho, el código del kernel independiente de la arquitectura, este código es común a todas las arquitecturas de procesadores soportadas por Linux. Más abajo aún, está el código dependiente de la arquitectura, que forma lo que es más comúnmente llamado BSP (Board Support Package). Este código es específico para cada procesador y plataforma.
Cuando discutimos acerca de un sistema extenso y complejo, podemos enfocarlo desde varias perspectivas. Una forma acertada en la descomposición de la arquitectura es el proveer de un modo de entender mejor el código, y esto es lo que haremos aquí.
El kernel de Linux, implementa un número de atributos importantes de arquitectura. Tanto al más alto nivel, como al más bajo nivel, el kernel es dividido en un distintos subsistemas. Linux puede ser considerado también como un kernel monolítico ya que engloba dentro suyo todos los servicios básicos. Esto lo diferencia de una arquitectura de microkernel donde el kernel provee de servicios básicos tanto de comunicación, de entrada/salida, manejo de procesos y memoria y los servicios más específicos están conectados a la capa del microkernel. Cada uno tiene sus ventajas y desventajas.
A lo largo del tiempo el kernel de Linux ha conseguido eficiencia en términos de uso de memoria y CPU, así como ser extremadamente estable. Pero el aspecto más interesante de Linux, dado su tamaño y complejidad, es su portabilidad. Linux puede ser compilado para funcionar en un enorme número de procesadores y plataformas con diferentes restricciones de arquitectura y necesidades. Un ejemplo es la capacidad de Linux para correr en un procesador con MMU como en uno que no la tiene. El port uClient del kernel de Linux provee soporte para arquitecturas sin MMU.
Ahora, echaremos un vistazo a los principales componentes del kernel de Linux usando el desglose mostrado en la figura 3 como guía.
La SCI es una fina capa que provee de la capacidad de realizar llamadas a funciones desde el espacio de usuario al kernel. Tal y como se ha discutido previamente, esta interfaz puede ser dependiente de la arquitectura, incluso dentro de la misma familia de procesadores. La SCI es realmente un interesante servicio multiplexador y demultiplexador de llamadas al sistema. Puede encontrarse su implementación en ./linux/kernel, así como las porciones dependientes de la arquitectura en ./linux/arch.
La gestión de procesos está centrada en la ejecución de los procesos. En el kernel, son llamados hilos y representan una virtualización individual del procesador (código del hilo, registros de la CPU, datos y pila). En el espacio de usuario, se suele usar el término proceso, aunque en la implementación de Linux no separa los dos conceptos (hilos y procesos). El núcleo provee una API a través de la SCI con la que se pueden crear nuevos procesos (fork, exec, o funciones POSIX), parar un proceso (kill, exit) y comunicarse y sincronizarse entre ellos (signal, o mecanismos POSIX)
La gestión de procesos es necesaria para compartir la CPU entre los hilos activos. El kernel implementa un novedoso algoritmo de planificación que opera en tiempo constante, sin tener el cuenta el numero de procesos que compiten por la CPU. Este es el planificador O(1), denotando que le lleva misma cantidad de tiempo la planificación de un sólo hilo que la de varios. El planificador O(1) también soporta multiproceso (SMP). Se pueden encontrar las fuentes de la gestión de procesos en ./linux/kernel (y los dependientes de la arquitectura en ./linux/arch).
Gestión de memoria
Otro importante recurso que es controlado por el kernel es la memoria. Por eficiencia, dada la manera en la que el hardware maneja la memoria virtual, la memoria es gestionada en lo que se llaman páginas (4kb para la mayoría de las arquitecturas). Linux incluye las definiciones para manejar la memoria disponible, así como los mecanismos hardware para el mapeo físico y virtual.
Pero la gestión de memoria es mucho más que manejar buffers de 4KB. Linux contiene abstracciones de buffers más allá de los de 4KB, como el localizador de slabs. Este esquema de manejo de memoria usa buffers de 4kb como base, pero además reserva estructuras dentro de ellos, llevando la cuenta de que páginas están completas, parcialmente usadas o vacías. Esto permite que el esquema de memoria crezca y disminuya dinámicamente según las necesidades incluso del sistema más grande.
Con varios usuarios haciendo uso de la memoria, existen ocasiones en las que la memoria disponible puede agotarse. Por esta razón, las páginas pueden ser movidas de memoria y guardadas en el disco. Este proceso se llama intercambio (swapping) ya que las páginas son intercambiadas entre la memoria y el disco duro. Se pueden encontrar más recursos sobre el manejo de la memoria en ./linux/mm
El sistema de archivos virtual (VFS- virtual file system) es un aspecto interesante del kernel de Linux ya que provee una interfaz común de abstracción para los sistemas de archivos. El VFS proporciona una capa de intercambio entre la SCI y los sistemas de archivos soportados por el kernel (ver figura 4)
En la parte más alta del VFS se encuentra un API común que contiene las abstracciones de funciones tales como open, close, read y write. En la parte más baja, están las abstracciones del sistema que definen cómo debe ser implementada la capa superior. Estas son añadidos para el sistema de ficheros dado (existen más de 50). Se pueden encontrar las fuentes del sistema de archivos en ./linux/fs
Bajo la capa del sistema de archivos está la caché del buffer, que proporciona un conjunto sencillo de funciones a la capa del sistema de archivos (independientemente del sistema de ficheros en particular). Esta capa de caché optimiza el acceso a los dispositivos físicos manteniendo brevemente información (o arriesgándose a leer de forma anticipada para que los datos estén disponibles para cuando hagan falta). Por debajo del caché del buffer están los drivers de los dispositivos, que implementan la interfaz de cada dispositivo específico.
La pila de red, por diseño, sigue una arquitectura por capas modelada tras los protocolos en sí. Recordando que el Protocolo de Internet (IP) es el protocolo central de las capas de red que se sitúa bajo el protocolo de transporte (TCP). Sobre el protocolo TCP está la capa de sockets, que es llamada a través de la SCI.
La capa de sockets es la API estándar para el subsistema de trabajo en red y proporciona una interfaz de usuario para varios protocolos de red. Desde acceso a raw frames hasta las unidades de datos del protocolo IP (los PDUs), el protocolo TCP y el Protocolo de Datagrama de Usuario (UDP), la capa de sockets provee de una manera estandarizada de manejar las conexiones y mover datos entre puntos de destino. Las fuentes de red están disponibles en el kernel en ./linux/net
La inmensa mayoría del código del kernel de Linux está en los drivers de los dispositivos que hacen a determinado elemento hardware usable. El árbol de código de Linux proporciona un subdirectorio para los drivers que está, a su vez, divido entre los varios dispositivos que soporta, tales como Bluetooth, I2C, de serie... Se pueden encontrar en el código en ./linux/drivers.
Código dependiente de la arquitectura
Aunque Linux es independiente de la arquitectura en la que corra, hay varios elementos que deben tenerla en cuenta para operaciones habituales y eficiencia. El subdirectorio ./linux/arch define la porción del kernel dependiente de la arquitectura contenida en un número de subdirectorios que son específicos a ella (en conjunto forman la BSP). Para un típico ordenador de sobremesa, se usa el directorio i386. Cada directorio de cada arquitectura contiene otros subdirectorios que se centran en un aspecto concreto del kernel, como el inicio, gestión de memoria...Puedes encontrar el código dependiente de la plataforma en ./linux/arch
Por si la eficiencia y la portabilidad del kernel no eran suficientes, también proporciona otras características que no pueden ser clasificadas en el desglose anterior.
Linux, por ser un sistema operativo de producción y de código libre, es un buen banco de pruebas para nuevos protocolos y avances de esos protocolos. Linux soporta un gran número de protocolos de red, incluyendo el típico TCP/IP, así como la extensión para red de alta velocidad (mayor que Ethernet de 1 o 10 Gigabits). Linux también soportas protocolos como el SCTP, que proporciona características avanzadas sobre TCP (como reemplazo del protocolo del nivel de transporte).
Linux es también un kernel dinámico, soporta el añadido y eliminación de componentes software al vuelo. Esto se conoce como módulos del kernel instalables dinámicamente, y pueden ser insertados al inicio, cuando sean necesarios si un dispositivo concreto es encontrado requiriendo el módulo) o en cualquier otro momento a petición del usuario.
Un reciente avance de Linux es su uso como un sistema operativo para otros sistemas operativos (llamado hipervisor). Recientemente, se realizó una modificación en el kernel que fue llamada la Kernel based Virtual Machine (KVM). Esta modificación permitió una nueva interfaz de usuario que permite a otros sistemas operativos correr sobre un KVM-enabled kernel. Además de correr otra instancia de Linux, Windows puede ser virtualizado. La única restricción es que el procesador usado debe soportar las nueva instrucciones de virtualización.
Este artículo simplemente roza la superficie de la arquitectura del kernel de Linux y sus características y capacidades. Puedes buscar en el directorio de documentación que se proporciona con cada distribución de Linux para información detallada sobre los contenidos del kernel. No te olvides de mirar la sección de recursos al final de este articulo para información más detallada sobre algunos de los temas discutidos aquí.
Anatomía del núcleo de Linux
El kernel de Linux es el núcleo de un sistema operativo extenso y complejo, y aunque su tamaño es enorme, esta correctamente organizado en subsistemas y capas. En este artículo, se explorará la estructura general del kernel de Linux y se conseguirá conocer sus subsistemas e interfaces del núcleo más importantes.[...]
Dado que la meta de este artículo es introducirse en el kernel de Linux y explorar su arquitectura y componentes principales, empezaremos con una vuelta rápida por la historia del kernel, después nos centraremos en la arquitectura del kernel de Linux a vista de pájaro y, finalmente, examinaremos sus subsistemas más importantes. El kernel de Linux tiene más de seis millones de líneas de código, por lo tanto, esta introducción no es exhaustiva. Los recursos ayudarán a profundizar.
Un pequeño viaje a través de la historia de Linux
Aunque podría decirse que Linux es el sistema operativo de código abierto más popular, su historia es realmente bastante corta considerando la línea temporal de los sistemas operativos. En los primero momentos de la computación, los programadores desarrollaban sobre el hardware directamente en el lenguaje que él entendía. La falta de un sistema operativo significaba que únicamente una aplicación (y por lo tanto un único usuario) podía usar una dispositivo enorme y caro de cada vez. Los primeros sistemas operativos fueron desarrollados en los años 50 para proveer de una experiencia de desarrollo más simple. Algunos ejemplos son General Motors Operating System (GMOS) desarrollado para el IBM 701 y el FORTRAN Monitor System (FMS) desarrollado por la aviación americana para el IBM 709.
En los años 60, el Instituto Tecnológico de Massachussets (MIT) y un grupo de compañías desarrollaron un sistema operativo experimental llamado Multics (Multiplexed Information and Computing Service) para la GE-654. Uno de los desarrolladores de este sistema, AT&T, abandonó Multics y desarrolló su propio sistema operativo en 1970 llamado Unics. Junto con este sistema operativo vino el lenguaje C, para el que fue desarrollado y, posteriormente, reescrito con el fin de hacer el desarrollo del sistema operativo portable.
Veinte años más tarde, Andrew Tanenbaum creo una versión de UNIX con un microkernel llamada MINIX que corría en pequeños PC. Este sistema operativo de código abierto inspiró el desarrollo inicial de Linux por parte de Linus Torvals a principios de los 90 (ver figura 1).
Linux evolucionó rápidamente para transformarse de ser un proyecto de una sola persona a un proyecto de desarrollo de extensión mundial que involucraba a miles de programadores. Una de las más importantes decisiones para Linux fue la adopción de la Licencia Pública General de la GNU (GPL). Bajo la GPL, el kernel de Linux fue protegido contra el la explotación comercial, y además beneficiado por el espacio de desarrollo del proyecto GNU. Esto permitió que aplicaciones útiles como GCC y varias shell fueran soportadas.
Introducción al kernel de Linux
Ahora, visión a grandes rasgos sobre la arquitectura del sistema operativo GNU/Linux. Puedes pensar en un sistema operativo desde dos niveles, señalados en la figura 2.
En la parte más alta está el espacio de usuario o aplicación. Aquí es donde las aplicaciones de usuario son ejecutadas. Por debajo del espacio de usuario esta el espacio del núcleo donde aparece el kernel de Linux.
También está la librería de C de GNU (glibc) que provee la interfaz de llamadas al sistema que conecta con el kernel y provee del mecanismo de transición entre las aplicaciones usuario y el núcleo. Esto es importante, ya que el kernel y las aplicaciones de usuario ocupan diferentes áreas de direcciones protegidas. Y mientras cada proceso de usuario ocupa su propio espacio de direcciones virtual, el kernel ocupa un espacio de direcciones único.
Podemos ir más allá dentro del kernel dividiéndolo en tres niveles a grandes rasgos. En lo más alto esta la interfaz de llamadas al sistema, que implementa las funciones básicas tales como read o write. Por debajo de ella, se encuentra el código del kernel, o mejor dicho, el código del kernel independiente de la arquitectura, este código es común a todas las arquitecturas de procesadores soportadas por Linux. Más abajo aún, está el código dependiente de la arquitectura, que forma lo que es más comúnmente llamado BSP (Board Support Package). Este código es específico para cada procesador y plataforma.
Propiedades del kernel de Linux
Cuando discutimos acerca de un sistema extenso y complejo, podemos enfocarlo desde varias perspectivas. Una forma acertada en la descomposición de la arquitectura es el proveer de un modo de entender mejor el código, y esto es lo que haremos aquí.
El kernel de Linux, implementa un número de atributos importantes de arquitectura. Tanto al más alto nivel, como al más bajo nivel, el kernel es dividido en un distintos subsistemas. Linux puede ser considerado también como un kernel monolítico ya que engloba dentro suyo todos los servicios básicos. Esto lo diferencia de una arquitectura de microkernel donde el kernel provee de servicios básicos tanto de comunicación, de entrada/salida, manejo de procesos y memoria y los servicios más específicos están conectados a la capa del microkernel. Cada uno tiene sus ventajas y desventajas.
A lo largo del tiempo el kernel de Linux ha conseguido eficiencia en términos de uso de memoria y CPU, así como ser extremadamente estable. Pero el aspecto más interesante de Linux, dado su tamaño y complejidad, es su portabilidad. Linux puede ser compilado para funcionar en un enorme número de procesadores y plataformas con diferentes restricciones de arquitectura y necesidades. Un ejemplo es la capacidad de Linux para correr en un procesador con MMU como en uno que no la tiene. El port uClient del kernel de Linux provee soporte para arquitecturas sin MMU.
Sistemas principales del kernel de Linux
Ahora, echaremos un vistazo a los principales componentes del kernel de Linux usando el desglose mostrado en la figura 3 como guía.
Interfaz de llamadas al sistema (SCI)
La SCI es una fina capa que provee de la capacidad de realizar llamadas a funciones desde el espacio de usuario al kernel. Tal y como se ha discutido previamente, esta interfaz puede ser dependiente de la arquitectura, incluso dentro de la misma familia de procesadores. La SCI es realmente un interesante servicio multiplexador y demultiplexador de llamadas al sistema. Puede encontrarse su implementación en ./linux/kernel, así como las porciones dependientes de la arquitectura en ./linux/arch.
Gestión de procesos
La gestión de procesos está centrada en la ejecución de los procesos. En el kernel, son llamados hilos y representan una virtualización individual del procesador (código del hilo, registros de la CPU, datos y pila). En el espacio de usuario, se suele usar el término proceso, aunque en la implementación de Linux no separa los dos conceptos (hilos y procesos). El núcleo provee una API a través de la SCI con la que se pueden crear nuevos procesos (fork, exec, o funciones POSIX), parar un proceso (kill, exit) y comunicarse y sincronizarse entre ellos (signal, o mecanismos POSIX)
La gestión de procesos es necesaria para compartir la CPU entre los hilos activos. El kernel implementa un novedoso algoritmo de planificación que opera en tiempo constante, sin tener el cuenta el numero de procesos que compiten por la CPU. Este es el planificador O(1), denotando que le lleva misma cantidad de tiempo la planificación de un sólo hilo que la de varios. El planificador O(1) también soporta multiproceso (SMP). Se pueden encontrar las fuentes de la gestión de procesos en ./linux/kernel (y los dependientes de la arquitectura en ./linux/arch).
Gestión de memoria
Otro importante recurso que es controlado por el kernel es la memoria. Por eficiencia, dada la manera en la que el hardware maneja la memoria virtual, la memoria es gestionada en lo que se llaman páginas (4kb para la mayoría de las arquitecturas). Linux incluye las definiciones para manejar la memoria disponible, así como los mecanismos hardware para el mapeo físico y virtual.
Pero la gestión de memoria es mucho más que manejar buffers de 4KB. Linux contiene abstracciones de buffers más allá de los de 4KB, como el localizador de slabs. Este esquema de manejo de memoria usa buffers de 4kb como base, pero además reserva estructuras dentro de ellos, llevando la cuenta de que páginas están completas, parcialmente usadas o vacías. Esto permite que el esquema de memoria crezca y disminuya dinámicamente según las necesidades incluso del sistema más grande.
Con varios usuarios haciendo uso de la memoria, existen ocasiones en las que la memoria disponible puede agotarse. Por esta razón, las páginas pueden ser movidas de memoria y guardadas en el disco. Este proceso se llama intercambio (swapping) ya que las páginas son intercambiadas entre la memoria y el disco duro. Se pueden encontrar más recursos sobre el manejo de la memoria en ./linux/mm
El sistema de archivos virtual
El sistema de archivos virtual (VFS- virtual file system) es un aspecto interesante del kernel de Linux ya que provee una interfaz común de abstracción para los sistemas de archivos. El VFS proporciona una capa de intercambio entre la SCI y los sistemas de archivos soportados por el kernel (ver figura 4)
En la parte más alta del VFS se encuentra un API común que contiene las abstracciones de funciones tales como open, close, read y write. En la parte más baja, están las abstracciones del sistema que definen cómo debe ser implementada la capa superior. Estas son añadidos para el sistema de ficheros dado (existen más de 50). Se pueden encontrar las fuentes del sistema de archivos en ./linux/fs
Bajo la capa del sistema de archivos está la caché del buffer, que proporciona un conjunto sencillo de funciones a la capa del sistema de archivos (independientemente del sistema de ficheros en particular). Esta capa de caché optimiza el acceso a los dispositivos físicos manteniendo brevemente información (o arriesgándose a leer de forma anticipada para que los datos estén disponibles para cuando hagan falta). Por debajo del caché del buffer están los drivers de los dispositivos, que implementan la interfaz de cada dispositivo específico.
Red
La pila de red, por diseño, sigue una arquitectura por capas modelada tras los protocolos en sí. Recordando que el Protocolo de Internet (IP) es el protocolo central de las capas de red que se sitúa bajo el protocolo de transporte (TCP). Sobre el protocolo TCP está la capa de sockets, que es llamada a través de la SCI.
La capa de sockets es la API estándar para el subsistema de trabajo en red y proporciona una interfaz de usuario para varios protocolos de red. Desde acceso a raw frames hasta las unidades de datos del protocolo IP (los PDUs), el protocolo TCP y el Protocolo de Datagrama de Usuario (UDP), la capa de sockets provee de una manera estandarizada de manejar las conexiones y mover datos entre puntos de destino. Las fuentes de red están disponibles en el kernel en ./linux/net
Drivers de dispositivos
La inmensa mayoría del código del kernel de Linux está en los drivers de los dispositivos que hacen a determinado elemento hardware usable. El árbol de código de Linux proporciona un subdirectorio para los drivers que está, a su vez, divido entre los varios dispositivos que soporta, tales como Bluetooth, I2C, de serie... Se pueden encontrar en el código en ./linux/drivers.
Código dependiente de la arquitectura
Aunque Linux es independiente de la arquitectura en la que corra, hay varios elementos que deben tenerla en cuenta para operaciones habituales y eficiencia. El subdirectorio ./linux/arch define la porción del kernel dependiente de la arquitectura contenida en un número de subdirectorios que son específicos a ella (en conjunto forman la BSP). Para un típico ordenador de sobremesa, se usa el directorio i386. Cada directorio de cada arquitectura contiene otros subdirectorios que se centran en un aspecto concreto del kernel, como el inicio, gestión de memoria...Puedes encontrar el código dependiente de la plataforma en ./linux/arch
Características interesantes del kernel de Linux
Por si la eficiencia y la portabilidad del kernel no eran suficientes, también proporciona otras características que no pueden ser clasificadas en el desglose anterior.
Linux, por ser un sistema operativo de producción y de código libre, es un buen banco de pruebas para nuevos protocolos y avances de esos protocolos. Linux soporta un gran número de protocolos de red, incluyendo el típico TCP/IP, así como la extensión para red de alta velocidad (mayor que Ethernet de 1 o 10 Gigabits). Linux también soportas protocolos como el SCTP, que proporciona características avanzadas sobre TCP (como reemplazo del protocolo del nivel de transporte).
Linux es también un kernel dinámico, soporta el añadido y eliminación de componentes software al vuelo. Esto se conoce como módulos del kernel instalables dinámicamente, y pueden ser insertados al inicio, cuando sean necesarios si un dispositivo concreto es encontrado requiriendo el módulo) o en cualquier otro momento a petición del usuario.
Un reciente avance de Linux es su uso como un sistema operativo para otros sistemas operativos (llamado hipervisor). Recientemente, se realizó una modificación en el kernel que fue llamada la Kernel based Virtual Machine (KVM). Esta modificación permitió una nueva interfaz de usuario que permite a otros sistemas operativos correr sobre un KVM-enabled kernel. Además de correr otra instancia de Linux, Windows puede ser virtualizado. La única restricción es que el procesador usado debe soportar las nueva instrucciones de virtualización.
Yendo más allá
Este artículo simplemente roza la superficie de la arquitectura del kernel de Linux y sus características y capacidades. Puedes buscar en el directorio de documentación que se proporciona con cada distribución de Linux para información detallada sobre los contenidos del kernel. No te olvides de mirar la sección de recursos al final de este articulo para información más detallada sobre algunos de los temas discutidos aquí.
510 Comentarios
Temes relacionaos:
Linux