# MINIX

MINIX es un clon del sistema operativo Unix distribuido junto con su código fuente y desarrollado por el profesor Andrew S. Tanenbaum en 1987.
En 1975 los Laboratorios Bell de la AT&T, publicaron el sistema operativo Unix V6, para 1977 John Lions publicó unas notas con el código fuente que se usaba en los cursos de sistemas operativos. Cuando los Laboratorios Bell publicaron Unix V7 en 1979, prohibieron su uso para la enseñanza. Por lo que en 1984 Andrew S. Tanenbaum comenzó a escribir un clon de Unix para las IBM-PC con Intel 8086 de ese tiempo, con el fin de usarlo en su clase en lugar del entonces prohibido Unix. Terminado en 1987 pudo usarlo para enseñar a sus alumnos el diseño de sistemas operativos en la Vrije Universiteit de Ámsterdam.
Su libro fue ampliamente adoptado, porque además de que Unix estaba bajo restricciones de licencia de AT&T, era demasiado complicado y corría sobre máquinas complejas; algo completamente antipedagógico, mientras que Minix fue escrito con fines pedagógicos y para una máquina muy accesible. En 1997 publicó Minix 2 y en el 2004, gracias al financiamiento de la Union Europea, Minix 3, que es compatible con NetBSD y a prueba de fallas.
Gracias a su reducido tamaño, diseño basado en el paradigma del micronúcleo, y su amplia documentación, resulta bastante apropiado para personas que desean instalar un sistema operativo compatible con Unix en su máquina personal, así como aprender sobre su funcionamiento interno.
El primer Minix fue desarrollado para ser ejecutado en un IBM PC con microprocesador Intel 8088 o superior, aunque se han creado conversiones para otros sistemas y Minix 3, también corre en procesadores ARM.
Debido al enfoque puramente educacional de MINIX, Tanenbaum no permitía que este fuera modificado demasiado ya que esto complicaría el sistema y no permitiría que sus estudiantes lo entendieran en un semestre. Por estos motivos, Linus Torvalds decidió escribir su propio núcleo de sistema operativo (Linux) compatible con Unix. En simbiosis con las herramientas de GNU surgió GNU/Linux, que ha ganado protagonismo en el campo de los Unix para ordenadores compatibles con el IBM PC, principalmente debido a que su licencia (GPL) permite la modificación del mismo. Actualmente Minix se distribuye con una licencia similar, la licencia BSD, que es menos restrictiva que la de GNU, porque en palabras de Tenembaum, "está permitido todo excepto demandarlo".
Para una persona poco familiarizada con los elementos internos de un sistema operativo, MINIX es una buena opción que le permite entender casi todos los elementos del sistema, con solo algunos meses de uso y estudio.

## Historia

Andrew S.Tanenbaum creó MINIX en la Universidad Libre de Ámsterdam para ejemplificar los principios recogidos en su libro de texto Operating Systems: Design and Implementation (1987). Una parte del código en C del núcleo, el controlador de memoria y el sistema de ficheros de MINIX 1.0 se recogen en este libro.
Junto con el libro también había disponible un disquete con el código fuente de MINIX y los binarios, junto con un manual de referencia del sistema.
Tanenbaum creó originalmente MINIX para que fuera compatible con las arquitecturas IBM PC e IBM PC/AT, que eran las comunes en esa época.
MINIX 1.5, publicado en 1991, incluía soporte para MicroChannel IBM PS/2 y también fue adaptado para las arquitecturas Motorola 68000 y SPARC, soportando Atari ST, Commodore Amiga, Apple Macintosh y plataformas Sun SPARCstation.
También existió una adaptación no oficial a las arquitecturas compatibles con Intel 80386 (en modo de 32 bits protegido), National Semiconductor NS32532, ARM y procesadores INMOS transputer. Meiko Scientific utilizó una primera versión de MINIX como base de su sistema operativo MeikOS. También existió una versión de MINIX que se ejecutaba como un proceso de usuario en el sistema operativo SunOS.
Al decrementarse la demanda de las computadoras de arquitectura de 68k, MINIX 2.0, publicado en 1997, sólo era compatible con las arquitecturas x86 y SPARC. Fue el tema para la segunda edición del libro de Tanenbaum, en esta ocasión coescrito junto con Albert Woodhull, y fue distribuido en un CD-ROM incluido en el libro. MINIX 2.0 añadía compatibilidad con POSIX1, soporte para arquitecturas Intel 80386 y superiores de 32 bits y reemplazó los protocolos de red Amoeba incluidos en MINIX 1.5 por TCP/IP. También aparecieron adaptaciones no oficiales de MINIX 2.0 para las arquitecturas basadas en el 68020 ISICAD Prisma 7000 y las basadas en Hitachi SH3.
Minix-vmd es una variante de MINIX 2.0 para procesadores compatibles con Intel IA-32, que fue creada por dos investigadores de la Vrije Universiteit, la cual añadía memoria virtual y soporte para el sistema gráfico X Window System.
MINIX 3 fue públicamente anunciado el 24 de octubre de 2005 por Andrew Tanenbaum, durante su exposición en la conferencia de ACM en el Symposium on Operating System Principles. Aunque sigue manteniéndose como ejemplo para la nueva edición de su libro, está comprensiblemente rediseñado para ser “utilizado como un sistema serio en computadoras con recursos limitados y para aplicaciones que requieren de gran fiabilidad”.
Actualmente MINIX 3 soporta sólo arquitecturas derivadas de IA-32, y está disponible en LiveCD, lo que permite ser utilizado sin necesidad de instalar el sistema operativo, y en versiones compatibles con sistemas de emulación o virtualización como BOCHS, Qemu, VMware y VirtualPC.
La versión 3.1.5 fue lanzada el 5 de noviembre de 2009, y contiene X11, emacs, vi, cc, gcc, perl, python, ash, bash, zsh, ftp, ssh, telnet, pine y cerca de 650 aplicaciones más, comunes a los sistemas Unix. Con la incorporación de X11, esta versión marca el punto de transición entre el modo texto y gráfico en este sistema operativo. Otra característica de esta versión, que será mejorada en un futuro, es la habilidad del sistema para mantenerse cuando el driver de algún componente deja de funcionar, y en algunos casos éstos son reemplazados automáticamente sin afectar a los procesos que se estén ejecutando. Siguiendo este camino, MINIX puede auto-reponer su salud, lo que él llama self-healing, por lo que es ideal para sistemas que requieren alta fiabilidad.
* The MINIX 3 Microkernel Architecture
* Rocky Raccoon, the mascot of Minix 3.

## Estructura de MINIX

Para comprender mejor la estructura microkernel de MINIX se detallan a continuación las diferentes capas.

### Capa 1

Esta es la capa que interactúa directamente con el hardware. Es la encargada de atrapar todas las interrupciones y trampas, de planificar y ofrecer a las capas superiores un modelo de procesos independientes y secuenciales para comunicarse mediante el uso de mensajes. En resumen cuenta con dos partes bien definidas: la primera trata todo lo referente a la programación de bajo nivel para brindar la abstracción de procesos a las capas superiores. La segunda parte gestiona los aspectos más mecánicos de los mensajes, como los buffers de envío y recepción de mensajes que se alojan en la memoria física, las verificaciones de destinos y todo lo referente al manejo físico de memoria en lo que respecta a los mensajes. Esta primera capa está escrita en lenguaje ensamblador, el resto están escritas en lenguaje C.

### Capa 2

Contiene todo lo concerniente a los procesos de E/S, uno por cada tipo de dispositivos (tareas). Como se ilustra en el gráfico, tenemos tareas para discos, impresoras, relojes, interfaces de red y tareas de sistema, que si bien no son dispositivos de sistema sí tienen por finalidad el servicio de copiado entre diferentes regiones de memoria para procesos que no cuentan con los privilegios para realizarlos ellos mismos. Todas las tareas de la capa 2 y el código de la capa 1 se combinan para formar un solo programa binario llamado núcleo, aunque a pesar de que son compilados juntos cuando el núcleo y los manejadores de interrupciones se están ejecutando estos tienen mayores privilegios que las tareas. De este modo se logra que el núcleo pueda ejecutar todo tipo de instrucciones usando datos de cualquier parte del sistema, a fin de poder acceder a cualquier parte de la memoria y cualquier registro de procesador. Sin embargo, las tareas a pesar de no contar con los privilegios a nivel de núcleo sí pueden acceder a cualquier región de memoria que pertenezca a un proceso menos privilegiado con el objetivo de realizar E/S para ellos.

### Capa 3

Aglutina los procesos conocidos como procesos servidores. Se ejecutan en un nivel menos privilegiado que el kernel o las tareas, y no acceden directamente a los puertos de entrada y salida. Tampoco pueden acceder a otra región de memoria que no sea la que le fue asignada. Para ello se vale de las llamadas al sistema (FORK, EXEC y BRK) las cuales son proporcionadas por el administrador de memoria (MM). El sistema de archivos (FS) realiza las llamadas al sistema para los archivos (READ, MOUNT y CHDIR).

### Capa 4

Finalmente, aquí se alojan todos los procesos de usuario tales como shells, editores, compiladores, programas, etc.