Funciones básicas

Los sistemas operativos, en su condición de capa software que posibilitan y simplifica el manejo de la computadora, desempeñan una serie de funciones básicas esenciales para la gestión del equipo. Entre las más destacables, cada una ejercida por un componente interno (módulo en núcleos monolíticos y servidor en micronúcleos), podemos reseñar las siguientes:
Proporcionar más comodidad en el uso de un computador.
Gestionar de manera eficiente los recursos del equipo, ejecutando servicios para los procesos (programas)
Brindar una interfaz al usuario, ejecutando instrucciones (comandos).
Permitir que los cambios debidos al desarrollo del propio SO se puedan realizar sin interferir con los servicios que ya se prestaban (evolutividad).
Un sistema operativo desempeña 5 funciones básicas en la operación de un sistema informático: suministro de interfaz al usuario, administración de recursos, administración de archivos, administración de tareas y servicio de soporte y utilidades.
Interfaces del usuario
Es la parte del sistema operativo que permite comunicarse con él, de tal manera que se puedan cargar programas, acceder archivos y realizar otras tareas. Existen tres tipos básicos de interfaces: las que se basan en comandos, las que utilizan menús y las interfaces gráficas de usuario.

Administración de archivos


Un sistema de información contiene programas de administración de archivos que controlan la creación, borrado y acceso de archivos de datos y de programas. También implica mantener el registro de la ubicación física de los archivos en los discos magnéticos y en otros dispositivos de almacenamiento secundarios.

Administración de tareas

Los programas de administración de tareas de un sistema operativo administran la realización de las tareas informáticas de los usuarios finales. Los programas controlan qué áreas tienen acceso al CPU y por cuánto tiempo. Las funciones de administración de tareas pueden distribuir una parte específica del tiempo del CPU para una tarea en particular, e interrumpir al CPU en cualquier momento para sustituirla con una tarea de mayor prioridad.

Servicio de soporte

Los servicios de soporte de cada sistema operativo dependerán de la implementación particular de éste con la que estemos trabajando. Entre las más conocidas se pueden destacar las implementaciones de Unix, desarrolladas por diferentes empresas de software, los sistemas operativos de Apple Inc., como Mac OS X para las computadoras de Apple Inc., los sistemas operativos de Microsoft, y las implementaciones de software libre, como GNU/Linux o BSD producidas por empresas, universidades, administraciones públicas, organizaciones sin fines de lucro y/o comunidades de desarrollo.

Perspectiva histórica

Estimación del uso actual de sistemas operativos según una muestra de computadoras con acceso a Internet (Fuente: W3counter).
Los primeros sistemas (1945 - 1950) eran grandes máquinas operadas desde la consola maestra por los programadores. Durante la década siguiente (1950 - 1960) se llevaron a cabo avances en el hardware: lectoras de tarjetas, impresoras, cintas magnéticas, etc. Esto a su vez provocó un avance en el software: compiladores, ensambladores, cargadores, manejadores de dispositivos, etc.
Problemas de explotación y soluciones iniciales
El problema principal de los primeros sistemas era la baja utilización de los mismos, la primera solución fue poner un operador profesional que manejaba el sistema, con lo que se eliminaron las hojas de reserva, se ahorró tiempo y se aumentó la velocidad.
Para ello, los trabajos se agrupaban de forma manual en lotes mediante lo que se conoce como procesamiento por lotes (batch) sin automatizar.
Monitores residentes


Fichas en lenguaje de procesamiento por lotes, con programa y datos, para ejecución secuencial
Según fue avanzando la complejidad de los programas, fue necesario implementar soluciones que automatizaran la organización de tareas sin necesidad de un operador. Debido a ello se crearon los monitores residentes: programas que residían en memoria y que gestionaban la ejecución de una cola de trabajos.
Un monitor residente estaba compuesto por un cargador, un Intérprete de comandos y un Controlador (drivers) para el manejo de entrada/salida.

Sistemas Operativos Multiprogramados

Surge un nuevo avance en el hardware: el hardware con protección de memoria. Lo que ofrece nuevas soluciones a los problemas de rendimiento:
• Se solapa el cálculo de unos trabajos con la entrada/salida de otros trabajos.
• Se pueden mantener en memoria varios programas.
• Se asigna el uso de la CPU a los diferentes programas en memoria.
Debido a los cambios anteriores, se producen cambios en el monitor residente, con lo que éste debe abordar nuevas tareas, naciendo lo que se denomina como Sistemas Operativos multiprogramados, los cuales cumplen con las siguientes funciones:
• Administrar la memoria.
• Gestionar el uso de la CPU (planificación).
• Administrar el uso de los dispositivos de E/S.
Cuando desempeña esas tareas, el monitor residente se transforma en un sistema operativo multiprogramado.

Llamadas al Sistema Operativo

Definición breve: llamadas que ejecutan los programas de aplicación para pedir algún servicio al SO.
Cada SO implementa un conjunto propio de llamadas al sistema. Ese conjunto de llamadas es el interfaz del SO frente a las aplicaciones. Constituyen el lenguaje que deben usar las aplicaciones para comunicarse con el SO. Por ello si cambiamos de SO, y abrimos un programa diseñado para trabajar sobre el anterior, en general el programa no funcionará, a no ser que el nuevo SO tenga la misma interfaz. Para ello:
• Las llamadas correspondientes deben tener el mismo formato.
• Cada llamada al nuevo SO tiene que dar los mismos resultados que la correspondiente del anterior.

Modos de ejecución en un CPU

Las aplicaciones no deben poder usar todas las instrucciones de la CPU. No obstante el SO, tiene que poder utilizar todo el juego de instrucciones del CPU. Por ello, una CPU debe tener (al menos) dos modos de operación diferentes:
• Modo usuario: el CPU podrá ejecutar sólo las instrucciones del juego restringido de las aplicaciones.
• Modo supervisor: la CPU debe poder ejecutar el juego completo de instrucciones.

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

Enlaces externos

• Página oficial
• Página oficial en inglés
• Blog oficial
• Blog oficial en inglés

Toro kernel

Saltar a navegación, búsqueda
Toro
Desarrollador
Matias E. Vara
Modelo de desarrollo
Software libre

Tipo de núcleo
Monolítico

Última versión estable
0.02


Licencia
GPL

Estado actual En desarrollo
Sitio web
toro.sourceforge.net

Toro es un núcleo de sistema operativo para computadoras desarrollado por Matias E. Vara, escrito en lenguaje Pascal y ensamblador

Datos sobre: Toro 0.4.2

Toro es una aplicación que, aún pudiendo utilizar las ventajas que gráficamente ofrece Adobe Air, prefiere optar por la sencillez y la facilidad de uso en una interfaz muy parecida a la de los clientes de mensajería clásicos.
Permite escribir en Twitter, acortar los enlaces que posteemos en nuestros mensajes, leer los mensajes de nuestros contactos, contestar a los mensajes de los demás usuarios, visualizar la línea de tiempo pública, consultar nuestra lista de amigos e incluso realizar búsquedas en todos los mensajes de Twitter. Shareware. Toro 0.4.2. Ultima version de Toro. Descargar Toro 0.4.2 en

Conclusion

Bibliografia

De Wikipedia, la enciclopedia libre
Obtenido de "http://es.wikipedia.org/wiki/Toro_kernel"