Microkernel
Microkernel
Microkernel
net/publication/283507037
CITATIONS READS
0 961
5 authors, including:
Carlos Morell
Universidad Central "Marta Abreu" de las Villas
68 PUBLICATIONS 255 CITATIONS
SEE PROFILE
Some of the authors of this publication are also working on these related projects:
All content following this page was uploaded by Reinier Millo-Sánchez on 24 June 2016.
Resumen
El empleo de sistemas embebidos se ha convertido en un fenómeno común de nuestros días. Pueden ser encontrados
dispositivos embebidos desde las fábricas automatizadas hasta en nuestro hogar. Aunque el funcionamiento de los
sistemas embebidos es predeterminado por la funcionalidad para la cual se van a emplear, es necesario tener un
sistema operativo que controle el dispositivo. El desarrollo de sistemas operativos para controlar estos sistemas
embebidos tiene nuevos retos con el auge de nuevas plataformas de hardware y nuevos requisitos de sistema. Dos
de los enfoques más empleados para el desarrollo de kernels de sistema son el monolítico y el microkernel. El enfoque
basado en microkernel tiene una concepción minimalista y constituye una mejor alternativa para el desarrollo de
sistemas embebidos. En este trabajo se hace un estudio sobre los enfoques para el desarrollo de kernel y se presenta
una comparativa entre el enfoque de kernel monolítico y microkernel, destacando algunas de las ventajas que ofrece
el microkernel para el desarrollo de sistemas embebidos.
Abstract
The use of embedded systems has become a common phenomenon today. They can be found from automated
factories to our home. Although the function of embedded systems is predetermined by the functionality for which are
to be used, you need an operating system that controls the device. The development of operating systems to control
embedded systems has new challenges with the rise of new hardware platforms and new system requirements. Two
of the most commonly used approaches for the development of system kernels are monolithic and microkernel. The
microkernel-based approach takes a minimalist design and seems a better alternative for the development of embedded
systems. This paper presents a study about the kernel development approaches and presents a comparison between the
microkernel and monolithic, highlighting some of the advantages of the development of embedded systems based on
microkernel.
*
rmillo@uclv.cu
1
1. Introducción
El empleo de dispositivos embebidos ha tenido un auge en los últimos años. Su empleo en el control automático de
procesos de producción en fábricas se ha ido extendiendo hasta ser un elemento común en nuestros hogares. Estos
dispositivos embebidos o empotrados como también se les conoce, es común observarlos ya presentes en lavadoras
de control automático, en sistemas decodificadores para la televisión, en hornos, ventiladores, sistemas de alumbrado
automático, reproductores DVD, dispositivos celulares, entre otros muchos dispositivos del hogar.
Los sistemas embebidos no son más que un sistema de computación cuyo hardware y software están específicamente
diseñados y optimizados para resolver un problema concreto de forma eficiente. El término embebido o empotrado hace
referencia al hecho que la electrónica o el sistema electrónico de control es una parte fundamental del sistema donde se
emplea. La característica principal que diferencia a los embebidos de los demás sistemas electrónicos es que, por estar
insertados dentro del dispositivo que controlan, están sujetos en mayor medida a cumplir requisitos de tamaño, fiabilidad,
consumo y coste, y su existencia puede no ser aparente (Tanenbaum, 2009; Silberschatz et al., 2013).
Estos sistemas son empleados también en aplicaciones donde es necesario la respuesta en tiempo real ante ciertos eventos,
como es el caso de equipos médicos en los hospitales y sistemas de radares tanto marítimos como aéreos. Una alternativa
empleada en el desarrollo de sistemas embebidos ha sido el empleo de un sistema operativo, opción que permite explotar
las potencialidades propias de estos tipos de sistemas, centrando el enfoque de desarrollo en la capa de aplicaciones,
propiciando una mayor abstracción para la interacción con el hardware. Muchos han sido los enfoques empleados para
el desarrollo de sistemas operativos para el control de los sistemas embebidos. Uno de ellos es basado en el paradigma
arquitectónico que se emplee para la construcción del kernel del sistema operativo.
El kernel del sistema es la capa inferior de un sistema operativo y es el que interactúa directamente con el hardware,
proveyendo interfaces de trabajo hacia las capas superiores. En la actualidad existen varios sistemas operativos de
propósito general, centrados principalmente en dos grandes familias: Microsoft Windows y GNU/Linux. Estos sistemas
en su mayoría están formados por un núcleo o kernel monolítico, el cual concentra todas las funcionalidades básicas del
sistema operativo: gestión de los procesos, manipulación del sistema de archivos, control de los dispositivos de hardware,
gestión de memoria, entre otras.
Por otro lado, existen otros tipos de kernel llamados microkernel que tienen una concepción minimalista. Como plantea
(Liedtke, 1995) el microkernel sólo debe implementar los elementos básicos o primitivas para el funcionamiento del
sistema, el resto de los elementos deben ser implementados a nivel de aplicaciones de usuarios. Esta concepción permite
tener un sistema más flexible, modular y tolerable a fallos.
En este trabajo se exponen los diferentes enfoques para el diseño del kernel del sistema. Se hace una comparación entre los
enfoques monolítico y microkernel, proponiendo el enfoque de microkernel como una mejor alternativa para el desarrollo
de sistemas embebidos.
2
2. Enfoques de desarrollo de kernel
El kernel es el elemento principal para el funcionamiento del sistema operativo, por lo que se debe tener mucho cuidado
durante todo el proceso de desarrollo. Las tendencias o enfoques empleados para el desarrollo del kernel han ido variando
con el desarrollo de la propia tecnología. Actualmente existen cuatro grandes enfoques bien marcados para su desarrollo:
kernel monolítico, microkernel, kernel híbrido y exokernel.
Estos enfoques difieren entre sí por la forma en que se organizan y estructuran las funcionalidades básicas del sistema,
tanto dentro como fuera del kernel. Esta organización se refleja directamente en el tamaño del kernel (en líneas de
código) en cada uno de los enfoques y por tanto en el TCB (Trusted Computing Base) del sistema. Los enfoques de
microkernel y exokernel reducen considerablemente el TCB de sistema por su tamaño reducido en comparación con el
enfoque monolítico e híbrido, como se muestra en la Figura 1.
Figura 1: Relación de tamaño del TCB en cada uno de los enfoques de desarrollo de kernel del sistema
Los kernels monolíticos y los microkernels han sido los dos enfoques más empleados en el desarrollo de kernel para
sistemas embebidos. A partir de estos dos enfoques, ha tomado auge el desarrollo de kernels híbridos, tratando de
aprovechar sus ventajas. Los exokernels por su características solo han sido empleado en aplicaciones muy específicas.
Tanenbaum (2009) y Silberschatz et al. (2013) definen el kernel monolítico como una colección de procedimientos
enlazados entre sí en un único programa binario. En este enfoque todas las funcionalidades básicas del sistema se ejecutan
como un solo programa en modo kernel. La implementación más conocida de kernel monolítico es el kernel de Linux.
Linux desde sus inicios es un kernel monolítico que ha ido evolucionando y actualmente aunque es modular, o sea,
extensible mediante módulos cargables en tiempo de ejecución, continúa siendo un kernel monolítico (Bovet and Cesati,
2000; Love, 2010).
A diferencia de los kernels monolíticos, los microkernels tienen un enfoque de desarrollo minimalista, donde se debe
implementar a nivel de kernel solo los elementos principales que son nombrados conceptos o primitivas. En Liedtke
(1995) se definen cuatro primitivas necesarias y suficientes para el correcto desarrollo de un microkernel: espacio de
direcciones, abstracción de procesos, mecanismo de comunicación e identificadores únicos.
El autor plantea que la definición de las primitivas está dada por la funcionalidad y no por el rendimiento del sistema.
3
Se considera una primitiva aquel elemento que implementado correctamente fuera del microkernel no permite la
implementación de las funcionalidades requeridas del sistema. Adicionalmente a las primitivas, el desarrollo de un
microkernel está regido por dos principios básicos, como se plantea en Liedtke (1995), el “principio de independencia”
y el “principio de integridad”, este último nombrado también “principio básico de la comunicación”.
El principio de independencia expresa que debe ser posible implementar un subsistema o aplicación A1 arbitrario de
forma tal que este no pueda ser perturbado o corrompido por otro subsistema A2 . Este principio debe dar garantía de
independencia de A1 respecto a cualquier otro subsistema A2 . Mientras que el principio de integridad plantea que debe
ser posible que un subsistema o aplicación A1 se comunique o intercambie información con una aplicación A2 , sin que
esta comunicación o intercambio sea corrompida o escuchada por otra aplicación S3 .
Por otra parte el enfoque exokernel (Engler et al., 1995) a diferencia de los otros enfoques brinda la menor cantidad
de abstracciones de hardware sobre el cual se ejecuta, permitiendo el acceso al hardware de forma casi directa por las
aplicaciones y a través de bibliotecas de programación. Estos son de tamaño muy reducido comparado con los enfoques
analizados anteriormente, y sus funcionalidades están limitadas a garantizar la protección y la multiplexación de los
recursos de hardware.
Al permitir el acceso de las aplicaciones directamente al hardware, en aplicaciones muy específicas se pueden optimizar
algunas operaciones directas sobre el hardware, como es el caso de la gestión de la memoria y el acceso a disco. Estudios
han demostrado que el empleo de un exokernel para aplicaciones específicas, puede aumentar significativamente el
rendimiento del sistema, en Kaashoek et al. (1995) se hace un estudio del rendimiento de los exokernels y se optimiza el
rendimiento del servidor web Cheetah.
El desarrollo de exokernels, a pesar de tener un tamaño reducido, es un proceso complejo, pues se deben diseñar las
interfaces correctas y suficientes para manejar el hardware a bajo nivel y a la vez se debe mantener un equilibro entre la
seguridad y la minimalidad del sistema. En muchas ocasiones el empleo de varias bibliotecas de programación hacen el
proceso de mantenimiento muy complejo, lo que ha provocado un mayor uso de kernels monolíticos y microkernels para
el desarrollo de sistemas embebidos. Los exokernels aunque no son exactamente hipervisores, pueden ser empleados
para multiplexar el hardware subyacente entre varias máquinas virtuales (Tanenbaum, 2009).
4
el orden de los miles de LOC, por ejemplo Fiasco.OC (Härtig and Roitzsch, 2006; Elphinstone and Heiser, 2013) está en
aproximadamente 35 mil LOC (Wheeler, 2004), lo cual es una diferencia significativa si se tiene en cuenta que cada mil
LOC es posible encontrar al menos un error o vulnerabilidad (Vemuri and Al-Hamdani, 2011). Como se puede ver en la
Figura 2 muchos de los elementos que se encontraban a nivel de kernel en el enfoque monolítico, en el microkernel se
encuentran a nivel de usuario, con lo cual se logra reducir drásticamente el tamaño del kernel y por tanto el tamaño del
TCB.
Una de las principales ventajas de los microkernels sobre los kernels monolíticos es la extensibilidad del sistema. En un
sistema que emplea un microkernel se pueden agregar nuevas funcionalidades de sistema sin afectar el funcionamiento
del mismo y sin necesidad de ser modificado y recompilado, puesto que las funcionalidades son implementadas como
aplicaciones a nivel de usuario y se interactúa con ellas a través del mecanismo de comunicación. Por otra parte en los
sistemas de kernel monolítico, agregar nuevas funcionalidades de sistema puede poner en riesgo su funcionamiento, pues
es necesario la modificación de algunos subsistemas, así como la recompilación del kernel del sistema para el empleo de
la nueva funcionalidad.
Otra de las principales diferencias entre estos dos enfoques de diseño de kernel es la recuperación rápida ante
fallos, fundamentalmente en los controladores de dispositivos de hardware. En el kernel monolítico la mayoría de los
controladores funcionan a nivel de kernel, y un controlador defectuoso puede hacer fallar el sistema en su totalidad. A
diferencia de lo anterior, los microkernels implementan los controladores a nivel de usuario, por lo que un controlador
defectuoso no afecta el funcionamiento del sistema, cumpliendo con el principio de independencia.
Estos dos enfoques también difieren en la forma en que las aplicaciones de modo usuario interactúan con las
5
funcionalidades implementadas a nivel de kernel. En el enfoque monolítico, esta interacción se realiza a través de las
llamadas al sistema (Tanenbaum, 2009; Silberschatz et al., 2013), proceso en el cual se cambia el modo de ejecución
del modo usuario al modo kernel. A diferencia de este, en el enfoque de microkernel, esta interacción se realiza a través
del mecanismo de comunicación (Liedtke, 1993, 1995) enviando mensajes al microkernel. Por ejemplo, en la Figura 3
se muestra una aplicación haciendo una llamada a un controlador de un dispositivo de hardware. Como se puede ver
en el caso del microkernel es necesario realizar dos cambios de contexto o modo de ejecución, mientras en el kernel
monolítico es suficiente con un sólo cambio.
Figura 3: Interacción entre las aplicaciones de usuario y el kernel del sistema (Tomada de Härtig and Engel (2014)).
Este ha sido un aspecto crítico en el desarrollo de los microkernels y es conocido como el cuello de botella en el
rendimiento. En los inicios del desarrollo de los microkernels se pensó que estos no alcanzaban el rendimiento esperado
por la ineficiencia del mecanismo de comunicación. En (Liedtke, 1993, 1995) se demuestra que el bajo rendimiento en
las primeras generaciones de microkernels era producto de un mal diseño e implementación, y propone los elementos
básicos para el diseño de microkernel, así como los elementos básicos del mecanismo de comunicación (Liedtke, 1993),
elementos empleados en el desarrollo de los microkernels de la familia L4.
Ambos enfoques de diseño de kernel han sido empleados para el desarrollo de sistemas embebidos, pero el enfoque
basado en microkernel brinda un mayor rendimiento del sistema (Roch and Wien, 2004). A diferencia de los kernels
monolíticos, los microkernels no proveen una capa de abstracción para la interacción con el hardware, como el caso de
la CPU, estos son implementados de forma específica y optimizada para explotar al máximo todas las funcionalidades
del hardware y alcanzar altos niveles de rendimiento.
6
3. Conclusiones
Los microkernels tienen un tamaño más reducido respecto a los kernels monolíticos, lo cual logra reducir el tamaño del
TCB y dar mayor seguridad al sistema. También tienen un mayor grado de recuperación ante errores, ya que la mayor
parte del sistema ejecuta en modo usuario. Aunque el mecanismo de comunicación empleado por los microkernels es
más costoso que las llamadas al sistema de los kernels monolíticos, está demostrado que no influye significativamente
en el rendimiento del sistema. Por otra parte, los microkernels hacen un uso más eficiente de todas las facilidades que
brinda el hardware de la plataforma que se está empleando, lo cual les permite obtener altos niveles de rendimiento, y
los convierte en una mejor opción para el desarrollo de sistemas embebidos.
Referencias
Bovet, Daniel P. and Marco Cesati (2000): Understanding the Linux Kernel. O’Reilly, 1st edn.
Elphinstone, Kevin and Gernot Heiser (2013): From L3 to seL4 what have we learnt in 20 years of L4 microkernels? In:
Proceedings of the Twenty-Fourth ACM Symposium on Operating Systems Principles. ACM, pp. 133–150.
Engler, D.R.; M.F. Kaashoek; ; and J. O’Toole (December 1995): Exokernel: an operating system architecture for
application-specific resource management. In: Proceedings of the Fifteenth ACM Symposium on Operating Systems
Principles. pp. 251–266.
Härtig, Hermann and Michael Roitzsch (2006): Ten years of research on L4-based real-time systems. In: Proceedings
of the 8th Real-Time Linux Workshop. Lanzhou, China.
Kaashoek, M. Frans; Dawson R. Engler; Gregory R. Ganger; Héctor M. Briceño; Russell Hunt; David Mazières; Thomas
Pinckney; Robert Grimm; John Jannotti; and Kenneth Mackenzie (1995): Application Performance and Flexibility on
Exokernel Systems. In: Proceedings of the 16 ACM Symposium on Operating Systems Principles. pp. 52–65.
Liedtke, Jochen (1993): Improving IPC by Kernel Design. In: Symposium on Operating Systems Principles (SOSP). pp.
175–188.
Liedtke, Jochen (December 1995): On µ-kernel construction. In: 15th ACM Symposium on Operating System Principles
(SOSP). pp. 237–250.
7
Silberschatz, Abraham; Peter B. Galvin; and Greg Gagne (2013): Operating System Concepts. John Wiley & Sons.
Vemuri, Durga and Wasim Al-Hamdani (2011): Measures to improve security in a microkernel operating system. In:
Proceedings of the Information Security Curriculum Development Conference. ACM, pp. 25–33.