# Kernels

> En informática, un kernel es la parte fundamental de un sistema operativo que actúa como puente entre el hardware y el software de un ordenador. Es el primer programa que se carga al encender el equipo y se encarga de gestionar los recursos del sistema, como la memoria, los procesos y los dispositivos.&#x20;

<mark style="background-color:blue;">**para entenderlo mas fácil, mira el kernel como el núcleo del sistema operativo que realiza todas las acciones importantes en el sistema operativo, como el núcleo de la tierra**</mark>

## **Tipos de kernels:**

* ***Monolithic Kernel:*****&#x20;Un núcleo monolítico es una arquitectura de sistema operativo donde todo el sistema operativo se ejecuta en el espacio del núcleo, en un solo programa grande, y se comunica directamente con el hardware.**\
  \
  &#x20;Todo el código del sistema operativo se compila y ejecuta como una sola entidad. La modificación o actualización de un kernel monolítico puede ser más compleja, ya que cualquier cambio requiere recompilar y reiniciar todo el sistema, Si una parte del kernel monolítico falla, puede causar problemas en todo el sistema. \
  Los sistemas operativos que utilizan kernels monolíticos son por ejemplo: Linux, BSD, Unix, MS-DOS, Algunas versiones de Solaris. \
  \&#xNAN;*En resumen: todo el núcleo (gestión de memoria, archivos, procesos, etc.) se ejecuta junto en un solo espacio. Esto hace que sea rápido y eficiente, pero puede volverse inestable si un módulo falla.*
* ***Microkernel:*****&#x20;Un microkernel es un núcleo de sistema operativo mínimo que proporciona servicios esenciales como la gestión de memoria, la comunicación entre procesos y la gestión de hilos.**\
  \
  &#x20;A diferencia de los núcleos monolíticos, que incluyen una gran cantidad de funciones dentro del kernel, un microkernel delega muchas tareas a procesos de espacio de usuario, lo que puede resultar en mayor modularidad, seguridad y flexibilidad.\
  &#x20;*en resumen : En lugar de hacerlo todo, este tipo de kernel se limita a lo básico: comunicación entre procesos y gestión de hardware. El resto de funciones se ejecutan como procesos independientes fuera del núcleo.*
* ***Hybrid Kernel:*****&#x20;Un núcleo híbrido es un tipo de arquitectura de sistema operativo que combina elementos de los núcleos monolíticos y los micronúcleos para lograr un equilibrio entre rendimiento y modularidad**. \
  \
  Windows NT, macOS e iOS son ejemplos conocidos de sistemas operativos con núcleo híbrido, A menudo, los kernels híbridos comienzan como kernels monolíticos y luego se van modificando para mover ciertas funciones fuera del núcleo. \
  \&#xNAN;*en resumen: un punto medio entre monolítico y microkernel. Se ejecuta como un kernel monolítico, pero divide algunas funciones fuera del núcleo*
* ***Nano Kernel:*** **Un nanokernel es una versión mínima de un núcleo del sistema operativo, incluso más pequeña que un micronúcleo, que se enfoca en proporcionar las funcionalidades más esenciales para la operación del sistema.** \
  \
  Se caracteriza por su tamaño reducido, eficiencia y enfoque en la abstracción del hardware, Los nanokernels están diseñados para ser muy pequeños, lo que les permite ser eficientes y consumir pocos recursos: Se limitan a tareas esenciales como el cambio de contexto, la gestión de interrupciones y la abstracción del hardware. \
  \
  Se pueden considerar como un subsistema modular que encapsula el hardware y presenta una arquitectura de máquina idealizada al resto del sistema.&#x20;
* ***Exo Kernel:*** Un exokernel **es un tipo de arquitectura de sistema operativo que busca minimizar el núcleo del sistema operativo, exponiendo los recursos de hardware directamente a las aplicaciones. Esto permite a las aplicaciones tener un mayor control sobre cómo se utilizan los recursos, pero también requiere que ellas mismas gestionen la protección y la gestión de esos recursos.** \
  En esencia, el exokernel proporciona una capa delgada que permite a las aplicaciones interactuar con el hardware de forma más directa y personalizada, en lugar de depender de las abstracciones del núcleo tradicional. El concepto clave detrás de los exokernels es la separación entre la gestión de recursos y la protección. \
  \
  En sistemas operativos tradicionales, el núcleo se encarga de gestionar los recursos (como memoria, CPU, dispositivos de entrada/salida) y también de protegerlos, evitando que las aplicaciones accedan a recursos que no les corresponden. Un exokernel, en cambio, delega la protección a las aplicaciones, permitiéndoles gestionar sus propios recursos y decidir cómo protegerlos, Al permitir que las aplicaciones tengan un mayor control sobre los recursos, los exokernels pueden ofrecer un mayor rendimiento y flexibilidad, especialmente en aplicaciones que requieren un acceso muy específico al hardware. \
  Los exokernels son especialmente adecuados para aplicaciones que requieren un control preciso sobre los recursos del sistema, como sistemas embebidos o sistemas de tiempo real. \
  \
  \&#xNAN;*en resumen: en lugar de gestionar directamente los recursos del sistema, el exokernel deja esa tarea a las aplicaciones, dándoles control casi total. Así se evita la sobrecarga del sistema operativo.*

## Trabajo del kernel

### Gestión de procesos

<mark style="background-color:blue;">**La Gestión de Procesos en los Sistemas Operativos se refiere a la regulación y supervisión de múltiples procesos llevados a cabo por el sistema.**</mark> Esto implica la:

* &#x20;<mark style="background-color:red;">Creación de procesos y subprocesos</mark>
* <mark style="background-color:red;">Programación de procesos y subprocesos</mark>
* <mark style="background-color:red;">Finalización/eliminación de procesos y subprocesos</mark>
* <mark style="background-color:red;">Sincronización de los procesos dentro del sistema</mark>
* <mark style="background-color:red;">reanudación de procesos y subprocesos</mark>
* <mark style="background-color:red;">suspensión de procesos y subprocesos</mark>
* <mark style="background-color:red;">Asignación de PID (Proccess ID) unicos</mark>
* <mark style="background-color:red;">Control de hilos (threads)</mark>
* <mark style="background-color:red;">Comunicación entre procesos (IPC)</mark>
* <mark style="background-color:red;">Manejo de estados del proceso: running, waiting, sleeping, zombie, etc.</mark>

{% hint style="info" %}
**el PID (proccess ID) es un valor único que se le asigna a los procesos de un sistema operativo**
{% endhint %}

{% hint style="info" %}
**IPC: Comunicación Entre Procesos (Inter-Process Communication). Se refiere a los mecanismos que permiten a diferentes procesos o aplicaciones dentro de un sistema informático comunicarse y compartir datos entre sí.**
{% endhint %}

### Planificación de procesos (scheduler)

* <mark style="background-color:blue;">**Un planificador de procesos (process scheduler) es un componente de un sistema operativo que se encarga de decidir qué procesos se ejecutan en el procesador y cuándo, asegurando un uso eficiente de los recursos y un equilibrio entre las diferentes tareas.**</mark> En esencia, es el mecanismo que gestiona la ejecución de múltiples procesos en un sistema, determinando cuál proceso obtiene el acceso a la CPU y por cuánto tiempo.&#x20;

*algoritmos de planificacion (Estos algoritmos buscan equilibrar objetivos en competencia, como maximizar el uso de la CPU, minimizar los tiempos de respuesta y garantizar la equidad entre los procesos.):*

* ***Round Robin:*****&#x20;round robin (o "ida y vuelta" en español) es un algoritmo de planificación que asigna recursos de forma equitativa y cíclica entre diferentes procesos o tareas.** Se utiliza en sistemas operativos, redes y otras áreas para asegurar que todos los participantes reciban una parte justa del recurso compartido, como el tiempo de CPU o el ancho de banda.&#x20;
* ***FIFO (First In, First Out):*** FIFO (Primero en Entrar, Primero en Salir), **es un método de organización y gestión de datos donde los elementos se procesan o acceden en el mismo orden en que fueron agregados.** Es un concepto fundamental en estructuras de datos, sistemas operativos, redes y programación en general. **FIFO opera como una cola, donde el primer elemento en entrar es el primero en salir, similar a una fila de personas esperando su turno.**&#x20;
* ***SJF (Shortest Job First):*****&#x20;SJF (Primero el Trabajo Más Corto), es un algoritmo de planificación de procesos en sistemas operativos en donde el proceso con el tiempo de ejecución más corto se selecciona para ejecutarse primero**, lo que minimiza el tiempo de espera promedio. En su forma básica, SJF no es expropiativo, lo que significa que una vez que un proceso comienza a ejecutarse, continúa hasta que se completa, incluso si llega un proceso más corto.
* ***SRFT (Shortest Remaining Time First):*****&#x20;Existe una variante de SJF llamada "Shortest Remaining Time First" (SRTF) que sí es expropiativa.** En SRTF, si llega un proceso con un tiempo de ejecución más corto que el tiempo restante del proceso que se está ejecutando actualmente, el proceso actual se interrumpe y el nuevo proceso más corto comienza a ejecutarse, lo que lo hace Expropiativo comparado a SJF
* ***Multilevel Queue:*****&#x20;En la programación de sistemas operativos, una cola multinivel (Multilevel Queue, MLQ) es una técnica que divide la cola de procesos listos en múltiples colas separadas, cada una con su propia política de programación.** Los procesos se asignan permanentemente a una cola específica basándose en características como la prioridad, el tipo de proceso o los recursos que requieren. **Cada cola puede usar un algoritmo de programación diferente.** Por ejemplo, una cola de alta prioridad para procesos interactivos puede usar round-robin, mientras que una cola de baja prioridad para procesos por lotes podría usar FIFO (First-In, First-Out), **Los procesos se asignan a una cola específica en función de sus características y no cambian de cola durante su ejecución.**
* ***CFS (Completely Fair Scheduler):*****&#x20;El Planificador Completamente Justo (CFS) es el algoritmo de planificación predeterminado en el núcleo de Linux, diseñado para asignar el tiempo de CPU de manera equitativa entre los procesos.** En esencia, CFS busca dar a cada proceso una "proporción justa" del tiempo de CPU, en lugar de dar a todos los procesos la misma cantidad de tiempo de CPU,&#x20;

  CFS utiliza un concepto llamado "tiempo virtual" o "virtual runtime" para cada proceso. Este valor representa cuánto tiempo de CPU ha usado un proceso, ajustado por su prioridad o "nice value", \
  \
  **Los procesos se organizan en un árbol rojo-negro ordenado por su tiempo virtual. Las tareas con menor tiempo virtual están más a la izquierda en el árbol y, por lo tanto, son las que tienen más probabilidad de ser seleccionadas para ejecutarse.** Cuando el planificador necesita elegir la siguiente tarea para ejecutar, selecciona la tarea que se encuentra más a la izquierda del árbol (la que tiene menor tiempo virtual), Una vez que una tarea ha terminado de ejecutarse o ha alcanzado su tiempo asignado, su tiempo virtual se incrementa, y se vuelve a insertar en el árbol en la posición correcta según su nuevo valor. **Al mantener el árbol ordenado y seleccionar la tarea con menor tiempo virtual, CFS asegura que las tareas con menos tiempo de CPU usado tengan más oportunidades de ejecutarse.**

### Gestión de interrupciones

* <mark style="background-color:blue;">**En informática, la gestión de interrupciones se refiere al proceso que permite a un sistema responder a eventos asíncronos, como señales del hardware o errores del software, interrumpiendo temporalmente la ejecución normal de un programa para atender la solicitud.**</mark> Este mecanismo permite al procesador cambiar su flujo de ejecución para manejar el evento y luego regresar a la tarea interrumpida.&#x20;

{% hint style="info" %}
Asíncrono: significa que algo no ocurre al mismo tiempo o de manera simultánea con otro evento o proceso.
{% endhint %}

<mark style="background-color:blue;">**El kernel detiene temporalmente el proceso actual, guarda su contexto, ejecuta el manejador de la interrupción y luego reanuda la ejecución del proceso original. Cuando esta interrupción se genera el núcleo busca la dirección del manejador de interrupción (ISR) asociado con la señal recibida.**</mark>

Una vez que el ISR ha terminado, el contexto guardado previamente se restaura, y el programa interrumpido continúa su ejecución desde donde se quedó.

**El kernel utiliza controladores de interrupciones (IC) para gestionar las interrupciones de hardware. Cada controlador está asociado con un dispositivo específico y maneja las interrupciones generadas por ese dispositivo.** En este caso estamos enfocandonos en ICs de sistema operativo (ISR)

***Funciones relacionadas al (IC):***&#x20;

* `disabled_irq()`, `disabled_irq_nosync()` y `enable_irq()`: Estas funciones se utilizan para deshabilitar o habilitar interrupciones a nivel del controlador de interrupciones, aunque no se recomienda deshabilitar interrupciones de forma generalizada, ya que puede afectar el rendimiento del sistema.&#x20;
* `IRQ`: Un número IRQ es un identificador único que se utiliza para referenciar una fuente de interrupción de hardware específica en el kernel, como una entrada en una tabla de interrupciones.&#x20;

**El kernel gestiona las interrupciones según su prioridad. Por ejemplo, las interrupciones de errores de máquina suelen tener mayor prioridad que las interrupciones de red o teclado.**\
**Los programas de usuario se ejecutan en modo de usuario, mientras que el código del kernel se ejecuta en modo kernel. Las interrupciones hacen que el procesador cambie entre estos dos modos.**&#x20;

### Tipos de Controladores de interrupciones:

* **Controlador de Interrupciones Programable (PIC):** Es un componente de hardware que se encarga de gestionar múltiples fuentes de interrupción y priorizarlas.&#x20;
* **Controlador de Interrupciones del sistema operativo:** El sistema operativo utiliza rutinas de servicio de interrupción (ISR) para manejar las interrupciones.&#x20;

{% hint style="info" %}
**ISR significa Rutina de Servicio de Interrupción (Interrupt Service Routine en inglés). Es una función o subrutina que se ejecuta cuando un evento externo o interno, conocido como interrupción, solicita atención del procesador**. El ISR se encarga de atender la interrupción específica que lo invocó, realizando las acciones necesarias para procesar el evento. \
\
El ISR realiza las acciones necesarias para atender la interrupción, como leer datos de un dispositivo, enviar una señal, etc. **Una vez que el ISR ha terminado, el procesador restaura el estado guardado y continúa con la tarea que estaba realizando antes de la interrupción.**&#x20;
{% endhint %}

### Sistemas de archivos virtual (VFS)

* <mark style="background-color:blue;">**El VFS permite que el sistema operativo trabaje con varios tipos de sistemas de archivos como si todos fueran iguales, haciendo más fácil leer y escribir archivos sin importar dónde estén.**</mark> El Sistema de Archivos Virtual (VFS) es como un traductor universal para los sistemas operativos. **Un sistema de archivos es la forma en que un sistema operativo organiza y gestiona los archivos en un dispositivo de almacenamiento, como un disco duro o una unidad USB. Actúa como un "organizador digital", permitiendo que los archivos se almacenen, recuperen y accedan de manera eficiente.**&#x20;

en una computadora hay diferentes tipos de sistemas de archivos:

* ***NTFS (*****New Technology File System*****):*** **es el sistema de archivos predeterminado para las versiones modernas de Windows. Desarrollado por Microsoft, ofrece permisos para archivos y carpetas, cifrado, compresión y cuotas de disco, lo que lo convierte en una solución robusta y segura para el almacenamiento de datos, NTFS mantiene un registro de cambios, lo que ayuda a la recuperación de datos en caso de errores o fallos del sistema**. Tiene soporte de archivos de gran tamaño en comparación a sistemas viejos como FAT&#x20;

* ***ReFS (*****Resilient file system*****):*****&#x20;es un sistema de archivos desarrollado por Microsoft utilizado en windows server, Hyper-V y otros sistemas de virtualización, diseñado para maximizar la disponibilidad de los datos, escalar eficientemente grandes conjuntos de datos y proporcionar integridad de datos con resistencia a la corrupción.** ReFS está optimizado para entornos de gran escala y cargas de trabajo que requieren alta disponibilidad y confiabilidad, como los entornos de virtualización.

* ***EXT (Extended File System):*** **se refiere a una familia de sistemas de archivos diseñados originalmente para Linux diseñado por Remy card en 1992.** El primero de ellos, ext, fue creado para superar las limitaciones del sistema de archivos Minix. Posteriormente, surgieron ext2, ext3 y ext4, cada uno con mejoras en rendimiento, escalabilidad y fiabilidad. Ext4 es actualmente uno de los sistemas de archivos más utilizados en distribuciones Linux. **ext1 ya no se usa activamente, pero algunas de sus características clave incluían la organización de datos en bloques y la capacidad de manejar tamaños de archivos y volúmenes grandes en ese momento (hasta 2 gb)**

* ***ext2, ext3, ext4:*****&#x20;son sistemas de archivos utilizados en sistemas operativos tipo Unix, como Linux. Son versiones mejoradas del sistema de archivos original, llamado EXT (Extended File System). Ext2 fue el primer sistema de archivos diseñado específicamente para Linux, y sus sucesores, Ext3 y Ext4, introdujeron mejoras como el journaling para mayor confiabilidad y mayor capacidad de almacenamiento.** \
  \
  **ext2 :** actualmente muy limitado y no utilizaba journaling lo que la hace mas susceptible a la perdida de datos en caso de fallos en el sistema\
  **ext3:** versión mejorada de ext3 con journaling implementado, tiene limitaciones en cuanto rendimiento y capacidad comparado a ext4.\
  **ext4:** la ultima versión, soporta hasta 16TB, mejora rendimiento, velocidad de reparación del sistema de archivos y asignación basada en extensiones que reduce la fragmentación y mejora el rendimiento.\\

* ***FAT (*****File Allocation Table*****) (FAT12, FAT16, FAT32):*****&#x20; FAT12, FAT16 y FAT32): son sistemas de archivos, métodos para organizar y almacenar datos en dispositivos de almacenamiento como discos duros o memorias USB.** FAT12, FAT16 y FAT32 se diferencian principalmente en la cantidad de bits que utilizan para referenciar los archivos dentro de la tabla de asignación de archivos (FAT), lo que afecta el tamaño máximo de los archivos y particiones que pueden manejar. \
  \\

  **FAT12:** Es el sistema de archivos más antiguo, utiliza 12 bits para la dirección de los archivos. Generalmente se encuentra en disquetes y tiene limitaciones en el tamaño de los archivos y particiones.

  **FAT16:** Utiliza 16 bits para la dirección de los archivos, permitiendo archivos y particiones más grandes que FAT12. Fue ampliamente utilizado en discos duros y dispositivos de almacenamiento en los primeros sistemas Windows.

  **FAT32:** El sistema de archivos más reciente de la familia FAT, utiliza 32 bits para la dirección de los archivos. Esto le permite soportar archivos y particiones mucho más grandes que FAT16, hasta 2TB de tamaño. \
  \
  **su uso es común en unidades flash USB, tarjetas SD, discos duros externos y otros dispositivos de almacenamiento que requieren compatibilidad con sistemas operativos más antiguos exceptuando a FAT32  que es mas moderno y es usado incluso en algunos telefonos inteligentes y camaras digitales.**\\

* ***exFAT (*****Extended File Allocation Table*****):*****&#x20;es un sistema de archivos desarrollado por Microsoft, diseñado principalmente para dispositivos de almacenamiento externo como unidades flash y tarjetas SD.** Es una versión mejorada de FAT32 que permite archivos de mayor tamaño y es compatible con diferentes sistemas operativos como Windows, macOS y Linux. Supera el limite de 4GB de FAT32, admite hasta 16 millones de terabytes (16 exabytes), No lleva un registro de las modificaciones realizadas en los archivos, lo que puede ser un problema en caso de corrupción de datos sumando que puede ser más propenso a la corrupción de datos si se desconecta bruscamente o se produce un corte de energía.&#x20;

* ***XFS:*****&#x20;es un sistema de archivos de registro (journaling) de alto rendimiento y escalabilidad, diseñado originalmente por Silicon Graphics (SGI) para la plataforma IRIX.** Es un sistema de archivos de 64 bits que ha sido ampliamente adoptado, especialmente en entornos de servidores Linux y sistemas de almacenamiento de alta capacidad, debido a su capacidad para manejar archivos grandes y sistemas de archivos extensos, es altamente escalable y puede manejar sistemas de archivos de gran tamaño, hasta 8 exabytes y potencialmente más con algunas versiones.

* ***Btrfs (B-tree file system):*****&#x20;es un sistema de archivos moderno para Linux conocido por sus características avanzadas como la tolerancia a fallos, la reparación automática de datos y la administración eficiente del almacenamiento.** Es un sistema de archivos tipo "copy-on-write" (CoW) que se enfoca en la integridad de los datos y la escalabilidad a grandes capacidades. CoW hace el trabajo de evitar la modificación directa de los datos existentes. En lugar de sobrescribir los datos, se escriben copias en nuevas ubicaciones, lo que ayuda a prevenir la corrupción de datos y facilita la creación de instantáneas.

* ***JFS:*****&#x20;Es un sistema de archivos con registro por diario que fue desarrollado por IBM para sus servidores, Su principal característica es la capacidad de registrar las modificaciones en el sistema de archivos antes de aplicarlas, lo que permite una recuperación rápida en caso de fallos.** utilizado en sistemas operativos como AIX, eComStation, OS/2 y Linux cuenta con versiones mas recientes como JFS2, una versión más reciente con mejoras como la posibilidad de almacenar archivos más grandes. Las dos versiones  utilizan el registro para garantizar la integridad de los datos y una recuperación rápida en caso de fallos. &#x20;

* ***F2FS (*****Flash-Friendly File System*****):*****&#x20;** **es un sistema de archivos desarrollado por Samsung para dispositivos de almacenamiento flash, como SSDs, tarjetas SD y eMMC, que están basados en memoria NAND flash.** Está diseñado para optimizar el rendimiento y la vida útil de estos dispositivos, abordando las limitaciones de los sistemas de archivos tradicionales en entornos de memoria flash, F2FS utiliza la función TRIM para marcar bloques de flash obsoletos como libres, lo que permite al controlador flash recuperarlos y utilizarlos para nuevas escrituras, mejorando el rendimiento. Incluso puede admitir el cifrado a nivel del sistema de archivos, lo que agrega una capa adicional de seguridad. Este es poco usado debido a factores como la compatibilidad, la madurez y la preferencia por sistemas de archivos más establecidos (principalmente ext4).

* ***ReiserFS:*****&#x20;ReiserFS es un sistema de archivos para Linux conocido por su eficiencia en el manejo de archivos pequeños y su capacidad de registro (journaling), lo que mejora la integridad de los datos.** Fue desarrollado por Namesys, liderado por Hans Reiser, y fue el primer sistema de archivos con journaling incluido en el núcleo estándar de Linux, como se menciono anteriormente ReiserFS fue diseñado para ser particularmente eficiente en el manejo de archivos pequeños, lo que lo hacía popular en aplicaciones que manejan muchos archivos de este tipo, como sistemas de correo electrónico o bases de datos.&#x20;

  \
  **ReiserFS fue incluido en el núcleo de Linux desde la versión 2.4.1. Sin embargo, debido a problemas de mantenimiento, controversias relacionadas con su creador y problemas técnicos, ha sido marcado como obsoleto y está siendo eliminado gradualmente del núcleo de Linux.**&#x20;

* ***HPFS*****&#x20;(High Performance File System*****):*** **es un sistema de archivos desarrollado por IBM y Microsoft para el sistema operativo OS/2.** Fue diseñado para mejorar las limitaciones del sistema de archivos FAT (File Allocation Table) de la época, ofreciendo soporte para nombres de archivos largos, mayor eficiencia en el uso del espacio en disco y mejor organización de los archivos.&#x20;

* ***HFS+ y APFS (*****Apple File System)*****:*****&#x20;HFS (también conocido como Mac OS Extended) y APFS son sistemas de archivos utilizados por Apple en sus dispositivos.** HFS+ es un sistema de archivos más antiguo, mientras que APFS es la opción más moderna, diseñada para mejorar el rendimiento, especialmente en unidades de estado sólido (SSD) y dispositivos con almacenamiento flash. APFS Ofrece mejoras en velocidad, eficiencia y seguridad, incluyendo copiado rápido de archivos y espacio compartido, funciones como el cifrado integrado y la capacidad de crear snapshots (copias de seguridad) del sistema de archivos para recuperaciones rápidas. APFS utiliza una arquitectura de 64 bits, lo que le permite manejar más archivos y datos que HFS+.&#x20;

{% hint style="info" %}
el journaling, o registro por diario, es una técnica utilizada en sistemas de archivos para garantizar la integridad y consistencia de los datos, especialmente después de fallos del sistema.&#x20;
{% endhint %}

{% hint style="info" %}
La memoria flash NAND es un tipo de memoria no volátil que se utiliza comúnmente en dispositivos electrónicos como tarjetas SD, unidades USB y discos de estado sólido (SSD). Su principal característica es que puede retener datos incluso cuando no está conectada a una fuente de energía.&#x20;
{% endhint %}

Cada uno guarda los archivos de forma diferente, con sus propias reglas.\
Si el sistema operativo tuviera que entender cada tipo de sistema de archivos por separado, sería un caos. Tendría que saber hablar muchos "idiomas".\
VFS se encarga de unificar todo eso. Es una capa intermedia si podemos llamarle así.

* Recibe las órdenes del sistema, por ejemplo de abrir un archivo
* Traduce esas órdenes al "idioma" correcto según el sistema de archivos que se esté usando.
* Devuelve los resultados de forma uniforme al sistema operativo y a los programas.

### Gestion de usuarios y privilegios (rings)

**En seguridad informática, los anillos de protección son un mecanismo para organizar el acceso a los recursos del sistema, donde cada nivel (anillo) tiene diferentes privilegios, siendo el anillo 0 el más privilegiado y los anillos externos con menos privilegios.** Este diseño jerárquico ayuda a proteger datos y funcionalidades, limitando el impacto de fallos o ataques maliciosos.&#x20;

**Niveles de los anillos de protección:**

* **Anillo 0 (Núcleo/Kernel):** Este anillo normalmente alberga el código del sistema operativo (kernel), que tiene acceso completo a todo el hardware y recursos del sistema.
* **Anillo 1 (Controladores de Dispositivos):** Los controladores de dispositivos suelen ejecutarse en este anillo, permitiéndoles interactuar con el hardware bajo el control del kernel.
* **Anillo 2 (Funciones del Sistema):** Este anillo puede incluir funciones del sistema operativo que no son críticas para la operación básica, pero que aún requieren privilegios especiales.
* **Anillo 3 (Aplicaciones de Usuario):** Las aplicaciones de usuario normalmente se ejecutan en este anillo, con las restricciones de acceso más estrictas.&#x20;

<figure><img src="https://2387787026-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJgLrxGxnGGPpWjuMQyil%2Fuploads%2Fu0sciH91GGkNyqM62hmQ%2Fimage.png?alt=media&#x26;token=779cb1f9-8ab0-4481-8cf0-f45dfd854ee9" alt=""><figcaption></figcaption></figure>

## Modularidad del Kernel

* <mark style="background-color:blue;">**La modularidad del kernel se refiere a la capacidad de un sistema operativo para cargar y descargar partes del núcleo (kernel) de forma dinámica, permitiendo extender sus funcionalidades sin necesidad de recompilar todo el núcleo.**</mark> En lugar de tener todo el código del kernel en un solo bloque monolítico, un kernel modular permite que ciertas partes, como controladores de dispositivos o sistemas de archivos, se implementen como módulos independientes que se pueden añadir o quitar según sea necesario.&#x20;

### Kernels modulares

**Un kernel modular es un tipo de núcleo de sistema operativo que está diseñado para ser flexible y extensible**. En lugar de tener todo el código del sistema operativo incluido en un solo bloque monolítico, un kernel modular separa algunas de sus funcionalidades en módulos, que son archivos de código que pueden ser cargados o descargados dinámicamente según sea necesario.&#x20;

* la modularidad del kernel permite a los sistemas operativos adaptarse a las necesidades cambiantes, mejorar la flexibilidad y la mantenibilidad, y optimizar el uso de los recursos del sistema.

**Los módulos del kernel son archivos que contienen código objeto que extienden la funcionalidad del kernel en tiempo de ejecución**

La modularidad permite una mayor flexibilidad y facilidad de mantenimiento, ya que se pueden agregar o quitar funcionalidades sin afectar al resto del kernel.

*El kernel modular* *Permite que el sistema operativo se adapte a diferentes configuraciones de hardware sin necesidad de cambiar el núcleo base, Facilita las actualizaciones del sistema operativo, ya que solo se necesitan actualizar los módulos necesarios en lugar de todo el núcleo, Permite cargar solo los módulos necesarios en un momento dado, optimizando el uso de la memoria y otros recursos del sistema y por ultimo el kernel modular también permite* *Aislar fallos en módulos individuales ayuda a prevenir que un problema en un módulo afecte a todo el sistema.*&#x20;

### Módulos del kernel

ejemplos de módulos comunes en el kernel

* **Controladores de dispositivos (drivers):** Permiten al kernel interactuar con hardware específico, como tarjetas de red, tarjetas de sonido, etc.&#x20;
* **Sistemas de archivos:** Proporcionan soporte para diferentes sistemas de archivos, como ext4, NTFS, etc.&#x20;
* **Protocolos de red:** Habilitan la comunicación entre diferentes dispositivos y redes.&#x20;
* **Funcionalidades adicionales:** Módulos para cifrado, compresión, manejo de memoria, etc.&#x20;

## Syscalls

* <mark style="background-color:blue;">**una llamada al sistema (o syscall) es un mecanismo que permite a un programa de usuario solicitar servicios al sistema operativo.**</mark> Es una interfaz entre el espacio de usuario (donde se ejecutan los programas) y el espacio del núcleo (donde reside el sistema operativo). A través de las llamadas al sistema, los programas pueden acceder a funcionalidades del sistema que requieren privilegios especiales, como la gestión de archivos, procesos o la comunicación con el hardware.

***proceso de una llamada al sistema***

1. Un programa de usuario necesita realizar una operación que requiere acceso a recursos del sistema, por ejemplo abrir un archivo.
2. El programa realiza una llamada al sistema, que es una función que se encuentra en una biblioteca del sistema.&#x20;
3. La llamada al sistema activa un cambio de contexto, pasando del modo usuario al modo núcleo.&#x20;
4. El núcleo del sistema operativo ejecuta la función solicitada, accediendo a los recursos del sistema de forma segura.&#x20;
5. Una vez completada la operación, el control vuelve al programa de usuario, que continúa su ejecución.&#x20;

las syscalls cumplen funciones como:&#x20;

* Creación y gestión de procesos.
* Operaciones de entrada/salida (lectura y escritura de archivos, acceso a dispositivos).
* Gestión de memoria.
* Comunicación entre procesos.&#x20;

## Kernel Panic

* <mark style="background-color:blue;">**Un kernel panic, o pánico en el núcleo, es un error fatal en un sistema operativo que impide que el sistema continúe funcionando normalmente.**</mark> En esencia, es un error tan grave que el sistema operativo no puede recuperarse y, por lo tanto, se bloquea o reinicia.&#x20;

En la mayoría de los casos, **un kernel panic se manifiesta como un mensaje de error en la pantalla, seguido de un reinicio del sistema o, en algunos casos, un apagado completo.** La pantalla puede mostrar texto en blanco y negro, o un mensaje con detalles sobre el error.

Las causas de un kernel panic son variadas, comúnmente :&#x20;

* **Hardware defectuoso:** Fallos en la memoria RAM, disco duro, placa base, etc.&#x20;
* **Software incompatible o defectuoso:** Controladores de dispositivos incorrectos, aplicaciones o actualizaciones problemáticas.&#x20;
* **Errores en el núcleo del sistema operativo:** Fallos internos en el código del núcleo.&#x20;

para solucionar este problema, podemos probar primero a reiniciar el sistema que a veces es suficiente para solucionar el problema, también identificar la causa que es mas difícil pero puedes revisar desde la linea de comandos el registro del núcleo:&#x20;

```
journalctl -k
```

también verificar que nuestro hardware este funcionando correctamente, que los controladores y software sean compatibles con el sistema operativo

<figure><img src="https://2387787026-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJgLrxGxnGGPpWjuMQyil%2Fuploads%2FuEaCCDGKPi8BLOBqQ2xk%2Fimage.png?alt=media&#x26;token=bf7886bd-f3fb-43db-91b7-d74ffcd01de3" alt=""><figcaption><p>ejemplo kernel panic</p></figcaption></figure>

<figure><img src="https://2387787026-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJgLrxGxnGGPpWjuMQyil%2Fuploads%2FFmJn1I1Brwr8pDgDCUgA%2Fimage.png?alt=media&#x26;token=e1800792-67b6-4670-9069-8f9e0b674c18" alt=""><figcaption><p>ejemplo kernel panic</p></figcaption></figure>

también es posible ver una pequeña descripcion sobre la causa en la misma advertencia

## Device drivers

* <mark style="background-color:blue;">**Un controlador de dispositivo, o driver, es un software que permite que el sistema operativo y las aplicaciones se comuniquen con dispositivos de hardware específicos.**</mark> Actúa como un intermediario, traduciendo las instrucciones del sistema operativo en comandos que el hardware puede entender y viceversa. Sin los controladores, el hardware no podría funcionar correctamente.&#x20;

**Drivers comunes:**&#x20;

* <mark style="background-color:red;">Controlador de la tarjeta gráfica (GPU).</mark>
* <mark style="background-color:red;">Controlador de la tarjeta de sonido.</mark>
* <mark style="background-color:red;">Controlador de la impresora.</mark>
* <mark style="background-color:red;">Controlador del ratón.</mark>
* <mark style="background-color:red;">Controlador del teclado.</mark>&#x20;

## Scheduler

* <mark style="background-color:blue;">**Un "scheduler", o planificador en español, es un componente de software o hardware que gestiona la ejecución de tareas o procesos, determinando cuándo y cómo se deben realizar.**</mark> En sistemas operativos, el scheduler asigna el procesador a diferentes procesos. En otros contextos, puede referirse a la programación de eventos, tareas o recursos.&#x20;

Su objetivo principal es optimizar el uso del procesador, garantizando que todos los procesos tengan acceso a los recursos necesarios de manera eficiente, Puede ser a corto, medio o largo plazo, dependiendo de la frecuencia con la que se toman las decisiones y la duración de los procesos.&#x20;

## Preemptive y Cooperative multitasking

* <mark style="background-color:blue;">**La multitarea preventiva y cooperativa son dos formas en que un sistema operativo puede ejecutar múltiples procesos simultáneamente.**</mark>&#x20;

***multitarea preventiva:***&#x20;

* **el sistema operativo controla el tiempo que cada proceso puede usar el procesador y puede interrumpir un proceso en ejecución para darle el control a otro**, incluso si el primer proceso no ha terminado.&#x20;

***multitarea cooperativa:***&#x20;

* **los procesos deben ceder voluntariamente el control al sistema operativo para que otro proceso pueda ejecutarse**, lo que puede llevar a problemas si un proceso no lo hace o se queda "atrapado" en un bucle.&#x20;

## Virtualización relacionado el kernel

* <mark style="background-color:blue;">**La virtualización es una tecnología que permite crear entornos informáticos simulados o virtuales en lugar de entornos físicos**</mark>. En esencia, se trata de utilizar software para emular hardware, lo que permite ejecutar múltiples sistemas operativos y aplicaciones en una sola máquina física.&#x20;

### KVM (Kernel-based Virtual Machine)

**KVM es un módulo que se integra al kernel de Linux y proporciona soporte nativo para máquinas virtuales.** Permite ejecutar múltiples sistemas operativos invitados como si fueran sistemas físicos independientes, utilizando la infraestructura del kernel de Linux para gestionar los recursos y la ejecución. **se considera un hipervisor tipo 1, ya que se ejecuta directamente sobre el hardware, actuando como una capa de abstracción entre el hardware y las máquinas virtuales invitadas.**

**KVM se diferencia de otros hipervisores por su estrecha integración con el kernel de Linux. Esto le permite aprovechar la eficiencia y las funcionalidades del kernel para la gestión de máquinas virtuales:** permite asignar recursos como CPU, memoria y almacenamiento a cada máquina virtual de forma flexible, lo que permite optimizar el rendimiento de las aplicaciones y servicios ejecutados en cada máquina virtual.

### Contenedores

**un contenedor es una forma de empaquetar una aplicación con todas sus dependencias (bibliotecas, archivos de configuración, etc.) en una única unidad que puede ejecutarse de manera consistente en cualquier entorno, ya sea en un servidor local, en la nube o en una máquina virtual.**&#x20;

* **Los contenedores en Linux utilizan namespaces y cgroups para crear entornos aislados y gestionar recursos de manera eficiente. Los namespaces proporcionan aislamiento a nivel de proceso, red, sistema de archivos, etc**., mientras que los cgroups permiten limitar y controlar el uso de recursos por parte de los contenedores, como CPU, memoria y almacenamiento.&#x20;

Los namespaces crean vistas aisladas del sistema para cada contenedor, lo que significa que cada contenedor ve su propio espacio de nombres de procesos, sistema de archivos, red, etc.

* **Tipos de Namespaces:**
  * `CLONE_NEWPID`: Cada contenedor tiene su propio espacio de nombres de procesos, lo que evita que vean los procesos de otros contenedores o del sistema host.
  * `CLONE_NEWNET`: Permite que cada contenedor tenga su propia configuración de red, incluyendo interfaces de red, direcciones IP y tablas de routing.
  * `CLONE_NEWNS`: Permite que cada contenedor tenga su propio sistema de archivos raíz, lo que le da la sensación de estar ejecutándose en un sistema operativo independiente.
  * `CLONE_NEWUTS`: Cada contenedor puede tener su propio nombre de host y dominio, lo que le da una identidad única.

## Seguridad en el kernel

* <mark style="background-color:blue;">**La seguridad del kernel es crucial para la protección de un sistema operativo, ya que el kernel es el núcleo del sistema y controla el acceso a los recursos del hardware. Una vulnerabilidad en el kernel puede comprometer todo el sistema, permitiendo que código malicioso acceda a información sensible o controle el equipo.**</mark>&#x20;

#### Medidas de seguridad en el kernel

* [Anillos de protección (rings)](#gestion-de-usuarios-y-privilegios-rings)

* **Monitorización:** Se supervisa la actividad en el kernel en busca de patrones sospechosos

* **Protección de Pila:** la protección de pila forzada por el hardware nos permite proteger las pilas del kernel contra ataques de programación orientada a retorno (ROP) y otros

* **Protección DMA:** DMA en el kernel evita que dispositivos externos no autorizados accedan a la memoria del sistema

* **Arranque seguro:** Utilizar un Secure Boot para asegurar que solo se cargue código firmado y verificado, evitando la ejecución de código malicioso.&#x20;

* **Copias de seguridad:** Realizar copias de seguridad inmutables para proteger los datos en caso de un ataque u otras amenazas

* **Aislamiento de procesos:** separan los procesos para evitar que uno afecte a otros o al sistema operativo mismo, especialmente en caso de fallos o ataques. se logra mediante la creación de entornos aislados donde los procesos pueden ejecutarse con acceso restringido a recursos del sistema.&#x20;

* **ASLR (Address Space Layout Randomization): La Aleatorización del Diseño del Espacio de Direcciones, es una que aleatoriza la ubicación de los procesos y bibliotecas en la memoria del computador.** Esto significa que cada vez que se ejecuta un programa, sus componentes (como el código, las pilas, los montones, etc.) se cargan en direcciones de memoria diferentes y aleatorias, **El objetivo principal de ASLR es dificultar la tarea de los atacantes que intentan explotar vulnerabilidades en el software.** Al no saber dónde se encuentran exactamente los datos y el código en la memoria, resulta mucho más complicado para un atacante dirigir un ataque de manera efectiva.\
  \
  \
  **Características protegidas por el ASLR:**
  * **Código ejecutable:** La ubicación del código principal del programa se cambia cada vez que se ejecuta.
    * **Pilas:** La pila de llamadas a funciones, donde se almacenan datos temporales, también se aleatoriza.
    * **Montones:** La zona de memoria dinámica donde se asignan y liberan datos durante la ejecución también se aleatoriza.
    * **Bibliotecas compartidas:** Los archivos de biblioteca que se usan en el programa, como las bibliotecas estándar de C, también se cargan en direcciones aleatorias

* **DEP (Data Execution Prevention):** **también conocida como NX (No eXecute), es una característica de seguridad de los sistemas operativos que ayuda a prevenir la ejecución de código malicioso en áreas de memoria marcadas como no ejecutables.** DEP evita que programas o procesos intenten ejecutar código desde áreas de memoria que están diseñadas para almacenar datos, como pilas y montones, mientras que otras áreas, como las regiones de código, se marcan como ejecutables

  \
  Cuando un programa intenta ejecutar código desde una región de memoria que ha sido marcada como no ejecutable, DEP detecta esta actividad y genera una excepción

* **Aislamiento del núcleo (Windows):** esta característica crea una área aislada para el kernel y las utilidades criticas del sistema para protegerlos de aplicaciones o herramientas

* **PatchGuard (windows):** Impide que drivers o rootkits modifiquen el kernel

* **Lockdown Mode (Linux):** Impide que incluso root modifique el kernel en ejecución

* **IMA / EVM (Linux):** IMA (Arquitectura de Medición de Integridad) mide y evalúa archivos antes de que se accedan o ejecuten, mientras que EVM (Módulo de Verificación Extendida) protege la integridad de los metadatos del sistema de archivos

{% hint style="info" %}
Inmutable: no puede ser modificado/editado
{% endhint %}

## Visualizar un kernel

* versión del kernel en linux

```
uname -r
```

* info detallada del kernel en linux

```
uname -a
```

* procesos del kernel en ejecución en linux

```
ps -ef
```

* visualizar información detallada de los módulos del kernel en linux

```
man modinfo
```

* que archivos estan siendo utilizados por el kernel en linux

```
lsof
```

***Comandos para trabajar con módulos del kernel en linux:***

* `lsmod`: Lista los módulos cargados actualmente.

* `insmod`: Carga un módulo específico.

* `rmmod`: Descarga un módulo específico.

* `modprobe`: Carga un módulo y sus dependencias.

* `modinfo`: Muestra información sobre un módulo.&#x20;

* información general del sistema (incluyendo el kernel) en powershell

```
ver
```

* modificar control de arranque en Windows

```
bcdedit
```

## Desarrollo de un kernel

* <mark style="background-color:blue;">**Desarrollar un kernel implica crear el núcleo del sistema operativo, el componente que interactúa directamente con el hardware y gestiona recursos como CPU, memoria, procesos, discos, red, dispositivos, privilegios y seguridad.**</mark> Nos estamos refiriendo a los mas bajos niveles de programación. al hacer esto el objetivo es:&#x20;
  * Crear una interfaz entre hardware y software.
  * Permitir la multitarea y la protección entre procesos.
  * Proveer un entorno estable, seguro y eficiente para aplicaciones.
  * Ofrecer abstracciones como sistemas de archivos, redes, y procesos.

### Desarrollo del kernel: Arquitectura

* Elegimos Tipo de kernel: monolítico, microkernel, híbrido, exokernel, nanokernel.
* Elegimos Plataformas objetivo: x86, ARM, RISC-V.
* Creamos Estructura del sistema: memoria, procesos, entrada/salida, etc.

### Bootloader&#x20;

* El bootloader, también conocido como gestor de arranque, es un programa que se ejecuta al encender un dispositivo y se encarga de cargar el sistema operativo en la memoria RAM. Es el primer software que se ejecuta después del firmware (como la BIOS) y prepara el entorno para que el sistema operativo funcione correctamente.&#x20;

El kernel no se carga solo. El *bootloader* (como GRUB) carga el kernel desde el disco hacia la RAM.

* Se necesita que el kernel tenga una **interfaz compatible con el bootloader**&#x20;

#### Tipos de bootloaders

* **GRUB (GRand Unified Bootloader):** Un bootloader muy popular para sistemas Linux, que permite elegir entre múltiples sistemas operativos instalados.&#x20;
* **LILO (Linux Loader):** Un bootloader más antiguo que GRUB, pero aún utilizado en algunos sistemas.&#x20;
* **ELILO (EFI Linux Loader):** Un bootloader para sistemas basados en UEFI que carga sistemas operativos Linux.&#x20;
* **U-Boot (Universal Boot Loader):** Un bootloader versátil utilizado en sistemas embebidos y plataformas ARM.&#x20;
* **Das U-Boot:** Una versión mejorada de U-Boot.&#x20;
* **systemd-boot:** Un bootloader moderno diseñado para sistemas UEFI.&#x20;
* **Shim:** Un bootloader utilizado para la verificación de arranque seguro en sistemas UEFI.&#x20;
* **Preloader:** Un bootloader utilizado en algunos dispositivos Android para inicializar el sistema y cargar el kernel.&#x20;
* **iBoot:** El bootloader utilizado en dispositivos iOS.&#x20;

los más comunes son: **BIOS (para sistemas heredados), UEFI (para sistemas modernos)**

{% hint style="success" %}
**en dispositivos moviles..**

* El bootloader de iphone es iBoot
* El bootloader de android es GRUB o U-boot
  {% endhint %}

### Desarrollo del kernel: **Inicialización temprana (Early Init)**

* Inicializa la tabla de interrupciones.
* Configura la pila.
* Habilita la memoria protegida.
* Detecta el hardware base.

### **Desarrollo del kernel: Gestión de memoria**

* ***Memoria virtual:*****&#x20;La memoria virtual es una técnica de gestión de memoria que permite a los sistemas operativos utilizar el disco duro como si fuera parte de la memoria principal (RAM).** Esto permite que los programas se ejecuten aunque no quepan completamente en la RAM, mejorando el rendimiento y la capacidad de ejecución de aplicaciones.&#x20;
* ***Paginación:*** **La paginación en la gestión de memoria es una técnica que divide la memoria física y virtual en bloques de igual tamaño, llamados páginas y marcos de página, respectivamente.** Permite la implementación de la memoria virtual, donde los programas pueden usar más memoria de la disponible físicamente, transfiriendo páginas entre la memoria principal y el almacenamiento secundario (disco) según sea necesario.&#x20;
* ***MMU (Unidad de Gestión de Memoria):*****&#x20;La Unidad de Manejo de Memoria, es un componente de hardware que gestiona el acceso a la memoria en un sistema informático.** Su función principal es traducir las direcciones virtuales utilizadas por los programas a direcciones físicas, permitiendo que múltiples programas se ejecuten simultáneamente sin interferir entre sí. También se encarga de la protección de memoria, asegurando que un programa no pueda acceder a la memoria de otro o del sistema operativo.

### **Desarrollo del kernel: Planificador de procesos (scheduler)**

* [Desarrollo de algoritmos que eligen qué proceso se ejecuta.](#planificacion-de-procesos-scheduler)

### **Desarrollo del kernel: Interfaz de llamadas al sistema (Syscalls)**

* [Punto de entrada de las aplicaciones al kernel](#syscalls)

### **Desarrollo del kernel: Gestión de dispositivos (drivers)**

* [Desarrollo de controladores de hardware (USB, teclado, disco, etc.).](#device-drivers)

### **Desarrollo del kernel: Sistema de archivos**

* [Implementar lectura/escritura de discos y estructuras como FAT, ext4, etc.](#sistemas-de-archivos-virtual-vfs)

### **Desarrollo del kernel: Seguridad y privilegios**

* [Separación de espacio de usuario y kernel, Control de acceso a recursos.](#seguridad-en-el-kernel)

### **Desarrollo del kernel: Desarrollo de herramientas de depuración**

* [Herramientas de depuración](#gestion-de-interrupciones)&#x20;

### Desarrollo del kernel: Compilación del kernel

1. Escribir código en C y ASM.
2. Compilar el código con `gcc -ffreestanding -m32` o `-m64`.
3. Usar `ld` para enlazar y crear el binario kernel (`kernel.bin` o `kernel.elf`).
4. Empaquetar el kernel con un bootloader (como GRUB) en una ISO booteable.
5. Ejecutar con QEMU o grabar en una USB.

```
# Ejemplo
qemu-system-i386 -kernel kernel.bin
```

(ejemplo con qemu).
