
Un núcleo es un programa informático en el centro del sistema operativo de una computadora que siempre tiene control total sobre todo en el sistema. El núcleo también es responsable de prevenir y mitigar conflictos entre diferentes procesos. [ 1 ] Es la parte del sistema operativo que siempre reside en la memoria [ 2 ] y facilita las interacciones entre los componentes de hardware y software. Un núcleo completo controla todos los recursos de hardware (por ejemplo, E/S , memoria, criptografía) a través de controladores de dispositivos , arbitra conflictos entre procesos relacionados con dichos recursos y optimiza el uso de recursos comunes, como CPU , caché , sistemas de archivos y sockets de red. En la mayoría de los sistemas, el núcleo es uno de los primeros programas que se cargan al inicio (después del cargador de arranque ). Maneja el resto del inicio, así como la memoria, los periféricos y las solicitudes de entrada/salida (E/S) del software , traduciéndolas en instrucciones de procesamiento de datos para la unidad central de procesamiento .
El código crítico del núcleo se carga generalmente en un área de memoria separada, protegida del acceso del software de aplicación u otras partes menos críticas del sistema operativo. El núcleo realiza sus tareas, como la planificación de procesos, la gestión de dispositivos de hardware como el disco duro y el manejo de interrupciones , en este espacio protegido del núcleo . En cambio, los programas de aplicación, como navegadores, procesadores de texto o reproductores de audio o vídeo, utilizan un área de memoria separada, el espacio de usuario . Esto evita que los datos de usuario y los datos del núcleo interfieran entre sí y causen inestabilidad y lentitud, [ 1 ] así como que las aplicaciones defectuosas afecten a otras aplicaciones o provoquen el bloqueo de todo el sistema operativo. Incluso en sistemas donde el núcleo está incluido en los espacios de direcciones de las aplicaciones , se utiliza la protección de memoria para evitar que las aplicaciones no autorizadas modifiquen el núcleo.
La interfaz del núcleo es una capa de abstracción de bajo nivel . Cuando un proceso solicita un servicio al núcleo, debe invocar una llamada al sistema , generalmente a través de una función contenedora .
Existen diferentes diseños de arquitectura de núcleo. Los núcleos monolíticos se ejecutan completamente en un único espacio de direcciones con la CPU ejecutándose en modo supervisor , principalmente para mayor velocidad. Los micronúcleos ejecutan la mayoría, pero no todos, sus servicios en el espacio de usuario, [ 3 ] como lo hacen los procesos de usuario, principalmente para mayor resiliencia y modularidad . [ 4 ] MINIX 3 es un ejemplo notable de diseño de micronúcleo. Algunos núcleos, como el núcleo Linux , son tanto monolíticos como modulares, ya que pueden insertar y eliminar módulos de núcleo cargables en tiempo de ejecución.
Este componente central de un sistema informático es responsable de la ejecución de programas. El núcleo se encarga de decidir en cada momento cuál de los numerosos programas en ejecución debe asignarse al procesador o procesadores.
Memoria de acceso aleatorio
La memoria de acceso aleatorio (RAM) se utiliza para almacenar tanto instrucciones de programa como datos. [ a ] Normalmente, ambos deben estar presentes en la memoria para que un programa se ejecute. A menudo, varios programas requieren acceso a la memoria, demandando frecuentemente más memoria de la que el ordenador tiene disponible. El núcleo es responsable de decidir qué memoria puede usar cada proceso y de determinar qué hacer cuando la memoria disponible es insuficiente.
Dispositivos de entrada/salida
Los dispositivos de entrada/salida incluyen, entre otros, periféricos como teclados, ratones, unidades de disco, impresoras, dispositivos USB , adaptadores de red y dispositivos de visualización . El núcleo proporciona métodos prácticos para que las aplicaciones utilicen estos dispositivos, que normalmente están abstraídos por el núcleo, de modo que las aplicaciones no necesitan conocer los detalles de su implementación.
Gestión de recursos
Los aspectos clave necesarios en la gestión de recursos son la definición del dominio de ejecución ( espacio de direcciones ) y el mecanismo de protección utilizado para mediar el acceso a los recursos dentro de un dominio. [ 5 ] Los núcleos también proporcionan métodos para la sincronización y la comunicación entre procesos (IPC). Estas implementaciones pueden ubicarse dentro del propio núcleo o este puede depender de otros procesos que esté ejecutando. Si bien el núcleo debe proporcionar IPC para brindar acceso a las funcionalidades que ofrecen los demás, también debe proporcionar a los programas en ejecución un método para solicitar acceso a dichas funcionalidades. El núcleo también es responsable del cambio de contexto entre procesos o hilos.
Gestión de la memoria
El núcleo tiene acceso completo a la memoria del sistema y debe permitir que los procesos accedan a ella de forma segura según la necesiten. A menudo, el primer paso para lograr esto es el direccionamiento virtual , que generalmente se consigue mediante paginación y/o segmentación . El direccionamiento virtual permite que el núcleo haga que una dirección física determinada parezca ser otra dirección, la dirección virtual. Los espacios de direcciones virtuales pueden ser diferentes para distintos procesos; la memoria a la que un proceso accede en una dirección (virtual) particular puede ser diferente de la memoria a la que otro proceso accede en la misma dirección. Esto permite que cada programa se comporte como si fuera el único (aparte del núcleo) en ejecución y, por lo tanto, evita que las aplicaciones se bloqueen entre sí. [ 6 ]
En muchos sistemas, la dirección virtual de un programa puede referirse a datos que no se encuentran actualmente en la memoria. La capa de indirección que proporciona el direccionamiento virtual permite al sistema operativo utilizar otros almacenes de datos, como un disco duro , para almacenar lo que de otro modo tendría que permanecer en la memoria principal ( RAM ). Como resultado, los sistemas operativos pueden permitir que los programas utilicen más memoria de la que el sistema tiene físicamente disponible. Cuando un programa necesita datos que no se encuentran actualmente en la RAM, la CPU le indica al núcleo que esto ha ocurrido, y el núcleo responde escribiendo el contenido de un bloque de memoria inactivo en el disco (si es necesario) y reemplazándolo con los datos solicitados por el programa. El programa puede entonces reanudarse desde el punto en que se detuvo. Este esquema se conoce generalmente como paginación por demanda .
El direccionamiento virtual también permite la creación de particiones virtuales de memoria en dos áreas disjuntas: una reservada para el núcleo ( espacio del núcleo ) y la otra para las aplicaciones ( espacio de usuario ). El procesador no permite que las aplicaciones accedan a la memoria del núcleo, evitando así que una aplicación dañe el núcleo en ejecución. Esta partición fundamental del espacio de memoria ha contribuido en gran medida al diseño actual de los núcleos de propósito general y es casi universal en dichos sistemas, aunque algunos núcleos de investigación (por ejemplo, Singularity ) adoptan otros enfoques.
Gestión de dispositivos
Para realizar funciones útiles, los procesos necesitan acceso a los periféricos conectados al ordenador, que son controlados por el núcleo mediante controladores de dispositivo . Un controlador de dispositivo es un programa informático que encapsula, supervisa y controla un dispositivo de hardware (a través de su interfaz hardware/software (HSI) ) en nombre del sistema operativo. Proporciona al sistema operativo una API, procedimientos e información sobre cómo controlar y comunicarse con un determinado componente de hardware. Los controladores de dispositivo son una dependencia importante y vital para todos los sistemas operativos y sus aplicaciones. El objetivo de diseño de un controlador es la abstracción; su función es traducir las llamadas a funciones abstractas (llamadas de programación) requeridas por el sistema operativo en llamadas específicas del dispositivo. En teoría, un dispositivo debería funcionar correctamente con un controlador adecuado. Los controladores de dispositivo se utilizan, por ejemplo, para adaptadores de host , tarjetas de vídeo , tarjetas de sonido , impresoras , escáneres , módems y controladores de interfaz de red .
A nivel de hardware, las abstracciones comunes de los controladores de dispositivos incluyen:
- Interfaz directa
- Utilizando una interfaz de alto nivel, como una BIOS de vídeo
- Utilizando un controlador de dispositivo de nivel inferior (controladores de sistema de archivos que utilizan controladores de disco)
- Simular el trabajo con hardware, mientras se realiza algo completamente diferente.
Y a nivel de software, las abstracciones de controladores de dispositivos incluyen:
- Permitir que el sistema operativo acceda directamente a los recursos de hardware.
- Solo implementando primitivas
- Implementar una interfaz para software que no sea un controlador, como TWAIN.
- Implementar un lenguaje (a menudo un lenguaje de alto nivel como PostScript )
Por ejemplo, para mostrarle algo al usuario en la pantalla, una aplicación haría una solicitud al kernel, que reenviaría la solicitud a su controlador de pantalla, que luego es responsable de trazar realmente el carácter/píxel. [ 6 ]
Un núcleo debe mantener una lista de dispositivos disponibles. Esta lista puede conocerse de antemano (por ejemplo, en un sistema embebido donde el núcleo se reescribe si cambia el hardware disponible), ser configurada por el usuario (típico en PC antiguos y en sistemas que no están diseñados para uso personal) o ser detectada por el sistema operativo en tiempo de ejecución (normalmente llamado plug and play ). En los sistemas plug and play, un administrador de dispositivos primero realiza un escaneo en diferentes buses periféricos , como Peripheral Component Interconnect (PCI) o Universal Serial Bus (USB), para detectar los dispositivos instalados y luego busca los controladores adecuados.
Dado que la gestión de dispositivos es un tema muy específico de cada sistema operativo , estos controladores se manejan de manera diferente según el diseño del kernel. Sin embargo, en todos los casos, el kernel debe proporcionar la E/S necesaria para que los controladores accedan físicamente a sus dispositivos a través de algún puerto o ubicación de memoria. Es fundamental tomar decisiones importantes al diseñar el sistema de gestión de dispositivos, ya que en algunos diseños los accesos pueden implicar cambios de contexto , lo que hace que la operación consuma muchos recursos de la CPU y genere fácilmente una sobrecarga de rendimiento significativa.
llamadas al sistema
En informática, una llamada al sistema es la forma en que un proceso solicita un servicio al núcleo del sistema operativo para el cual normalmente no tiene permiso. Las llamadas al sistema proporcionan la interfaz entre un proceso y el sistema operativo. La mayoría de las operaciones que interactúan con el sistema requieren permisos no disponibles para un proceso de nivel de usuario; por ejemplo, las operaciones de entrada/salida realizadas con un dispositivo presente en el sistema o cualquier forma de comunicación con otros procesos requieren el uso de llamadas al sistema.
Una llamada al sistema es un mecanismo que utiliza el programa de aplicación para solicitar un servicio al sistema operativo. Estas llamadas emplean una instrucción en código máquina que provoca un cambio de modo en el procesador. Un ejemplo sería el cambio de modo supervisor a modo protegido. En este modo, el sistema operativo realiza acciones como el acceso a dispositivos de hardware o a la unidad de gestión de memoria . Generalmente, el sistema operativo proporciona una biblioteca que actúa como intermediaria entre el sistema operativo y los programas de usuario. Normalmente se trata de una biblioteca en C, como Glibc o la API de Windows. Esta biblioteca gestiona los detalles de bajo nivel, como el paso de información al núcleo y el cambio al modo supervisor. Las llamadas al sistema incluyen close, open, read, wait y write.
Para realizar un trabajo útil, un proceso debe poder acceder a los servicios que proporciona el núcleo. Esto se implementa de manera diferente en cada núcleo, pero la mayoría proporciona una biblioteca C o una API , que a su vez invoca las funciones del núcleo relacionadas. [ 7 ]
El método para invocar la función del kernel varía según el kernel. Si se utiliza el aislamiento de memoria, es imposible que un proceso de usuario llame directamente al kernel, ya que esto constituiría una violación de las reglas de control de acceso del procesador. Algunas posibilidades son:
- Usando una interrupción . [ e ] Este método está disponible en la mayoría del hardware y, por lo tanto, es muy común.
- Uso de una puerta de llamada . Una puerta de llamada es una dirección especial almacenada por el kernel en una lista en la memoria del kernel, en una ubicación conocida por el procesador. Cuando el procesador detecta una llamada a esa dirección, la redirige a la ubicación de destino sin provocar una violación de acceso. Esto requiere soporte de hardware, pero el hardware necesario es bastante común.
- Mediante una instrucción de llamada al sistema especial . Esta técnica requiere soporte de hardware específico del que carecen las arquitecturas comunes (en particular, x86 ); para estas arquitecturas, se utilizan interrupciones o compuertas de llamada. Sin embargo, se han añadido instrucciones de llamada al sistema a los modelos recientes de procesadores x86, y algunos sistemas operativos para PC las utilizan cuando están disponibles.
- Utilizando una cola basada en memoria. Una aplicación que realiza un gran número de solicitudes pero no necesita esperar el resultado de cada una puede agregar detalles de las solicitudes a un área de memoria que el núcleo escanea periódicamente para encontrar solicitudes.
Decisiones de diseño del núcleo
Protección
Una consideración importante en el diseño de un núcleo es el soporte que proporciona para la protección contra fallos ( tolerancia a fallos ) y contra comportamientos maliciosos ( seguridad ). Estos dos aspectos no suelen distinguirse claramente, y la adopción de esta distinción en el diseño del núcleo conlleva el rechazo de una estructura jerárquica para la protección . [ 5 ]
Los mecanismos o políticas proporcionados por el núcleo se pueden clasificar según varios criterios, entre ellos:
- ya sean estáticas (que se aplican en tiempo de compilación ) o dinámicas (que se aplican en tiempo de ejecución );
- ya sean preventivas o posteriores a la detección;
- ya sean compatibles con hardware o basadas en lenguaje;
- ya sea que se trate más de un mecanismo abierto o de una política vinculante;
- de acuerdo con los principios de protección que satisfacen (por ejemplo, Denning [ 11 ] [ 12 ] );
- y muchos más.
El soporte para dominios de protección jerárquicos [ 13 ] se implementa normalmente utilizando modos de CPU .
Muchos núcleos implementan "capacidades", es decir, objetos proporcionados al código de usuario que permiten un acceso limitado a un objeto subyacente gestionado por el núcleo. Un ejemplo común es la gestión de archivos: un archivo es una representación de información almacenada en un dispositivo de almacenamiento permanente. El núcleo puede realizar diversas operaciones, como leer, escribir, eliminar o ejecutar, pero una aplicación de usuario solo puede tener permiso para realizar algunas de ellas (por ejemplo, solo puede leer el archivo). Una implementación común consiste en que el núcleo proporcione a la aplicación un objeto (normalmente denominado "identificador de archivo") sobre el cual la aplicación puede invocar operaciones, cuya validez el núcleo verifica en el momento de la solicitud. Este sistema puede extenderse para abarcar todos los objetos gestionados por el núcleo, e incluso objetos proporcionados por otras aplicaciones de usuario.
Una forma eficiente y sencilla de proporcionar soporte de hardware para capacidades es delegar a la unidad de gestión de memoria (MMU) la responsabilidad de verificar los derechos de acceso para cada acceso a la memoria, un mecanismo llamado direccionamiento basado en capacidades . [ 14 ] La mayoría de las arquitecturas de computadoras comerciales carecen de dicho soporte de MMU para capacidades; el proyecto Capability Hardware Enhanced RISC Instructions (CHERI) está desarrollando mecanismos basados en capacidades para varias arquitecturas.
Un enfoque alternativo consiste en simular capacidades utilizando dominios jerárquicos comúnmente compatibles. En este enfoque, cada objeto protegido debe residir en un espacio de direcciones al que la aplicación no tenga acceso; el núcleo también mantiene una lista de capacidades en dicha memoria. Cuando una aplicación necesita acceder a un objeto protegido por una capacidad, realiza una llamada al sistema y el núcleo comprueba si la capacidad de la aplicación le otorga permiso para realizar la acción solicitada; si es así, realiza el acceso por ella (ya sea directamente o delegando la solicitud a otro proceso de nivel de usuario). El coste de rendimiento del cambio de espacio de direcciones limita la practicidad de este enfoque en sistemas con interacciones complejas entre objetos, pero se utiliza en los sistemas operativos actuales para objetos a los que no se accede con frecuencia o que no se espera que tengan un rendimiento rápido. [ 15 ] [ 16 ]
Si el firmware no admite mecanismos de protección, es posible simular la protección a un nivel superior, por ejemplo, simulando capacidades mediante la manipulación de tablas de páginas , pero esto tiene implicaciones en el rendimiento. [ 17 ] Sin embargo, la falta de soporte de hardware puede no ser un problema para los sistemas que optan por utilizar protección basada en lenguaje. [ 18 ]
Una decisión importante en el diseño del núcleo es la elección de los niveles de abstracción donde se deben implementar los mecanismos y políticas de seguridad. Los mecanismos de seguridad del núcleo desempeñan un papel fundamental en el soporte de la seguridad en niveles superiores. [ 14 ] [ 19 ] [ 20 ] [ 21 ] [ 22 ]
Un enfoque consiste en utilizar el firmware y el soporte del kernel para la tolerancia a fallos (véase más arriba), y construir la política de seguridad para comportamientos maliciosos sobre esa base (añadiendo características como mecanismos criptográficos cuando sea necesario), delegando cierta responsabilidad al compilador . Los enfoques que delegan la aplicación de la política de seguridad al compilador o al nivel de la aplicación se denominan a menudo seguridad basada en el lenguaje .
La falta de muchos mecanismos de seguridad críticos en los sistemas operativos convencionales actuales impide la implementación de políticas de seguridad adecuadas en el nivel de abstracción de la aplicación . [ 19 ] De hecho, una idea errónea común en seguridad informática es que cualquier política de seguridad puede implementarse en una aplicación independientemente del soporte del núcleo. [ 19 ]
Según los desarrolladores de Mars Research Group, la falta de aislamiento es uno de los principales factores que socavan la seguridad del kernel. [ 23 ] Proponen su marco de aislamiento de controladores para la protección, principalmente en el kernel de Linux. [ 24 ] [ 25 ]
Protección basada en hardware o en lenguaje
Los sistemas informáticos actuales suelen utilizar reglas impuestas por hardware que determinan qué programas pueden acceder a qué datos. El procesador supervisa la ejecución y detiene los programas que infringen estas reglas, como los procesos de usuario que intentan escribir en la memoria del núcleo. En sistemas que carecen de soporte para estas capacidades, los procesos se aíslan entre sí mediante espacios de direcciones separados. [ 26 ] Las llamadas de los procesos de usuario al núcleo se regulan exigiéndoles el uso de uno de los métodos de llamada al sistema descritos anteriormente.
Un enfoque alternativo consiste en utilizar protección basada en el lenguaje. En un sistema de protección basado en el lenguaje , el núcleo solo permitirá la ejecución de código producido por un compilador de lenguaje de confianza . El lenguaje puede diseñarse de tal manera que resulte imposible para el programador instruirlo para que realice alguna acción que viole un requisito de seguridad. [ 18 ]
Las ventajas de este enfoque incluyen:
- No se necesitan espacios de direcciones separados. Cambiar entre espacios de direcciones es una operación lenta que genera una gran sobrecarga, y actualmente se realizan numerosas optimizaciones para evitar cambios innecesarios en los sistemas operativos actuales. En un sistema de protección basado en lenguaje, el cambio es completamente innecesario, ya que todo el código puede operar de forma segura en el mismo espacio de direcciones.
- Flexibilidad. Cualquier esquema de protección que pueda diseñarse para expresarse mediante un lenguaje de programación puede implementarse con este método. Los cambios en el esquema de protección (por ejemplo, de un sistema jerárquico a uno basado en capacidades) no requieren nuevo hardware.
Las desventajas incluyen:
- Mayor tiempo de inicio de la aplicación. Las aplicaciones deben verificarse al iniciarse para garantizar que se hayan compilado con el compilador correcto, o puede que sea necesario recompilarlas a partir del código fuente o del código de bytes .
- Sistemas de tipos inflexibles . En los sistemas tradicionales, las aplicaciones suelen realizar operaciones que no son seguras en cuanto a tipos . Estas operaciones no se pueden permitir en un sistema de protección basado en lenguajes, lo que significa que las aplicaciones podrían tener que reescribirse y, en algunos casos, podrían perder rendimiento.
Algunos ejemplos de sistemas con protección basada en el lenguaje son JX y Singularity de Microsoft .
Cooperación en procesos
Edsger Dijkstra demostró que, desde un punto de vista lógico, las operaciones atómicas de bloqueo y desbloqueo que operan sobre semáforos binarios son primitivas suficientes para expresar cualquier funcionalidad de cooperación de procesos. [ 27 ] No obstante, este enfoque generalmente se considera deficiente en términos de seguridad y eficiencia, mientras que un enfoque de paso de mensajes es más flexible. [ 28 ] También existen otros enfoques (de nivel inferior o superior), y muchos núcleos modernos brindan soporte para sistemas como memoria compartida y llamadas a procedimientos remotos .
Gestión de dispositivos de E/S
La idea de un núcleo donde los dispositivos de E/S se manejan uniformemente con otros procesos, como procesos cooperativos paralelos, fue propuesta e implementada por primera vez por Brinch Hansen (aunque ideas similares se sugirieron en 1967 [ 29 ] [ 30 ] ). En la descripción de Hansen, los procesos "comunes" se denominan procesos internos , mientras que los dispositivos de E/S se denominan procesos externos . [ 28 ]
De forma similar a la memoria física, permitir que las aplicaciones accedan directamente a los puertos y registros del controlador puede provocar un mal funcionamiento del mismo o un fallo del sistema. Por ello, dependiendo de la complejidad del dispositivo, algunos dispositivos pueden ser sorprendentemente complejos de programar y utilizar varios controladores diferentes. Debido a esto, es importante proporcionar una interfaz más abstracta para gestionar el dispositivo. Esta interfaz normalmente la proporciona un controlador de dispositivo o una capa de abstracción de hardware. Con frecuencia, las aplicaciones requerirán acceso a estos dispositivos. El núcleo debe mantener la lista de estos dispositivos consultando al sistema de alguna manera. Esto puede hacerse a través de la BIOS o a través de uno de los diversos buses del sistema (como PCI/PCIE o USB). Tomando como ejemplo un controlador de vídeo, cuando una aplicación solicita una operación en un dispositivo, como mostrar un carácter, el núcleo debe enviar esta solicitud al controlador de vídeo activo. El controlador de vídeo, a su vez, debe ejecutar esta solicitud. Este es un ejemplo de comunicación entre procesos (IPC).
Enfoques de diseño a nivel de núcleo
Las tareas y características enumeradas anteriormente se pueden proporcionar de muchas maneras que difieren entre sí en diseño e implementación.
El principio de separación entre mecanismo y política es la diferencia sustancial entre las dos filosofías principales de microkernels y kernels monolíticos . [ 31 ] [ 32 ] Aquí, un mecanismo es el soporte que permite la implementación de muchas políticas diferentes, mientras que una política es un "modo de operación" particular. Ejemplo:
- Mecanismo: Los intentos de inicio de sesión del usuario se dirigen a un servidor de autorización.
- Política: El servidor de autorización requiere una contraseña que se verifica con las contraseñas almacenadas en una base de datos.
Dado que el mecanismo y la política están separados, la política se puede modificar fácilmente para, por ejemplo, exigir el uso de un token de seguridad .
En un microkernel mínimo, solo se incluyen algunas políticas muy básicas, [ 32 ] y sus mecanismos permiten que lo que se ejecuta sobre el kernel (la parte restante del sistema operativo y las demás aplicaciones) decida qué políticas adoptar (como para la gestión de memoria , la planificación de procesos de alto nivel , la gestión del sistema de archivos , etc.). [ 5 ] [ 28 ] Un kernel monolítico, en cambio, tiende a incluir muchas políticas, lo que restringe al resto del sistema a depender de ellas.
El científico informático Per Brinch Hansen argumentó a favor de la separación de mecanismo y política. [ 5 ] [ 28 ] El fracaso en cumplir adecuadamente esta separación es una de las principales causas de la falta de innovación sustancial en los sistemas operativos existentes, [ 5 ] un problema común en la arquitectura de computadoras . [ 33 ] [ 34 ] [ 35 ] El diseño monolítico es inducido por el enfoque arquitectónico de "modo kernel"/"modo usuario" para la protección (técnicamente llamado dominios de protección jerárquicos ), que es común en los sistemas comerciales convencionales; [ 36 ] de hecho, cada módulo que necesita protección se incluye preferiblemente en el kernel. [ 36 ] Este vínculo entre el diseño monolítico y el "modo privilegiado" puede conducirse al problema clave de la separación mecanismo-política; [ 5 ] de hecho, el enfoque arquitectónico de "modo privilegiado" fusiona el mecanismo de protección con las políticas de seguridad, mientras que el principal enfoque arquitectónico alternativo, el direccionamiento basado en capacidades , distingue claramente entre los dos, lo que conduce naturalmente a un diseño de microkernel. [ 5 ]
Mientras que los núcleos monolíticos ejecutan todo su código en el mismo espacio de direcciones ( espacio del núcleo ), los micronúcleos intentan ejecutar la mayoría de sus servicios en el espacio de usuario, con el objetivo de mejorar la mantenibilidad y la modularidad de su base de código. [ 4 ] La mayoría de los núcleos no encajan exactamente en una de estas categorías, sino que se encuentran entre estos dos diseños. Estos se denominan núcleos híbridos . Existen diseños más exóticos, como los nanonúcleos y los exonúcleos , pero rara vez se utilizan en sistemas de producción. El hipervisor Xen , por ejemplo, es un exonúcleo.
núcleos monolíticos

En un núcleo monolítico, todos los servicios del sistema operativo forman parte del núcleo y se ejecutan en modo núcleo, residiendo así en la misma área de memoria. Este enfoque proporciona un acceso al hardware potente y eficiente. El desarrollador de UNIX, Ken Thompson, afirmó que, en su opinión, es más fácil implementar un núcleo monolítico. [ 37 ] Las principales desventajas de los núcleos monolíticos son las dependencias entre los componentes del sistema ( por ejemplo , un error en un controlador de dispositivo podría provocar el fallo de todo el sistema) y la dificultad de mantenimiento de núcleos grandes. Thompson también señaló que un núcleo monolítico puede convertirse rápidamente en un caos al modificarse. [ 37 ]
Los núcleos monolíticos, tradicionalmente utilizados por sistemas operativos tipo Unix , contienen todas las funciones principales del sistema operativo y los controladores de dispositivos . Un núcleo monolítico es un único programa que contiene todo el código necesario para realizar cualquier tarea relacionada con el núcleo. Cada componente al que un programa debe acceder y que no puede ubicarse en una biblioteca se encuentra en el espacio del núcleo, incluyendo controladores, planificadores , gestión de memoria , sistemas de archivos y pilas de red . Se proporcionan numerosas llamadas al sistema a las aplicaciones para que puedan acceder a todos estos servicios. Un núcleo monolítico, si bien inicialmente se carga con subsistemas que podrían no ser necesarios, puede optimizarse hasta alcanzar una velocidad igual o superior a la de un núcleo diseñado específicamente para el hardware, aunque resulta más relevante en un sentido general.
Los núcleos monolíticos modernos, como el núcleo de Linux , el núcleo de FreeBSD , el núcleo de AIX , el núcleo de HP-UX y el núcleo de Solaris , todos los cuales pertenecen a la categoría de sistemas operativos tipo Unix, admiten módulos de núcleo cargables , lo que permite cargar módulos en el núcleo en tiempo de ejecución, facilitando la ampliación de las capacidades del núcleo según sea necesario, al tiempo que ayuda a minimizar la cantidad de código que se ejecuta en el espacio del núcleo.
La mayor parte del trabajo en el núcleo monolítico se realiza mediante llamadas al sistema . Estas son interfaces, generalmente organizadas en una estructura tabular, que acceden a algún subsistema dentro del núcleo, como las operaciones de disco. Básicamente, las llamadas se realizan dentro de los programas y una copia verificada de la solicitud se pasa a través de la llamada al sistema. Por lo tanto, no hay que recorrer mucha distancia. El núcleo monolítico de Linux puede hacerse extremadamente pequeño no solo por su capacidad de cargar módulos dinámicamente, sino también por su facilidad de personalización. De hecho, existen algunas versiones lo suficientemente pequeñas como para caber junto con una gran cantidad de utilidades y otros programas en un solo disquete y aún así proporcionar un sistema operativo completamente funcional (una de las más populares es muLinux ). Esta capacidad de miniaturizar su núcleo también ha llevado a un rápido crecimiento en el uso de Linux en sistemas embebidos .
Este tipo de núcleos consta de las funciones principales del sistema operativo y los controladores de dispositivos, con la capacidad de cargar módulos en tiempo de ejecución. Proporcionan abstracciones ricas y potentes del hardware subyacente. Ofrecen un pequeño conjunto de abstracciones de hardware simples y utilizan aplicaciones llamadas servidores para proporcionar más funcionalidad. Este enfoque particular define una interfaz virtual de alto nivel sobre el hardware, con un conjunto de llamadas al sistema para implementar servicios del sistema operativo, como la gestión de procesos , la concurrencia y la gestión de memoria, en varios módulos que se ejecutan en modo supervisor. Este diseño tiene varias fallas y limitaciones:
- Programar en el kernel puede ser complicado, en parte porque no se pueden usar bibliotecas comunes (como una libc completa ) y porque se necesita un depurador a nivel de código fuente como gdb . A menudo es necesario reiniciar el equipo. Esto no es solo una cuestión de comodidad para los desarrolladores. Cuando la depuración es más difícil, y a medida que las dificultades aumentan, es más probable que el código contenga más errores.
- Los errores en una parte del núcleo tienen fuertes efectos secundarios; dado que cada función del núcleo tiene todos los privilegios, un error en una función puede corromper las estructuras de datos de otra parte del núcleo totalmente ajena, o de cualquier programa en ejecución.
- Los núcleos suelen volverse muy grandes y difíciles de mantener.
- Aunque los módulos que dan servicio a estas operaciones estén separados del conjunto, la integración del código es estrecha y difícil de realizar correctamente.
- Dado que los módulos se ejecutan en el mismo espacio de direcciones , un error puede provocar la caída de todo el sistema.

Micronúcleos
Microkernel (también abreviado μK o uK) es el término que describe un enfoque de diseño de sistemas operativos en el que la funcionalidad del sistema se traslada del "kernel" tradicional a un conjunto de "servidores" que se comunican a través de un kernel "mínimo", dejando lo mínimo posible en el "espacio del sistema" y lo máximo posible en el "espacio de usuario". Un microkernel diseñado para una plataforma o dispositivo específico solo tendrá lo necesario para su funcionamiento. El enfoque del microkernel consiste en definir una abstracción simple sobre el hardware, con un conjunto de primitivas o llamadas al sistema para implementar servicios mínimos del sistema operativo, como la gestión de memoria , la multitarea y la comunicación entre procesos . Otros servicios, incluidos los que normalmente proporciona el kernel, como la comunicación en red , se implementan en programas del espacio de usuario, denominados servidores . Los microkernels son más fáciles de mantener que los kernels monolíticos, pero la gran cantidad de llamadas al sistema y cambios de contexto puede ralentizar el sistema, ya que suelen generar más sobrecarga que las llamadas a funciones simples.
Solo las partes que realmente requieren estar en un modo privilegiado se encuentran en el espacio del kernel , como la comunicación entre procesos (IPC), un planificador básico o primitivas de planificación, la gestión básica de memoria y las primitivas básicas de E/S. Muchas partes críticas ahora se ejecutan en el espacio de usuario, incluyendo el planificador completo, la gestión de memoria, los sistemas de archivos y las pilas de red . Los microkernels se inventaron como reacción al diseño tradicional de kernel "monolítico", en el que toda la funcionalidad del sistema se colocaba en un programa estático que se ejecutaba en un modo "sistema" especial del procesador. En el microkernel, solo las tareas más fundamentales se realizan a este nivel, como poder acceder a parte (no necesariamente a todo) del hardware, gestionar la memoria y coordinar el paso de mensajes entre los procesos. Algunos sistemas que utilizan microkernels son QNX y GNU Hurd . En el caso de QNX y GNU Hurd, las sesiones de usuario pueden ser instantáneas completas del propio sistema, o "vistas", como se las denomina. La esencia misma de la arquitectura del microkernel ilustra algunas de sus ventajas:
- Más fácil de mantener
- Los parches se pueden probar en una instancia separada y luego intercambiarlos para que tomen el control de una instancia de producción.
- El desarrollo es rápido y el software nuevo se puede probar sin necesidad de reiniciar el núcleo.
- Mayor persistencia en general: si una instancia falla, a menudo es posible sustituirla por una réplica operativa.
La mayoría de los microkernels utilizan un sistema de paso de mensajes para gestionar las solicitudes entre servidores. Este sistema suele operar mediante puertos dentro del microkernel. Por ejemplo, si se solicita más memoria, se abre un puerto en el microkernel y se transmite la solicitud. Una vez dentro del microkernel, los pasos son similares a las llamadas al sistema. El objetivo era aportar modularidad a la arquitectura del sistema, lo que resultaría en un sistema más limpio, fácil de depurar o modificar dinámicamente, personalizable según las necesidades del usuario y con un mayor rendimiento. Los microkernels forman parte de sistemas operativos como GNU Hurd , MINIX , MkLinux , QNX y Redox OS .
Aunque los microkernels son muy pequeños por sí mismos, en combinación con todo el código auxiliar necesario, suelen ser más grandes que los kernels monolíticos. Los defensores de los kernels monolíticos también señalan que la estructura de dos niveles de los sistemas de microkernels, en la que la mayor parte del sistema operativo no interactúa directamente con el hardware, genera un coste considerable en términos de eficiencia del sistema. Este tipo de kernels normalmente solo proporciona los servicios mínimos, como la definición de espacios de direcciones de memoria , la comunicación entre procesos (IPC) y la gestión de procesos . Otras funciones, como la ejecución de procesos de hardware, no son gestionadas directamente por los microkernels. Los defensores de los microkernels señalan que los kernels monolíticos tienen la desventaja de que un error en el kernel puede provocar el fallo de todo el sistema. Sin embargo, con un microkernel, si un proceso del kernel falla, aún es posible evitar el fallo del sistema en su conjunto simplemente reiniciando el servicio que causó el error.
Otros servicios proporcionados por el núcleo, como la conectividad de red, se implementan en programas del espacio de usuario denominados servidores . Los servidores permiten modificar el sistema operativo simplemente iniciando y deteniendo programas. Por ejemplo, en una máquina sin conectividad de red, el servidor de red no se inicia. La necesidad de acceder al núcleo y transferir datos entre las distintas aplicaciones y servidores genera una sobrecarga que perjudica la eficiencia de los micronúcleos en comparación con los núcleos monolíticos.
Sin embargo, el microkernel presenta algunas desventajas. Algunas de ellas son:
- Mayor huella de memoria en ejecución
- Se requiere más software para la interfaz, por lo que existe la posibilidad de una pérdida de rendimiento.
- Los errores de mensajería pueden ser más difíciles de corregir debido al recorrido más largo que deben realizar, en comparación con la copia única en un núcleo monolítico.
- La gestión de procesos en general puede ser muy complicada.
Las desventajas de los microkernels dependen en gran medida del contexto. Por ejemplo, funcionan bien para sistemas pequeños, de propósito único (y críticos), ya que si no se necesitan ejecutar muchos procesos, las complicaciones de la gestión de procesos se reducen considerablemente.
Un microkernel permite implementar la parte restante del sistema operativo como programas que se ejecutan en modo usuario, y el uso de diferentes sistemas operativos sobre el mismo kernel sin modificar. También es posible alternar dinámicamente entre sistemas operativos y tener más de uno activo simultáneamente. [ 28 ]
Núcleos monolíticos frente a micronúcleos
A medida que crece el núcleo de la computadora, también crece el tamaño y la vulnerabilidad de su base de computación confiable , además de su huella de memoria . Esto se mitiga en cierta medida perfeccionando un sistema de memoria virtual , pero no todas las arquitecturas de computadoras tienen soporte para memoria virtual. [ f ] Para reducir la huella del núcleo, se debe realizar una edición extensa para eliminar cuidadosamente el código innecesario, lo cual puede ser muy difícil con interdependencias no obvias entre partes de un núcleo con millones de líneas de código.
A principios de la década de 1990, debido a las diversas deficiencias de los núcleos monolíticos frente a los micronúcleos, prácticamente todos los investigadores de sistemas operativos consideraban obsoletos los núcleos monolíticos. Como resultado, el diseño de Linux como un núcleo monolítico en lugar de un micronúcleo fue el tema de un famoso debate entre Linus Torvalds y Andrew Tanenbaum . [ 38 ] Ambos lados del argumento presentado en el debate Tanenbaum-Torvalds tienen su mérito .
Actuación
Los núcleos monolíticos están diseñados para tener todo su código en el mismo espacio de direcciones ( espacio del núcleo ), lo que algunos desarrolladores argumentan que es necesario para aumentar el rendimiento del sistema. [ 39 ] Algunos desarrolladores también sostienen que los sistemas monolíticos son extremadamente eficientes si están bien escritos. [ 39 ] El modelo monolítico tiende a ser más eficiente [ 40 ] mediante el uso de memoria compartida del núcleo, en lugar del sistema IPC más lento de los diseños de micronúcleos, que normalmente se basa en el paso de mensajes .
El rendimiento de los microkernels fue deficiente tanto en la década de 1980 como a principios de la de 1990. [ 41 ] [ 42 ] Los estudios que midieron empíricamente el rendimiento de estos microkernels no analizaron las razones de dicha ineficiencia. [ 41 ] Las explicaciones de estos datos se dejaron en manos del "folclore" , con la suposición de que se debían a la mayor frecuencia de cambios del "modo kernel" al "modo usuario", a la mayor frecuencia de comunicación entre procesos y a la mayor frecuencia de cambios de contexto . [ 41 ]
De hecho, como se intuyó en 1995, las razones del bajo rendimiento de los microkernels podrían haber sido: (1) una ineficiencia real del enfoque de microkernel en su conjunto , (2) los conceptos particulares implementados en esos microkernels y (3) la implementación particular de esos conceptos. Por lo tanto, quedaba por estudiar si la solución para construir un microkernel eficiente consistía, a diferencia de los intentos anteriores, en aplicar las técnicas de construcción correctas. [ 41 ]
Por otro lado, la arquitectura de dominios de protección jerárquica que lleva al diseño de un núcleo monolítico [ 36 ] tiene una desventaja de rendimiento significativa cada vez que hay una interacción entre diferentes niveles de protección (es decir, cuando un proceso tiene que manipular una estructura de datos tanto en "modo usuario" como en "modo supervisor"), ya que esto requiere la copia de mensajes por valor . [ 43 ]

Núcleos híbridos (o modulares)
Los núcleos híbridos se utilizan en algunos sistemas operativos comerciales, incluyendo la mayoría de las versiones de Microsoft Windows hasta la fecha ( NT 3.1 , NT 3.5 , NT 3.51 , NT 4.0 , 2000 , XP , Vista , 7 , 8 , 8.1 , 10 y 11 ). macOS de Apple utiliza un núcleo híbrido llamado XNU , que se basa en el código del núcleo Mach de OSF/1 (OSFMK 7.3) [ 44 ] y el núcleo monolítico de FreeBSD . Los núcleos híbridos son similares a los micronúcleos, excepto que incluyen código adicional en el espacio del núcleo para aumentar el rendimiento. Estos núcleos representan un compromiso que fue implementado por algunos desarrolladores para acomodar las principales ventajas tanto de los núcleos monolíticos como de los micronúcleos. Este tipo de núcleos son extensiones de los micronúcleos con algunas propiedades de los núcleos monolíticos. A diferencia de los núcleos monolíticos, este tipo de núcleos no pueden cargar módulos en tiempo de ejecución por sí mismos. Esto implica ejecutar algunos servicios (como la pila de red o el sistema de archivos ) en el espacio del kernel para reducir la sobrecarga de rendimiento de un microkernel tradicional, pero seguir ejecutando el código del kernel (como los controladores de dispositivos ) como servidores en el espacio de usuario.
Muchos núcleos tradicionalmente monolíticos admiten módulos de núcleo cargables . El más conocido de estos núcleos es el núcleo Linux . El núcleo modular esencialmente puede tener partes integradas en el binario del núcleo principal o binarios que se cargan en memoria bajo demanda. Un módulo con código contaminado puede desestabilizar un núcleo en ejecución. Por el contrario, es posible escribir un controlador para un micronúcleo en un espacio de memoria completamente separado y probarlo antes de su lanzamiento. Cuando se carga un módulo de núcleo, accede al espacio de memoria de la parte monolítica agregando lo que necesita, lo que abre la puerta a una posible contaminación. Algunas ventajas del núcleo modular (o híbrido) son:
- Tiempo de desarrollo más rápido para controladores que pueden operar desde módulos internos. No se requiere reiniciar para realizar pruebas (siempre que el kernel no esté desestabilizado).
- Capacidad bajo demanda frente a la necesidad de recompilar todo el núcleo para incorporar nuevos controladores o subsistemas.
- Integración más rápida de tecnología de terceros (relacionada con el desarrollo, pero pertinente en sí misma).
Los módulos, por lo general, se comunican con el núcleo mediante una interfaz de módulo. Esta interfaz es generalizada (aunque específica para cada sistema operativo), por lo que no siempre es posible usar módulos. A menudo, los controladores de dispositivos requieren mayor flexibilidad que la que ofrece la interfaz de módulo. En esencia, se trata de dos llamadas al sistema y, con frecuencia, las comprobaciones de seguridad que en el núcleo monolítico solo se realizan una vez ahora pueden requerir dos. Algunas de las desventajas del enfoque modular son:
- Con más interfaces por las que pasar, existe la posibilidad de que aumenten los errores (lo que implica más fallos de seguridad).
- El mantenimiento de los módulos puede resultar confuso para algunos administradores al lidiar con problemas como las diferencias de símbolos.
Nanonúcleos
Un nanokernel delega prácticamente todos los servicios , incluso los más básicos como los controladores de interrupciones o el temporizador , a los controladores de dispositivos para que el requisito de memoria del kernel sea aún menor que el de un microkernel tradicional. [ 45 ]
Exokernels
Los exokernels representan un enfoque aún experimental para el diseño de sistemas operativos. Se diferencian de otros tipos de kernels en que limitan su funcionalidad a la protección y multiplexación del acceso al hardware en bruto, sin proporcionar abstracciones de hardware sobre las cuales desarrollar aplicaciones. Esta separación entre la protección y la gestión del hardware permite a los desarrolladores de aplicaciones determinar la forma más eficiente de aprovechar el hardware disponible para cada programa específico.
Los exokernels son, en sí mismos, extremadamente pequeños. No obstante, vienen acompañados de sistemas operativos de biblioteca (véase también unikernel ), que proporcionan a los desarrolladores de aplicaciones las funcionalidades de un sistema operativo convencional. Una gran ventaja de los sistemas basados en exokernels es que pueden incorporar múltiples sistemas operativos de biblioteca, cada uno de los cuales exporta una API diferente ; por ejemplo, uno para el desarrollo de interfaces de usuario de alto nivel y otro para el control en tiempo real .
Multinúcleos
Un sistema operativo multikernel trata una máquina multinúcleo como una red de núcleos independientes, como si fuera un sistema distribuido . No asume memoria compartida, sino que implementa las comunicaciones entre procesos como paso de mensajes . [ 46 ] [ 47 ] Barrelfish fue el primer sistema operativo descrito como multikernel.
Historia del desarrollo del kernel
Núcleos de sistemas operativos antiguos
Estrictamente hablando, un sistema operativo (y, por lo tanto, un núcleo) no es necesario para que un ordenador funcione. Los programas pueden cargarse y ejecutarse directamente en la máquina "bare metal" , siempre que sus autores estén dispuestos a trabajar sin ninguna abstracción de hardware ni soporte de un sistema operativo. La mayoría de los primeros ordenadores funcionaban de esta manera durante las décadas de 1950 y principios de 1960, reiniciándose y recargándose entre la ejecución de diferentes programas. Con el tiempo, pequeños programas auxiliares, como cargadores de programas y depuradores, se dejaban en memoria entre ejecuciones o se cargaban desde la ROM . A medida que se desarrollaban, sentaron las bases de lo que se convertiría en los primeros núcleos de sistemas operativos. El enfoque "bare metal" todavía se utiliza hoy en día en algunas consolas de videojuegos y sistemas embebidos , [ 48 ] pero, en general, los ordenadores más modernos utilizan sistemas operativos y núcleos modernos.
En 1969, el sistema de multiprogramación RC 4000 introdujo la filosofía de diseño de sistemas de un pequeño núcleo "sobre el cual se podrían construir sistemas operativos para diferentes propósitos de manera ordenada", [ 49 ] lo que se denominaría el enfoque del microkernel.
Sistemas operativos de tiempo compartido
En la década anterior a Unix , las computadoras habían aumentado enormemente en potencia , hasta el punto de que los operadores buscaban nuevas formas de lograr que la gente utilizara su tiempo libre en sus máquinas. Uno de los principales avances durante esta época fue el tiempo compartido , mediante el cual varios usuarios obtenían pequeñas porciones de tiempo de computadora, a una velocidad tal que parecía que cada uno estaba conectado a su propia máquina, más lenta. [ 50 ]
El desarrollo de los sistemas de tiempo compartido generó varios problemas. Uno de ellos fue que los usuarios, especialmente en las universidades donde se desarrollaban estos sistemas, querían piratearlos para obtener más tiempo de CPU . Por esta razón, la seguridad y el control de acceso se convirtieron en un aspecto fundamental del proyecto Multics en 1965. [ 51 ] Otro problema persistente fue la gestión adecuada de los recursos informáticos: los usuarios pasaban la mayor parte del tiempo mirando la terminal y pensando en qué introducir en lugar de utilizar realmente los recursos del ordenador, y un sistema de tiempo compartido debería asignar el tiempo de CPU a un usuario activo durante estos periodos. Finalmente, los sistemas solían ofrecer una jerarquía de memoria de varias capas de profundidad, y la partición de este costoso recurso impulsó importantes avances en los sistemas de memoria virtual .
Amiga
El Commodore Amiga se lanzó en 1985 y fue uno de los primeros —y sin duda el más exitoso— ordenadores domésticos en incorporar una arquitectura de núcleo avanzada. El componente ejecutivo del núcleo de AmigaOS, exec.library , utiliza un diseño de paso de mensajes de micronúcleo, pero existen otros componentes del núcleo, como graphics.library , que tienen acceso directo al hardware. No hay protección de memoria y el núcleo casi siempre se ejecuta en modo usuario. Solo se ejecutan acciones especiales en modo núcleo, y las aplicaciones en modo usuario pueden solicitar al sistema operativo que ejecute su código en modo núcleo.
Unix

Durante la fase de diseño de Unix , los programadores decidieron modelar cada dispositivo de alto nivel como un archivo , porque creían que el propósito de la computación era la transformación de datos . [ 52 ]
Por ejemplo, las impresoras se representaban como un "archivo" en una ubicación conocida ; al copiar datos al archivo, se imprimían. Otros sistemas, para proporcionar una funcionalidad similar, tendían a virtualizar los dispositivos a un nivel inferior ; es decir, tanto los dispositivos como los archivos eran instancias de algún concepto de nivel inferior . La virtualización del sistema a nivel de archivo permitía a los usuarios manipular todo el sistema utilizando sus utilidades y conceptos de gestión de archivos existentes , simplificando enormemente el funcionamiento. Como extensión del mismo paradigma, Unix permite a los programadores manipular archivos mediante una serie de pequeños programas, utilizando el concepto de tuberías , lo que permitía a los usuarios completar operaciones por etapas, pasando un archivo a través de una cadena de herramientas específicas. Aunque el resultado final era el mismo, el uso de programas más pequeños de esta manera aumentaba drásticamente la flexibilidad, así como la facilidad de desarrollo y uso, permitiendo al usuario modificar su flujo de trabajo añadiendo o eliminando un programa de la cadena.
En el modelo Unix, el sistema operativo consta de dos partes: primero, la enorme colección de programas de utilidad que impulsan la mayoría de las operaciones; segundo, el núcleo que ejecuta los programas. [ 52 ] Bajo Unix, desde el punto de vista de la programación, la distinción entre los dos es bastante delgada; el núcleo es un programa, que se ejecuta en modo supervisor, [ g ] que actúa como un cargador de programas y supervisor para los pequeños programas de utilidad que componen el resto del sistema, y para proporcionar servicios de bloqueo y E/S para estos programas; más allá de eso, el núcleo no intervenía en absoluto en el espacio de usuario .
Con el paso de los años, el modelo informático cambió, y el tratamiento que Unix daba a todo como un archivo o flujo de bytes dejó de ser tan universalmente aplicable como antes. Si bien una terminal podía tratarse como un archivo o un flujo de bytes, que se imprimía o desde el que se leía, no parecía aplicarse lo mismo a una interfaz gráfica de usuario . Las redes plantearon otro problema. Aunque la comunicación en red puede compararse con el acceso a archivos, la arquitectura de bajo nivel orientada a paquetes manejaba fragmentos discretos de datos y no archivos completos. A medida que aumentaba la capacidad de los ordenadores, Unix se fue llenando cada vez más de código. Esto se debe también a que la modularidad del núcleo de Unix es altamente escalable. [ 53 ] Mientras que los núcleos podían tener 100 000 líneas de código en los años setenta y ochenta, núcleos como Linux , o sucesores modernos de Unix como GNU , tienen más de 13 millones de líneas. [ 54 ]
Los derivados modernos de Unix generalmente se basan en núcleos monolíticos de carga de módulos. Ejemplos de esto son el núcleo Linux en muchas distribuciones de GNU , IBM AIX , así como los núcleos variantes de Berkeley Software Distribution como FreeBSD , DragonFly BSD , OpenBSD , NetBSD y macOS . Además de estas alternativas, los desarrolladores aficionados mantienen una comunidad activa de desarrollo de sistemas operativos , poblada por núcleos de aficionados escritos por ellos mismos que en su mayoría terminan compartiendo muchas características con los núcleos Linux, FreeBSD, DragonflyBSD, OpenBSD o NetBSD y/o siendo compatibles con ellos. [ 55 ]
Mac OS clásico y macOS
Apple lanzó por primera vez su Mac OS clásico en 1984, incluido con su ordenador personal Macintosh . Apple pasó a un diseño de nanokernel en Mac OS 8.6. En contraste, el macOS moderno (originalmente llamado Mac OS X) se basa en Darwin , que utiliza un kernel híbrido llamado XNU , creado mediante la combinación del kernel 4.3BSD y el kernel Mach . [ 56 ]
Microsoft Windows
Microsoft Windows se lanzó por primera vez en 1985 como un complemento para MS-DOS . Debido a su dependencia de otro sistema operativo, las primeras versiones de Windows, anteriores a Windows 95, se consideraban un entorno operativo (que no debe confundirse con un sistema operativo ). Esta línea de productos continuó evolucionando durante las décadas de 1980 y 1990, con la incorporación de la serie Windows 9x de direccionamiento de 32 bits y multitarea preventiva; pero finalizó con el lanzamiento de Windows Me en el año 2000.
Microsoft también desarrolló Windows NT , un sistema operativo con una interfaz muy similar, pero destinado a usuarios profesionales y empresariales. Esta línea comenzó con el lanzamiento de Windows NT 3.1 en 1993 y se introdujo para el público general con el lanzamiento de Windows XP en octubre de 2001, reemplazando a Windows 9x con un sistema operativo completamente diferente y mucho más sofisticado. Esta es la línea que continúa con Windows 11 .
La arquitectura del núcleo de Windows NT se considera un núcleo híbrido porque el propio núcleo contiene tareas como el Administrador de ventanas y los Administradores IPC, con un modelo de subsistema en capas cliente/servidor. [ 57 ] Fue diseñado como un micronúcleo modificado , ya que el núcleo de Windows NT estuvo influenciado por el micronúcleo Mach , pero no cumple con todos los criterios de un micronúcleo puro.
Supervisor de IBM
Un programa supervisor o supervisor es un programa informático , generalmente parte de un sistema operativo , que controla la ejecución de otras rutinas y regula la planificación del trabajo , las operaciones de entrada/salida , las acciones de error y funciones similares, y regula el flujo de trabajo en un sistema de procesamiento de datos .
Históricamente, este término se asociaba principalmente con la línea de sistemas operativos para mainframes de IBM , comenzando con OS/360 . En otros sistemas operativos, el supervisor se suele denominar núcleo.
En CP-40 y CP-67 , IBM abstrajo aún más el estado del supervisor del hardware, lo que dio como resultado un hipervisor que permitía la virtualización completa , es decir, la capacidad de ejecutar múltiples sistemas operativos en la misma máquina de forma totalmente independiente entre sí.
En la década de 1970, IBM actualizó CP/CMS para el System/370 bajo el nombre de Virtual Machine Facility/370 (VM/370). Por lo tanto, el primer sistema de este tipo se denominó Virtual Machine o VM .
Desarrollo de micronúcleos
Aunque Mach , desarrollado por Richard Rashid en la Universidad Carnegie Mellon , es el microkernel de propósito general más conocido, se han desarrollado otros microkernels con objetivos más específicos. La familia de microkernels L4 (principalmente el L3 y el L4) se creó para demostrar que los microkernels no son necesariamente lentos. [ 58 ] Implementaciones más recientes, como Fiasco y Pistachio, pueden ejecutar Linux junto a otros procesos L4 en espacios de direcciones separados. [ 59 ] [ 60 ]
Además, QNX es un microkernel que se utiliza principalmente en sistemas embebidos , [ 61 ] y el software de código abierto MINIX , aunque fue creado originalmente con fines educativos, ahora se centra en ser un sistema operativo de microkernel altamente confiable y autorreparable .
Véase también
Notas
- ↑ Puede depender de la arquitectura del ordenador .
- ↑ También existe Derail (DRL), pero tiene un papel restringido.
- ↑ Por ejemplo, entrada en modo maestro [ 8 ] (MME) en la serie GE-600 , [ b ] llamada al supervisor [ 9 ] (SVC) en el IBM System/360 .
- ↑ Por ejemplo, Operación de usuario no implementada [ 10 ] (UUO) en el DEC PDP-10 .
- ↑ Algunas arquitecturas tienen un código de operación [ c ] o un bloque de códigos de operación [ d ] dedicados a generar una interrupción. Algunos sistemas operativos reutilizan una interrupción, por ejemplo, CP-67 y VM utilizan una interrupción de instrucción privilegiada de una instrucción Diagnose.
- ↑ El direccionamiento virtual se logra más comúnmente a través de una unidad de administración de memoria integrada.
- ↑ El nivel de privilegio más alto recibe diferentes nombres en distintas arquitecturas, como modo supervisor, modo kernel, CPL0, DPL0, anillo 0, etc. Consulte Anillo de protección para obtener más información.
Referencias
- 1 2 "Núcleo" . Linfo . Grupo de Usuarios de Linux de Bellevue. Archivado del original el 8 de diciembre de 2006. Recuperado el 15 de septiembre de 2016 .
- ↑ Randal E. Bryant; David R. O'Hallaron (2016). Sistemas informáticos: Una perspectiva del programador (Tercera ed.). Pearson. pág. 17. ISBN 978-0-13-409266-9.
- ↑ cf. Daemon (computación)
- 1 2 Roch 2004
- 1 2 3 4 5 6 7 Wulf 1974 págs. 337–345
- 1 2 Silberschatz 1991
- ↑ Tanenbaum, Andrew S. (2008). Sistemas operativos modernos (3.ª ed.). Prentice Hall. págs. 50–51 . ISBN 978-0-13-600663-3.
. . . casi todas las llamadas al sistema [son] invocadas desde programas C llamando a un procedimiento de biblioteca . . . El procedimiento de biblioteca . . . ejecuta una instrucción TRAP para cambiar del modo de usuario al modo kernel e iniciar la ejecución . . .
- ↑ "Operaciones varias" (PDF) . Manual de referencia de programación GE-625/635 (PDF) . Rev. abril de 1968. General Electric . Julio de 1964. pág. 132. CPB-1004F . Consultado el 7 de julio de 2026 .
- ↑ "Llamada del supervisor" (PDF) . Principios de funcionamiento del IBM System/360 (PDF) . Biblioteca de referencia de sistemas (octava ed.). IBM . Septiembre de 1968. pág. 74. A22-6821-7 . Consultado el 7 de julio de 2026 .
- ↑ "2.16 Operaciones no implementadas" (PDF) . DECsystem-10 - DECSYSTEM-20 - Manual de referencia del procesador - AA-H391A-TK, AM-4391A-T1 (PDF) . Junio de 1982. págs. 2-123 – 2-127 . AD-H391A . Consultado el 7 de julio de 2026 .
- ↑ Denning 1976
- ↑ Cita de Swift 2005, pág. 29: "aislamiento, control de recursos, verificación de decisiones (comprobación) y recuperación de errores".
- ↑ Schroeder 72
- 1 2 Linden 76
- ↑ Eranian, Stephane; Mosberger, David (2002). «Memoria virtual en el núcleo Linux IA-64» . Núcleo Linux IA-64: Diseño e implementación . Prentice Hall PTR. ISBN 978-0-13-061014-0.
- ↑ Silberschatz y Galvin, Conceptos de sistemas operativos, 4.ª ed., págs. 445 y 446
- ↑ Hoch, Charles; JC Browne (julio de 1980). "Una implementación de capacidades en el PDP-11/45" . ACM SIGOPS Operating Systems Review . 14 (3): 22– 32. doi : 10.1145/850697.850701 . S2CID 17487360 .
- 1 2 Schneider, Fred B.; Morrissett, Greg; Harper, Robert. "Un enfoque de seguridad basado en el lenguaje" (PDF) . Archivado (PDF) del original el 22 de diciembre de 2018.
- 1 2 3 Loscocco, PA; Smalley, SD; Muckelbauer, PA; Taylor, RC; Turner, SJ; Farrell, JF (octubre de 1998). "La inevitabilidad del fallo: la errónea suposición de seguridad en los entornos informáticos modernos" . Actas de la 21.ª Conferencia Nacional de Seguridad de Sistemas de Información . págs. 303-314 . Archivado del original el 21 de junio de 2007.
- ↑ Lepreau, Jay; Ford, Bryan; Hibler, Mike (1996). "La relevancia persistente del sistema operativo local para las aplicaciones globales". Actas del 7.º taller sobre ACM SIGOPS, Taller europeo de soporte de sistemas para aplicaciones mundiales - EW 7. págs. 133–140 . doi : 10.1145/504450.504477 . ISBN 978-1-4503-7339-5. S2CID 10027108 .
- ↑ Anderson, J. (octubre de 1972). Estudio de planificación de tecnología de seguridad informática (PDF) (Informe). Vol. II. División de Sistemas Electrónicos de la Fuerza Aérea. ESD-TR-73-51, Vol. II. Archivado (PDF) del original el 21 de julio de 2011.
- ↑ Jerry H. Saltzer; Mike D. Schroeder (septiembre de 1975). "La protección de la información en los sistemas informáticos" . Actas del IEEE . 63 (9): 1278– 1308. Bibcode : 1975IEEEP..63.1278S . CiteSeerX 10.1.1.126.9257 . doi : 10.1109/PROC.1975.9939 . S2CID 269166. Archivado del original el 8 de marzo de 2021. Consultado el 15 de julio de 2007 .
- ↑ "Aislamiento de núcleos de grano fino" . mars-research.github.io . Consultado el 15 de septiembre de 2022 .
- ↑ Fetzer, Mary. "El aislamiento automático de controladores de dispositivos protege contra errores en los sistemas operativos" . Universidad Estatal de Pensilvania a través de techxplore.com . Consultado el 15 de septiembre de 2022 .
- ↑ Huang, Yongzhe; Narayanan, Vikram; Detweiler, David; Huang, Kaiming; Tan, Gang; Jaeger, Trent; Burtsev, Anton (2022). "KSplit: Automatización del aislamiento de controladores de dispositivos" (PDF) . Recuperado el 20 de diciembre de 2023 .
- ↑ Jonathan S. Shapiro; Jonathan M. Smith; David J. Farber (1999). "EROS". ACM SIGOPS Operating Systems Review . 33 (5): 170– 185. doi : 10.1145/319344.319163 .
- ↑ Dijkstra, EW (septiembre de 1965). "Procesos secuenciales cooperativos" (PDF) . En F. Genuys (ed.). Lenguajes de programación: Instituto de Estudios Avanzados de la OTAN: conferencias impartidas en una escuela de verano de tres semanas celebrada en Villard-le-Lans, 1966. Academic Press Inc., Departamento de Matemáticas, Universidad Tecnológica de Eindhoven. págs. 43-112 .
- 1 2 3 4 5 Brinch Hansen 70 págs. 238-241
- ↑ Harrison, MC; Schwartz, JT (1967). "SHARER, un sistema de tiempo compartido para el CDC 6600" . Communications of the ACM . 10 (10): 659– 665. doi : 10.1145/363717.363778 . S2CID 14550794 .
- ↑ Huxtable, DHR; Warwick, MT (1967). "Supervisores dinámicos: su diseño y construcción". Actas del simposio de la ACM sobre principios de sistemas operativos - SOSP '67 . págs. 11.1 – 11.17 . doi : 10.1145/800001.811675 . ISBN 978-1-4503-7370-8. S2CID 17709902 .
- ↑ Baiardi 1988
- 1 2 Levin 75
- ↑ Denning 1980
- ↑ Nehmer, Jürgen (1991). «La inmortalidad de los sistemas operativos, o: ¿Sigue estando justificada la investigación en sistemas operativos?» . Lecture Notes In Computer Science; Vol. 563. Actas del Taller Internacional sobre Sistemas Operativos de los 90 y posteriores . pp. 77–83 . doi : 10.1007/BFb0024528 . ISBN 3-540-54987-0.
Los últimos 25 años han demostrado que la investigación sobre la arquitectura de los sistemas operativos tuvo un efecto menor en los sistemas principales existentes [ sic ] .
- ↑ Cita de Levy 84, pág. 1: "Aunque la complejidad de las aplicaciones informáticas aumenta anualmente, la arquitectura de hardware subyacente para las aplicaciones se ha mantenido sin cambios durante décadas."
- 1 2 3 Levy 84, p.1 cita: "Las arquitecturas convencionales admiten un único modo de operación privilegiado. Esta estructura conduce a un diseño monolítico; cualquier módulo que necesite protección debe formar parte del núcleo del sistema operativo. Si, en cambio, cualquier módulo pudiera ejecutarse dentro de un dominio protegido, los sistemas podrían construirse como una colección de módulos independientes extensibles por cualquier usuario."
- 1 2 "Código abierto: Voces de la revolución del código abierto" . 1-56592-582-3 . 29 de marzo de 1999. Archivado del original el 1 de febrero de 2020. Recuperado el 24 de marzo de 2019 .
- ↑ Las grabaciones del debate entre Torvalds y Tanenbaum se pueden encontrar en dina.dk. Archivado el 3 de octubre de 2012 en Wayback Machine , groups.google.com. Archivado el 26 de mayo de 2013 en Wayback Machine , oreilly.com. Archivado el 21 de septiembre de 2014 en Wayback Machine y en el sitio web de Andrew Tanenbaum. Archivado el 5 de agosto de 2015 en Wayback Machine.
- 1 2 Matthew Russell. "Qué es Darwin (y cómo impulsa Mac OS X)" . O'Reilly Media . Archivado del original el 8 de diciembre de 2007. Recuperado el 9 de diciembre de 2008. La
naturaleza estrechamente acoplada de un núcleo monolítico le permite hacer un uso muy eficiente del hardware subyacente [...] Los micronúcleos, por otro lado, ejecutan muchos más procesos centrales en el espacio de usuario. [...] Desafortunadamente, estos beneficios vienen a costa de que el micronúcleo tenga que pasar mucha información dentro y fuera del espacio del núcleo a través de un proceso conocido como cambio de contexto. Los cambios de contexto introducen una sobrecarga considerable y, por lo tanto, resultan en una penalización de rendimiento.
- ↑ "Sistemas operativos/Modelos de núcleo - Wikiversidad" . en.wikiversity.org . Archivado del original el 18 de diciembre de 2014. Consultado el 18 de diciembre de 2014 .
- 1 2 3 4 Liedtke 95
- ↑ Duro 97
- ↑ Hansen 73, sección 7.3 p.233 " Las interacciones entre diferentes niveles de protección requieren la transmisión de mensajes por valor "
- ↑ Magee, Jim. Sesión 106 de la WWDC 2000: Mac OS X: Núcleo . Minuto 14. Archivado del original el 30 de octubre de 2021.
- ↑ "Arquitectura del nanokernel KeyKOS" . Archivado del original el 21 de junio de 2011.
- ↑ Baumann, Andrew; Barham, Paul; Dagand, Pierre-Evariste; Harris, Tim; Isaacs, Rebecca; Peter, Simon; Roscoe, Timothy; Schüpbach, Adrian; Singhania, Akhilesh (2009). El multikernel: una nueva arquitectura de sistema operativo para sistemas multinúcleo escalables (PDF) . 22º Simposio sobre Principios de Sistemas Operativos.
- ↑ "El sistema operativo Barrelfish" .
- ↑ Ball: Diseños de microprocesadores integrados, pág. 129
- ^ Hansen 2001 (os), págs.17-18
- ↑ "Versión BSTJ del artículo de C.ACM Unix" . bell-labs.com . Archivado del original el 30/12/2005 . Consultado el 17/08/2006 .
- ↑ Corbató, FJ ; Vissotsky, VA Introducción y descripción general del sistema Multics . Conferencia conjunta de computación de otoño de 1965. Archivado del original el 9 de julio de 2011.
- 1 2 "La especificación única de Unix" . The Open Group . Archivado del original el 4 de octubre de 2016. Recuperado el 29 de septiembre de 2016 .
- ↑ "La venganza de Unix" . asymco.com . 29 de septiembre de 2010. Archivado del original el 9 de noviembre de 2010. Consultado el 2 de octubre de 2010 .
- ↑ Wheeler, David A. (12 de octubre de 2004). "Núcleo de Linux 2.6: ¡Vale más!" .
- ↑ Esta comunidad se reúne principalmente en Bona Fide OS Development (archivado el 17/01/2022 en Wayback Machine) , The Mega-Tokyo Message Board (archivado el 25/01/2022 en Wayback Machine) y otros sitios web de entusiastas de los sistemas operativos.
- ↑ Singh, Amit (diciembre de 2003). "XNU: El núcleo" . Archivado del original el 12 de agosto de 2011.
- ↑ "Windows - Sitio oficial de Microsoft Windows 10 Home & Pro OS, portátiles, PC, tabletas y más" . windows.com . Archivado del original el 20 de agosto de 2011. Consultado el 24 de marzo de 2019 .
- ↑ "La familia de microkernels L4 - Descripción general" . os.inf.tu-dresden.de . Archivado del original el 21 de agosto de 2006. Consultado el 11 de agosto de 2006 .
- ↑ "El microkernel Fiasco - Descripción general" . os.inf.tu-dresden.de . Archivado del original el 16 de junio de 2006. Consultado el 10 de julio de 2006 .
- ↑ Zoller (inactivo), Heinz (7 de diciembre de 2013). "L4Ka - Proyecto L4Ka" . www.l4ka.org . Archivado del original el 19 de abril de 2001. Recuperado el 24 de marzo de 2019 .
- ↑ "Sistemas Operativos QNX" . blackberry.qnx.com . Archivado del original el 24 de marzo de 2019. Consultado el 24 de marzo de 2019 .
Fuentes
- Roch, Benjamin (2004). "Núcleo monolítico vs. micronúcleo" (PDF) . Archivado del original (PDF) el 1 de noviembre de 2006. Recuperado el 12 de octubre de 2006 .
- Silberschatz, Abraham ; James L. Peterson; Peter B. Galvin (1991). Conceptos de sistemas operativos . Boston, Massachusetts : Addison-Wesley. pág. 696. ISBN 978-0-201-51379-0.
- Ball, Stuart R. (2002) [2002]. Sistemas de microprocesadores embebidos: Diseños del mundo real (primera ed.). Elsevier Science. ISBN 978-0-7506-7534-5.
- Deitel, Harvey M. (1984) [1982]. Introducción a los sistemas operativos (primera edición revisada ). Addison-Wesley. pág . 673. ISBN 978-0-201-14502-1.
- Denning, Peter J. (diciembre de 1976). "Sistemas operativos tolerantes a fallos". ACM Computing Surveys . 8 (4): 359– 389. doi : 10.1145/356678.356680 . ISSN 0360-0300 . S2CID 207736773 .
- Denning, Peter J. (abril de 1980). "¿Por qué no innovaciones en la arquitectura de computadoras?" . ACM SIGARCH Computer Architecture News . 8 (2): 4– 7. doi : 10.1145/859504.859506 . ISSN 0163-5964 . S2CID 14065743 .
- Hansen, Per Brinch (abril de 1970). "El núcleo de un sistema de multiprogramación". Communications of the ACM . 13 (4): 238– 241. CiteSeerX 10.1.1.105.4204 . doi : 10.1145/362258.362278 . ISSN 0001-0782 . S2CID 9414037 .
- Hansen, Per Brinch (1973). Principios de los sistemas operativos . Englewood Cliffs : Prentice Hall. pág . 496. ISBN 978-0-13-637843-3.
- Hansen, Per Brinch (2001). "La evolución de los sistemas operativos" (PDF) . Archivado (PDF) del original el 25 de julio de 2011. Recuperado el 24 de octubre de 2006 .Incluido en el libro: Per Brinch Hansen, ed. (2001). "1 La evolución de los sistemas operativos". Sistemas operativos clásicos: del procesamiento por lotes a los sistemas distribuidos . Nueva York: Springer-Verlag. págs. 1–36 . ISBN 978-0-387-95113-3.
- Härtig, Hermann; Hohmuth, Michael; Liedtke, Jochen ; Schönberg, Sebastian; Wolter, Jean (5-8 de octubre de 1997). «El rendimiento de los sistemas basados en micro-núcleos» . Actas del decimosexto simposio de la ACM sobre principios de sistemas operativos - SOSP '97 . 16.º Simposio de la ACM sobre principios de sistemas operativos (SOSP'97). Saint-Malo, Francia. doi : 10.1145/268998.266660 . ISBN 978-0-89791-916-6. S2CID 1706253 . Archivado del original el 17-02-2020. , Härtig, Hermann; Hohmuth, Michael; Liedtke, Jochen; Schönberg, Sebastián (diciembre de 1997). "El rendimiento de los sistemas basados en μ-kernel" . Revisión de los sistemas operativos ACM SIGOPS . 31 (5): 66– 77. doi : 10.1145/269005.266660 .
- Houdek, ME; Soltis, FG ; Hoffman, RL (1981). "Soporte de IBM System/38 para direccionamiento basado en capacidades" . Actas del 8.º Simposio Internacional de Arquitectura de Computadoras de la ACM . ACM/IEEE. págs. 341–348 .
- Manual del desarrollador de software de la arquitectura IA-32, Volumen 1: Arquitectura básica (PDF) . Intel Corporation . 2002.
- Levin, R.; Cohen, E.; Corwin, W.; Pollack, F.; Wulf, William (1975). "Separación de política/mecanismo en Hydra" . ACM SIGOPS Operating Systems Review . 9 (5): 132– 140. doi : 10.1145/1067629.806531 .
- Levy, Henry M. (1984). Sistemas informáticos basados en capacidades . Maynard, Mass: Digital Press. ISBN 978-0-932376-22-0Archivado del original el 13 de julio de 2007. Consultado el 18 de julio de 2007 .
- Liedtke, Jochen (diciembre de 1995). "Sobre la construcción del microkernel" . Actas del 15.º Simposio ACM sobre Principios de Sistemas Operativos (SOSP) . Archivado del original el 13 de marzo de 2007.
- Linden, Theodore A. (diciembre de 1976). "Estructuras de sistemas operativos para respaldar la seguridad y el software confiable". ACM Computing Surveys . 8 (4): 409– 445. doi : 10.1145/356678.356682 . hdl : 2027/mdp.39015086560037 . ISSN 0360-0300 . S2CID 16720589 . , "Estructuras de sistemas operativos para respaldar la seguridad y el software confiable" (PDF) . Consultado el 20 de diciembre de 2023 .
- Lorin, Harold (1981). Sistemas operativos . Boston, Massachusetts : Addison-Wesley. pp. 161–186 . ISBN 978-0-201-14464-2.
- Schroeder, Michael D .; Jerome H. Saltzer (marzo de 1972). "Una arquitectura de hardware para implementar anillos de protección". Communications of the ACM . 15 (3): 157– 170. CiteSeerX 10.1.1.83.8304 . doi : 10.1145/361268.361275 . ISSN 0001-0782 . S2CID 14422402 .
- Shaw, Alan C. (1974). El diseño lógico de los sistemas operativos . Prentice-Hall. pág . 304. ISBN 978-0-13-540112-5.
- Tanenbaum, Andrew S. (1979). Organización estructurada de computadoras . Englewood Cliffs, Nueva Jersey : Prentice-Hall. ISBN 978-0-13-148521-1.
- Wulf, W.; E. Cohen; W. Corwin; A. Jones; R. Levin; C. Pierson; F. Pollack (junio de 1974). "HYDRA: el núcleo de un sistema operativo multiprocesador" (PDF) . Communications of the ACM . 17 (6): 337–345 . doi : 10.1145/355616.364017 . ISSN 0001-0782 . S2CID 8011765. Archivado del original (PDF) el 26 de septiembre de 2007. Recuperado el 18 de julio de 2007 .
- Baiardi, F.; A. Tomasi; M. Vanneschi (1988). Architettura dei Sistemi di Elaborazione, volumen 1 (en italiano). Franco Angeli. ISBN 978-88-204-2746-7Archivado del original el 27/06/2012 . Consultado el 10/10/2006 .
- Swift, Michael M.; Brian N. Bershad; Henry M. Levy. Mejora de la fiabilidad de los sistemas operativos comerciales (PDF) . Archivado (PDF) del original el 19 de julio de 2007. Consultado el 16 de julio de 2007 .
- Gettys, James; Karlton, Philip L.; McGregor, Scott (1990). "El sistema de ventanas X, versión 11". Software: Practice and Experience . 20 : S35– S67. doi : 10.1002/spe.4380201404 . S2CID 26329062 .
- Michael M. Swift; Brian N. Bershad; Henry M. Levy (febrero de 2005). "Mejora de la fiabilidad de los sistemas operativos comerciales". ACM Transactions on Computer Systems . 23 (1). Association for Computing Machinery: 77– 110. doi : 10.1145/1047915.1047919 . eISSN 1557-7333 . ISSN 0734-2071 . S2CID 208013080 .
Lecturas adicionales
- Andrew S. Tanenbaum , Albert S. Woodhull, Sistemas operativos: diseño e implementación (tercera edición) ;
- Andrew S. Tanenbaum, Herbert Bos, Sistemas Operativos Modernos (Cuarta edición) ;
- Daniel P. Bovet, Marco Cesati, Comprensión del núcleo Linux (Tercera edición) ;
- David A. Patterson , John L. Hennessy , Organización y diseño de computadoras (Sexta edición) , Morgan Kaufmann ( ISBN) 978-0-12-820109-1) ;
- BS Chalk, AT Carter, RW Hind, Organización y arquitectura de computadoras: una introducción (segunda edición) , Palgrave Macmillan ( ISBN) 978-1-4039-0164-4).
Enlaces externos
- Comparación de núcleos: Linux (2.6.22) frente a Windows (Vista) en Wayback Machine (archivado el 14/09/2008)
- El sistema operativo Barrelfish
- núcleos de sistemas operativos
- Sistemas operativos