# Adaptive Domain Environment Operating Systems

Adaptive Domain Environment Operating Systems (ADEOS) proporciona un entorno flexible para compartir los recursos hardware para múltiples sistemas operativos o múltiples instancias de un mismo sistema operativo. ADEOS activa múltiples núcleos, llamados dominios, que existen simultáneamente sobre el mismo hardware. Ninguno de éstos dominios necesariamente conoce la existencia del resto, pero todos ellos si conocen de la existencia de ADEOS. Un dominio puede ser un Sistema Operativo completo, pero no necesariamente.

## Fundamentos
### Arquitectura

La arquitectura de ADEOS es la de núcleo dual y más específicamente la llamada nanonúcleo.

### Dominios y pipeline

Para permitir que las interrupciones y los eventos del sistema sean repartidos para compartir por los múltiples núcleos (normalmente sistemas operativos completos), ADEOS define lo que ha llamado abstractamente "dominio".
Un dominio es un componente software del núcleo base al cual ADEOS puede notificar:
* Las interrupciones hardware.
* Llamadas al sistema de las aplicaciones Linux.
* Eventos del sistema lanzados por el núcleo Linux.
* Otros eventos que personalicemos nosotros.
Un dominio puede ser accesible como un módulo dinámico del núcleo, o como uno estático formando parte de una imagen del núcleo, no produciendo ningún tipo de incidencia en el comportamiento de ADEOS. ADEOS también puede asegurar que los eventos sean disparados en el orden correcto para los distintos dominios definidos, gracias a ello, es posible proporcionar determinismo.
Esto nos permite asignar a cada dominio una prioridad estática. El valor de esta prioridad determina el orden en que los eventos son tratados por los dominios. Todos los dominios son encolados de acuerdo a sus respectivas prioridades, formando un pipeline de forma abstracta, que es el que usa ADEOS para manejar el flujo de eventos desde el más prioritario hacia el menos prioritario. Los eventos de entrada son encauzados a la cabecera del pipeline (dominio más prioritario) y progresan hacia la cola (dominio menos prioritario).
El código del núcleo Linux es enteramente él sólo un dominio especial predefinido, que es creado por ADEOS en las primeras etapas de carga de Linux. Este dominio inicial normalmente hace referencia al root domain hasta que la infraestructura proporciona lo suficiente para cargar el resto de dominios dinámicamente (por ejemplo el módulo cargador del núcleo).

### Modo de Trabajo

ADEOS controla todas las interrupciones, los traps de la CPU y las excepciones del nivel hardware, ya que reprograma el software del manejador. De hecho, ADEOS actualmente reemplaza los manejadores instalados anteriormente por Linux durante el arranque por los suyos propios para las correspondientes interrupciones y eventos. En la plataforma x86, se hace simplemente cambiando el descriptor de interrupción de la tabla. En cualquier momento dada una CPU con ADEOS activado, un dominio puede estar:
* Ejecutándose.
* Interrumpido por un dominio más prioritario durante el procesamiento de una interrupción/evento de entrada mientras él estaba procesando un evento pendiente.
* Voluntariamente autosuspendido, después de que todas las interrupciones/eventos hayan sido procesados.
Cuando un dominio ha finalizado de procesar una interrupción/evento que ha recibido, llama a un servicio especial de ADEOS (adeos_suspend_domain) el cual provoca que se pase la interrupción/evento al siguiente dominio del pipeline y así sucesivamente, realizándose un ciclo del más prioritario al menos prioritario.
Hay que destacar que ADEOS reanuda un dominio sólo si tiene que procesar una interrupción/evento o si ocurre que ha sido interrumpido por un dominio más prioritario que ha recibido alguna interrupción/evento para procesar, en otras palabras, no se produce intercambio entre dos dominios a menos que haya trabajo pendiente para alguno de ellos.
Cuando una interrupción ocurre en un sistema ocioso, ADEOS despierta al dominio más prioritario interesado en ella y el ciclo de proceso del pipeline comienza de nuevo.

### Ejemplo

Dados los dominios A,B,C donde la prioridad es A>B>C, se puede decir que:
* Si A ejecuta, entonces B y C están interrumpidos o suspendidos.
* Si B ejecuta, entonces A está suspendido y C está interrumpido o suspendido.
* Si C ejecuta, entonces A y B deben estar suspendidos.

### ¿Por qué se necesita ADEOS?

* Porque es necesario controlar determinísticamente el flujo de interrupciones hardware usando una capa software antes de que el núcleo Linux las procese. Este control incluye la interceptación, el enmascarado o la priorización de las interrupciones.
* Porque es necesario monitorizar las llamadas al sistema de Linux, añadiendo más información y sin tener que modificar el código de las llamadas al sistema.
* Porque se requiere de un mecanismo para monitorizar los eventos internos que ocurren en el núcleo Linux como pueden ser la planificación de tareas, la creación de procesos o las señales que capturan las tareas.

### Implementación de un dominio

La interfaz entre un dominio y ADEOS está compuesta de:
* Un descriptor, que es una estructura de datos que describe las propiedades del dominio en el tiempo.
* Una rutina de entrada al dominio, a la cual ADEOS llama para iniciar un dominio. Esta rutina se encarga de registrar el conjunto de interrupciones/eventos que va a manejar y a continuación el dominio pasa a ejecutar el bucle ocioso.

## Enlaces

* ADEOS (web oficial de distribución) (en inglés)
* ADEOS (web oficial de desarrollo) (en inglés)

## Documentos

* Diseño de ADEOS (en inglés)
* Porting ADEOS (beneath the Linux kernel) (en inglés)
* RTOS sobre ADEOS (en inglés)
* Datos: Q2824314