Interrupciones y excepciones

El SO ocupa una posición intermedia entre los programas de aplicación y el hardware. No se limita a utilizar el hardware a petición de las aplicaciones ya que hay situaciones en las que es el hardware el que necesita que se ejecute código del SO. En tales situaciones el hardware debe poder llamar al sistema, pudiendo deberse estas llamadas a dos condiciones:
• Algún dispositivo de E/S necesita atención.
• Se ha producido una situación de error al intentar ejecutar una instrucción del programa (normalmente de la aplicación).
En ambos casos, la acción realizada no está ordenada por el programa de aplicación, es decir, no figura en el programa.
Según los dos casos anteriores tenemos las interrupciones y la excepciones:
• Interrupción: señal que envía un dispositivo de E/S a la CPU para indicar que la operación de la que se estaba ocupando, ya ha terminado.
• Excepción: una situación de error detectada por la CPU mientras ejecutaba una instrucción, que requiere tratamiento por parte del SO.

Componentes de un sistema operativo

Un proceso es simplemente, un programa en ejecución que necesita recursos para realizar su tarea: tiempo de CPU, memoria, archivos y dispositivos de E/S. El SO es el responsable de:
• Crear y destruir los procesos.
• Parar y reanudar los procesos.
• Ofrecer mecanismos para que se comuniquen y sincronicen.
La gestión de procesos podría ser similar al trabajo de oficina. Se puede tener una lista de tareas a realizar y a estas fijarles prioridades alta, media, baja por ejemplo. Debemos comenzar haciendo las tareas de prioridad alta primero y cuando se terminen seguir con las de prioridad media y después las de baja. Una vez realizada la tarea se tacha. Esto puede traer un problema que las tareas de baja prioridad pueden que nunca lleguen a ejecutarse. y permanezcan en la lista para siempre. Para solucionar esto, se puede asignar alta prioridad a las tareas más antiguas.

Que es Toro kernel?

Toro es un kernel creado íntegramente en Pascal utilizando el compilador FreePascal.
Su escritura comenzó a finales del año 2003 por Matias E. Vara usando un nucleo monolítico.
Implementa la mayoría de las funciones de los sistemas operativos modernos.

Hasta la version 1.1.3 , era un Sistema Operativo , con un modelo paginado-segmentado de memoria .
Soporte multitasking , Virtual Filesystem ( Similiar al implementado en Linux) con drivers para la terminal , disketera y FAT12-FS , booteando a partir de un disket usando el standar Multiboot.
Tambien se ha portado FPC 1.0.6 para TORO atraves de una simple RTL.
Apartir de Junio del 2006 se modifico la estructura del proyecto , todo el código del kernel fue incluido en una RTL (Runtime Library) de FreePascal para procesadores i386 y AMD x86-64

El programa de usuario se compila junto al kernel y se ejecuta en modo nucleo.
El kernel de Toro fue escrito desde cero usando el compilador FreePascal 2.0.x , comienza con la version 0.01 , las caracteristicas del proyecto son :

- Soporte MultiThreading con Multiprocesamiento Simétrico Paralelo.
Interfaz entre FPC y el kernel totalmente transparente para el programador.
- Soporte de arquitecturas AMD x86-64 y Intel EMT64.
- Modelo de Memoria NUMA . (Non Uniform Memory Access ).
- Stack TCP-IP.
- Implementa un VFS con Drivers para Discos SATA y soporte para EXT2 FileSystem.
- Es independiente de la Arquitectura.
- Booteo a partir de discos duros.
El paquete incluye una RTL mínima para Freepascal 2.x.x y un conjunto de Unidades del kernel como Process.pas , Arch.pas ...
Se busca minimizar el numero de capas de abstracción entre la aplicación de usuario y el Sistema Operativo .
El kernel esta orientado para aplicación dedicadas y de tiempo real, no se utiliza la instrucción lock, nunca se inhiben la interrupciones y se implementa un modelo NUMA para mejorar el acceso a la memoria .

Para la compilacion de Aplicaciones de usuario utilizando Toro es recomendable leer el archivo CompilandoconToro.pdf , es una completa guia de como realizar el proceso de compilacion del kernel junto a la aplicacion de usuario

TORO OS: Sistema Operativo hecho en La Plata

Es realmente interesante lo que uno encuentra en internet. Visitando sitios open source, y navegando por ahi, di con Toro OS. ¿De que se trata? Un sistema operativo hecho desde cero por un estudiante (Matias) de Ingenieria Electronica y de Fisica de la Universidad Nacional de La Plata. Enteramente hecho en pascal (pese a que muchos lo consideran un lenguaje obsoleto y usado solo para la enseñanza) y su versión es la 1.13 , es booteable desde un disquete, y solo se maneja por consola (la imagen corresponde a una version en 32 bits, y esta virtualizada mediante Virtual Box). Es realmente interesante ver que haya iniciativas de este tipo en estas latitudes. Actualmente, el Proyecto Toro tiene un nuevo rumbo, el cual no es el desarrollo de un Sistema Operativo propiamente dicho, sino una Real Time Library que permitirá que cuando se compile un programa con ella, se genere un ejecutable booteable con Grub. Básicamente, no hay necesidad de un sistema operativo como intermediario.

Toro compilado sobre fpc-linux

Ya esta disponible el paquete .zip te toro-1.1 para ser compilado sobre la utlima version de fpc sobre linux .

Implementación de colas ligadas en Toro

Implementación de colas ligadas en Toro :

Las colas ligadas son un método eficaz para mantener agrupados una cantidad ilimitada de elementos . En Toro son utilizadas para agrupar los procesos , los timers , los superbloques , los inodos , los buffers , etc. , se le ha dado gran cantida de uso .

Podemos clasificarlas en dos tipo : simplemente ligadas o doblemente ligadas .

Por lo general las estructuras que se encuentran en una cola simplemente ligada posee solo un campo que apunta a la siguiente estructura y la ultima de la cola posee este campo a un puntero nulo , es decir solo pueden ser recorridas en un solo sentido .
A diferencia de estas , las doblemente ligadas posee dos campos una punteando a la siguiente estructura y otra a la anterior , pudiéndose así recorrerla en ambos sentidos y de manera cíclica .

La principal diferencia es para què van a ser utilizada . Por un lado las simplemente ligadas posee un campo menos , es decir ocupan menos memoria , pero si en la cola se están agregando y quitando elementos continuamente se consume mucha cpu , porque por cada elemento que debo quitar debo recorrer toda la cola para encontrar el anterior! .
Este problema se soluciona creando un nuevo campo apuntando al elemento anterior , así surgen las doblemente ligadas .
Es por eso que las colas que mantiene a los procesos , inodos , timers ,etc. , son colas doblemente ligadas , mientras que las colas que mantiene a los buffers que deben ser escritos a disco se encuentran en colas simplemente ligadas , cada buffer es agregado al comienzo y cuando deben ser quitados por la llamada sync() , se recorre la lista desde el inicio sacando de a uno todos .

Todo muy lindo , pero el hecho de que sean tan utilizadas hace necesarios procedimiento muy rápidos y eficientes , y este es el motivo del articulo .
Lo que se trato de crear fue procedimientos generales para el tratamiento de colas ligadas , tal como lo hace linux , pero en freepascal .

Todo el código del manejo de colas ligadas se encuentra en el archivo Include/Head/list.h

Este como se ve no es una unidad sino solo un archivo que debe ser incluido en la unidad luego de IMPLEMENTATION

Para que funcione deben ser declarados en la unidad cuatro símbolos ,de la manera tradicional , {$DEFINE Use_Tail} , estos son :

Use_Tail : le indica al compilador que el código de manejo de las lista debe ser incluido

nodo_struct : Debe contener la estructura de los elementos dentro de la cola , por ejemplo para una cola ligada de procesos valdría :

{$DEFINE nodo_struct = p_tarea_struc}

Siempre se considera a nodo_struct como un puntero .



nodo_tail : Puntea al elemento cabecera de la lista , puede estar definido o no .

next_nodo y prev_nodo : Estas estructuras poseen los campo dentro de los elementos de la lista que puntean al siguiente elemento y al anterior , por ejemplo para el caso de cola de procesos , estos valdrían :

{$DEFINE next_nodo = next_tarea }
{$DEFINE prev_nodo = prev_tarea}


El procedimiento para encolar un elemento , si se ha definido nodo_tail :

procedure Push_Node(Nodo : nodo_struct) ; inline ;

o en el caso de que no se haya definido nodo_tail :

procedure Push_Node(Nodo : nodo_struct;var Nodo_Tail : nodo_struct);inline;

La diferencia de que se defina o no nodo_tail , es la capacidad de trabajar en una unidad con mas de una cola ligada , puesto que de lo contrario se definiría un único valor para el símbolo nodo_tail , con esto se especifica el nodo cabecera de la cola en cada llamada .

Siempre el elemento es agregado al comienzo de la cola .

Ojo! nodo_tail no es una estructura sino solo un puntero al primer elemento de la cola .



Para quitar un elemento sucede lo mismo :

El procedimiento para quitar un elemento , si se ha definido nodo_tail :

procedure Pop_Node(Nodo : nodo_struct );inline;

o en el caso de que no se haya definido nodo_tail :

procedure Pop_Node(Nodo : nodo_struct;var Nodo_tail : nodo_struct);inline;

Como se ve todos los procedimiento son declarados como inline para acelerar su ejecución

Para hacer un poco mas “entendible” el código suelo definir otro símbolo que oculte a estos procedimientos :

{$DEFINE push_buffer = push_node }
{$DEFINE pop_buffer = pop_node }

Lo bueno de esto que definiendo un par de símbolos ya tenes todo el código para la manipulación de listas ligadas sin importar las estructuras , campos , etc .


Para el caso de colas simplemente ligadas , se debe definir el símbolo Use_Simple_Tail
para comenzar a trabajar con ella .
Igual que en el caso de las doblemente ligadas se cuenta con los procedimientos :

para agregar un elemento :

procedure Push_Snode (Nodo , sNodo_Tail : snode_struct);inline;

y para quitar un elemento :

procedure Pop_Snode (Nodo,sNodo_Tail : snode_struct);inline;

Ahora los símbolos nodo_struct y nodo_tail pasan a llamarse snode_tail y snode_struct respectivamente

Toro 0.02

La version 0.02 de Toro ya esta lista , implementa un Sistema de Archivo Virtual y drivers para discos ATA y EXT2 Filesystem. Es recomendable bajar la documentacion actualizada para su compilacion de http://toro.sourceforge.net