César Yáñez Fernández
César Rodolfo Moctezuma Pimienta
Copyright © 2003 César Yáñez Fernández
Dedicamos este documento y agradecemos de forma muy especial a la comunidad de Software Libre Internacional, quienes sin ánimos de lucro regalan su ingenio y esfuerzo por el bien de la humanidad, y que no podemos nombrarlos, debido a que son tantos que no terminaríamos de escribir sus nombres.
Desde que las computadoras salieron a relucir, no ha existido un software perfecto, debido a que es un producto de la inteligencia humana, y el hombre como tal no es perfecto por naturaleza.
A partir de la tercera generación de computadoras (circuitos integrados y mainframes), estas son más poderosas para procesar datos y el proceso por lotes se habia hecho obsoleto; fue en este momento en el que los desarrolladores de software necesitaron un sistema especial que pudiera operar procesos más complejos en la computadora y que fuera un mejor intermediario entre el hombre y la máquina, a esta invención se le llamo Sistema Operativo.
Conforme fue pasando el tiempo, el usuario de una computadora se percató de que había una falla y se le informó al desarrollador del sistema. Para poder arreglar la falla, tenía que ver la manera de como detectar, analizar y diagnosticar el problema para poder arreglarlo.
Este desarrollador creó un conjunto de técnicas de programación y herramientas para llevar su actividad a cabo, como los depuradores, enlazadores, los editores especializados, los emuladores y estableció algoritmos para poderlos implementar dentro de un Sistema Operativo.
Los Sistemas Operativos han evolucionado para abarcar todo tipo de computadoras de diferentes usos; desde un equipo de escritorio, hasta equipos de bolsillo y de operaciones de misión crítica y cálculos matemáticos avanzados.
En el caso de una aplicación común, la creación de un sistema de depuración puede ser sencilla, y se puede complementar con el API (Application Programming Interface) de un Sistema Operativo. En el caso de la formación de un Sistema Operativo, y más precisamente el engendrar un núcleo, no existe un API ni un sistema de depuración ya existente; necesita hacerse e implementarse en el núcleo, al igual que podría ser usado por aplicaciones que se ejecuten sobre éste. El desarrollador de Sistemas Operativos debe conocer estas técnicas para saber qué hacer en el momento que detecte una falla en el núcleo y cómo arreglarlo.
Es dificil crear un concepto debido a que un Sistema Operativo es algo complejo de entender, pero podemos llegar a tener dos conceptos. Primero, desde el punto de vista de un desarrollador de Sistemas Operativos es: ``El código fuente ejecutable principal que administra dispositivos, memoria, sistemas de archivos e interfaces y es un intermediario entre el hardware y las aplicaciones''.
Segundo, desde el punto de vista de usuario es: ``Un conjunto de aplicaciones y herramientas que manejan el hardware para que haya una interacción entre el usuario y el equipo de cómputo''.
Aún con estas definiciones, no son completamente certeras, ya que la primera le da énfasis al núcleo del Sistema Operativo; mientras que la segunda, hace énfasis de la interacción usuario-máquina; pero es importante que usted tome el concepto correcto debido a que en el núcleo del sistema se llevan a cabo todas las operaciones antes mencionadas.
Debido a que el Sistema Operativo es una parte esencial en el uso del cómputo desde casi tiempos remotos, los desarrolladores de Sistemas Operativos deben tener el valor ético de que su proyecto de desarrollo puede depender una empresa, una institución, un proyecto tecnológico importante e inclusive la vida humana.
El propósito de crear un Sistema Operativo es por el afán de aprender o cubrir algún aspecto en el cómputo, ya sea en el escritorio, en el centro de investigación o en algún dispositivo de las nuevas tecnologías que florecen. David Galernter, profesor de ciencias computacionales de la Universidad de Yale comentó que los Sistemas Operativos son reliquias del pasado, este comentario cayó en un grave error, debido a que sin Sistema Operativo u otro software que opere como tal (refiriéndonos a Máquinas Operativas) el equipo electrónico (o de cómputo), simplemente no puede operar. Los Sistemas Operativos han ido evolucionando a lo largo de los años, desde los primeros que sólo manipulaban cierto tipos de máquinas, eran grandes, toscos y lentos; hasta los que se están diseñando en laboratorios de investigación en universidades o en los pequeños grupos de desarrollo de Software Libre donde han reescrito los esquemas que indican cómo debe ser un Sistema Operativo.
Es difícil clasificar los Sistemas Operativos ya que se han desarrollado para un sólo fin en específico. Algunos desarrolladores sólo lo hacen por ocio, otros para tener fama y/o fortuna o para fines de investigación.
La forma de clasificar Sistemas Operativos es basada ya sea tanto su objetivo a cubrir, o por su diseño.
El aspecto de esta clasificación es por el fin que deben cubrir. Los Sistemas Operativos, clasificándose por función, pueden ser:
Es un Sistema Operativo cuyo único fin es el apoyar al usuario final que sea su computadora en casa u oficina. Ejemplos son: Windows, BeOS, MacOS, Syllable, RiscOS, entre otros.
Sistema Operativo diseñado exclusivamente para trabajo en redes, ya sea como servidor o estación de trabajo; este tipo de Sistema Operativo debe ser extremadamente estable y seguro. Ejemplos tales son: Windows NT, FreeBSD, NetBSD, OpenBSD, Linux, Solaris, OpenVMS, entre otros.
Es un Sistema Operativo que está diseñado para cumplir tareas y procesos de misión crítica, donde el tiempo para finalizar un proceso o tarea es primordial. Un ejemplo donde se puede usar este tipo de Sistema Operativo es en un reactor nuclear o en el sistema de seguridad en un automóvil. Los Sistemas Operativos más comunes en este ámbito son: QNX, OS/9, RTMX, Lynx, RTEMS, entre otros.
Sistema Operativo que come pocos recursos y que hace tareas simples y/o repetitivas, éste se encuentra comunmente en un ROM.Ejemplos tales son Windows CE, PalmOS, IOS, eCos, entre otros.
Sistema Operativo para procesos en paralelo; es decir, para poder hacer múltiples tareas, cálculos y procesos entre diferentes microprocesadores, muy usado en Supercómputo. Ejemplos tales son: Amoeba, AgentOS, Hive, entre muchos otros.
La forma de clasificar un Sistema Operativo por diseño es mediante la forma en que fue diseñado, refiriéndose al núcleo (o kernel, como vulgarmente se dice). Precisamente esta forma de clasificarlos nació al momento que diferentes investigadores descubrieron nuevas formas de hacerlos funcionar. Ahora se detallarán los diseños más comunes (existen muchos otros, pero aún en una fase muy temprana de experimentación):
El núcleo es un gran archivo objeto donde todos los controladores de hardware, memoria, sistema de archivos e interfaces se encuentran dentro de éste. Este sistema es de los más viejos diseños que existen, actualmente, sigue usándose, como en los sistemas BSD (FreeBSD, NetBSD, OpenBSD) cuyo archivo objeto llega a ser de un tamaño muy grande.
Éste fue diseñado en un principio por Carnegie-Mellon; el diseño es crear un pequeño archivo objeto donde sólo se encuentre una secuencia de arranque de segunda fase, un manejador de memoria, controladores de hardware básicos (discos) y un sistema de archivos, para que una vez que monte el sistema de archivos, pueda cargar el resto de los controladores. Este archivo objeto es realmente chico; su desventaja es que llega a ocupar mucha memoria física para reservar todos los controladores y que pueden cargarse controladores que puedan dañar el sistema sin conocerlos. Ejemplos de este sistema son: Mach, Fiasco, Hurd, OSF, Nucleus y NewOS.
Este sistema es muy poco común y fue creado por un grupo de investigadores en V2 Labs (Holanda). En sí era sólo un código que contaba de tres partes, la secuencia de arranque, un subsistema de 16 bits (arranque y función de acceso a modo protegido) y un subsistema de 32 bits (manejador de memoria). El único Sistema Operativo que cuenta este diseño es V2_OS.
Este sistema fue creado con fines de investigación en el Instituto Tecnológico de Massachussets (MIT) sobre OpenBSD. Su propósito es crear como una capa de software para otros sistemas virtuales. Consta de 3 capas, la capa del Exokernel, la capa LibOS (núcleos de varios Sistemas Operativos corriendo sobre Exokernel) y la capa de aplicaciones, corriendo sobre LibOS. El sistema es realmente robusto y flexible, debido a que la única tarea del Exokernel, es impedir que tengan errores de permisos al hardware y conflictos entre los LibOS. Ejemplo de este diseño se encuentra en ExOS y Extended OpenBSD.
Sistema creado por el equipo de desarrollo de Unununium cuyo propósito es el crear un tipo de Sistema Operativo sin un archivo objeto central estático residente en memoria, sino un conjunto de módulos (células) cargadas por demanda dinámicamente para manejar diferentes procesos y dispositivos, es un sistema extremadamente flexible.
El proceso de arranque es efectuado antes de que se pueda cargar el núcleo del Sistema Operativo. Para escribir el proceso de arranque llega a ser complejo (se tiene que escribir en ensamblador), pero en realidad su tarea es sencilla de entender. El proceso de arranque se puede describir de esta forma:
El equipo de cómputo se enciende.
El ROM revisa la integridad del sistema.
El ROM busca los dispositivos de arranque, encuentra uno y carga su MBR.
El MBR busca una partición activa y carga el registro de arranque.
El registro de arranque carga el inicializador (boot loader).
El inicializador carga el núcleo del Sistema Operativo.
El núcleo examina la memoria y dispositivos, al encontrar un disco con un sistema de archivos adecuado, lo monta.
Una vez montado el disco, el núcleo ejecuta el primer proceso, que a su vez carga el resto del software del sistema.
Ahora el sistema está listo para trabajar.
En Sistemas Operativos que corren en diferentes arquitecturas de procesadores, el proceso de arranque en cada uno de éstos tiende a variar, aunque sean pequeños los cambios. En el caso de la arquitectura IA32 (Intel Architecture, 32 bits; máquinas 80386 en adelante), el inicio, la ejecución del boot loader y la carga del núcleo (en algunos Sistemas Operativos) en hecho en modo real de 16 bits, pero en el momento que el núcleo ha sido cargado, el procesador se ejecuta en modo protegido en 32 bits.
En los procesadores IA32 que se encuentran en PC de estilo IBM, un sector de arranque válido debe tener el dato 0xAA55 en el offset 510, que se encuentra localizado en el primer sector del disco. El BIOS busca en los discos algún sector donde se encuentre este dato, una vez encontrado, lo copia a la dirección 0x07C00. Para conocer más acerca de esto, se puede consultar en The Operating Systems Resource Center.
Hay que ser muy cuidadoso y conocer muy bien la arquitectura de la máquina, de lo contrario llegan a ser muy propensas las fallas en la fase de arranque.
La parte del Sistema Operativo que administra la jerarquía de memoria se le denomina ``administrador de memoria'' o ``manejador de memoria''. Su trabajo consiste en mantener al tanto de qué partes de la memoria están en uso y cuales no lo están, asignar memoria a los procesos cuando la necesitaban y recuperarla cuando terminan, y controlar el intercambio entre la memoria principal y el disco cuando la primera es demasiado pequeña para contener todos los datos cargados. Los viejos Sistemas Operativos tenían un mecanismo de administración de memoria básica, el cual sólo administraba la RAM y no tenía protección entre procesos. En el momento que aparecieron las máquinas de 32 bits, el administrador de memoria se volvió complejo, implementando un sistema de memoria virtual y protección.
La memoria virtual es un espacio en disco duro reservado para almacenar datos temporales, con este sistema, los procesos ``creen'' que hay más memoria que se puede utilizar y que se encuentra disponible.
En el manejo de memoria física se tienen que contemplar estos aspectos:
Organización: Es la forma en que se operará la memoria, ya sea en bloques, segmentos o páginas.
Inicialización: Detección de toda la memoria por medio del BIOS, y apartar un rango de direcciones de memoria para el núcleo y el manejador de memoria.
Asignación: La función principal del manejador de memoria, manejando un tipo de base de datos (dentro de una pila) viendo direcciones asignadas y libres.
Remoción: Es la acción de indicar qué determinadas direcciones han dejado de estar ocupadas y se marcan como libres.
Mapeo: Permite el control del espacio de direcciones. En este aspecto es donde se asigna protección, o se muestra la función de otras ideas, como SAS.