vieja tipos sistemas sistema revivir recursos para operativos operativo netbook liviano bajos antiguo c operating-system bootstrapping osdev assembly

tipos - ¿Cómo puedo construir un sistema operativo pequeño en una computadora de escritorio vieja?



sistemas operativos para pc (20)

Esto podría ser en vano, ya que sé que escribir un sistema operativo es insoportablemente complicado (especialmente por uno mismo).

  • No espero construir el siguiente Linux o Windows.

  • Sé que será horrible, y fallará, y no funcionará, pero está bien.

Quiero escribir todo yo mismo, en Assembly , C y (algunos) C ++ .

Este es un proyecto futuro, ya que estoy ocupado con algunas otras cosas en este momento y no tengo el tiempo de inmediato, pero pensé que lo haría ahora, así que tal vez podría obtener muchas respuestas a esto, y podría construir y ser un recurso útil para este tipo de enfoque (todo lo demás que he visto involucrado en construir fuera de minix, usando un gestor de arranque existente, construyéndolo en un programa de arranque virtual, etc.).

Quiero configurar uno de mis escritorios más antiguos con un monitor, teclado y mouse, y comenzar a trabajar en un disco duro vacío .

Quiero aprender a escribir mi propio gestor de arranque (he encontrado muchos recursos sobre esto, pero para completar, por favor agregue algunos buenos), mi propio controlador USB (si es necesario), un controlador de CD (si es necesario) ), etc. Todo, desde cero.

  • ¿Cómo pongo el código en la computadora? ¿Es mejor hacerlo con un disquete? ¿Pueden la mayoría de las computadoras hacerlo desde un dispositivo USB?

  • ¿Qué controladores necesito y puedo sugerir alguna referencia para construirlos?

  • Después de la secuencia de arranque, ¿entonces qué? ¿Cómo entro al modo protegido, etc.

  • ¿Cómo administro la memoria sin la ayuda de un sistema operativo? ¿Solo uso las direcciones que quiero? No es necesaria la inicialización?

  • ¿Qué me encontraré sin dudarlo que me confundirá?

  • ¿Cómo puedo hacer que sea una línea de comando O / S, y una gráfica?

  • ¿En qué se basa una O / S gráfica? ¿Cómo podría hacer algo como una línea de comando, una fuente y una imagen en la parte superior?

  • ¿Dónde puedo leer sobre la configuración de un entorno multitarea? (es decir, tener dos líneas de comando de tipo gráfico que corren una al lado de la otra).

  • ¿Cómo puedo configurar una especie de sistema de ventanas? ¿Cómo visualizo los gráficos en la pantalla una vez que se configura la multitarea simple?

Créanme, entiendo que este es un proyecto muy complicado y que probablemente nunca logre completarlo ni escribir sobre él de ningún modo.

Hay muchas otras piezas que no he mencionado, si piensas en alguna, siéntete libre de agregarlas también.

Por favor ponga un "tema" por respuesta, por ejemplo, controladores USB, y luego tal vez una lista de recursos, cosas para tener en cuenta, etc.

Además, no sugiera construir fuera de otro O / S o código preexistente. Sé que leeré un montón de código preexistente (como el kernel de Linux, o recursos de ejemplo, controladores existentes, etc.), pero en última instancia quiero hacer todo el texto yo mismo. Sé que debería construir algo más, y hay muchas otras preguntas sobre SO sobre eso que puedo leer si cambio de opinión y tomo esa ruta. Pero este se trata de hacer todo desde cero.

¿Alguna sugerencia sobre cómo hacerlo gráfico? Diferentes modos de video y cómo trabajar con ellos, etc.


Acerca de la programación de gráficos de bajo nivel, esto le dará mucha información: http://www.osdever.net/FreeVGA/home.htm . (También es muy interesante para el modo de texto).

¿Qué me encontraré sin dudarlo que me confundirá?

Te darás cuenta de que en la PC hay muchas cosas que no están claras: el conjunto de instrucciones x86 es complicado, y cuando tienes acceso directo al hardware, puede tomar bastante tiempo antes de que entiendas cómo escribir un solo personaje en la pantalla .

No se preocupe por el disquete y tal, la mayoría de las veces usará un emulador como Bochs o QEmu.


Comenzaría pequeño y compraría un kit de desarrollo integrado 8086, y desarrollaría un sistema operativo multitarea sobre eso. Una vez que tenga un kernel y esté familiarizado con el trabajo en el nivel de hardware, estará listo para hacer algo más desafiante.

Construir incluso una pantalla VGA DOS clon es bastante desafiante. Los detalles son enormes :-)

temas específicos

¿Cómo pongo el código en la computadora? ¿Es mejor hacerlo con un disquete? ¿Pueden la mayoría de las computadoras hacerlo desde un dispositivo USB?

El BIOS hará bootstrapping elemental.

¿Qué controladores necesito y puedo sugerir alguna referencia para construirlos?

cualquier cosa que no sea operaciones de CPU / memoria directas. Cualquier cosa que no esté directamente en el manual de referencia de la CPU.

Después de la secuencia de arranque, ¿entonces qué? ¿Cómo entro al modo protegido, etc.

El modo protegido será parte de la secuencia de inicio.

luego comienzas a realizar múltiples tareas y descubres cómo iniciar procesos.

¿Cómo administro la memoria sin la ayuda de un sistema operativo? ¿Solo uso las direcciones que quiero? No es necesaria la inicialización?

Correcto. Probablemente quiera ordenar un sistema de memoria virtual eventualmente.

¿Qué me encontraré sin dudarlo que me confundirá?

no tener herramientas de depuración, no tener IO

¿Cómo puedo hacer que sea una línea de comando O / S, y una gráfica?

Con dolor. Busque Windows 3.1 y Linux, en particular X ventanas.

¿En qué se basa una O / S gráfica? ¿Cómo podría hacer algo como una línea de comando, una fuente y una imagen en la parte superior?

Busca ventanas X

consejo final: estudiar linux / x windows. No es perfecto, pero proporciona una comprensión de un enfoque. También estudie los sistemas integrados.


Eche un vistazo a Minix . Estudie el código fuente junto con " Diseño e implementación de sistemas operativos ". Considera hacer contribuciones al proyecto. Creo que Minix es un sistema operativo realmente bueno y prometedor. También es un proyecto bien financiado. Eso significa, ¡incluso puede que te paguen por tus contribuciones!


En su nivel más bajo, el mínimo que un sistema operativo debe poder hacer es conducir el hardware de un sistema de alguna manera y de alguna manera cargar y ejecutar algún tipo de "código de usuario". Si vas a comenzar con una PC, entonces necesitas escribir código que pueda cargarse desde algún dispositivo u otro. Las PC más antiguas tienen un BIOS en el firmware que determina cómo el hardware realiza alguna inicialización (al menos video, teclado y alguna forma de almacenamiento o cargador de arranque). (Actualización de octubre de 2017: las PC más nuevas tienen firmware EFI o UEFI ... que es en gran medida una diferencia pedante; sirven los mismos propósitos para esta discusión).

Así que comience aprendiendo los detalles de bajo nivel de cómo usar el BIOS u otro firmware en su sistema de destino. Es decir, aprende a escribir un programa que el BIOS puede cargar y ejecutar. Eso eventualmente se transformará en tu cargador de arranque. Empieza pequeño. Simplemente obtenga un programa que imprima: "Hola, Linus" directamente desde el proceso de arranque del firmware (en un disquete o memoria USB, sería un buen comienzo ... o en un disco duro si lo desea).

Desde allí, recomendaría escribir un controlador de serie muy simple ... actualice su cargador de arranque para inicializar un puerto serie y comience una descarga desde allí. Luego puede ejecutar el código que atraviesa. A partir de ahí, escriba un poco de bootstrap que pueda escribir en otro conjunto de bloques (aún no hemos implementado un sistema de archivos ... ni siquiera el análisis de tabla de particiones, por lo que al principio trataríamos con rangos de bloques en bruto en el disco) )

En ese momento su gestor de arranque debería poder extraer un nuevo código a través de la línea serie, volcarlo en una partición (sí, implementar un tipo de manejo de tabla de particiones ... si usted cumple con las convenciones estándar de PC depende de usted en este punto ), y ejecutarlo.

Desde allí, debería poder trabajar en funciones mucho más sofisticadas. Desde esta base puede escribir y compilar un nuevo "kernel" ... reiniciar su banco de pruebas, y tener el nuevo kernel desplegado en él.

(Su gestor de arranque debería tomar alguna señal, como un BREAK sobre las líneas de handshaking en serie como un comando para omitir la descarga y simplemente iniciar la imagen existente, y también debería manejar algún tiempo de espera de esta manera).

A partir de ahí, escriba una capa de terminal y un shell de comandos muy simples. Un sistema de archivos? Implementar comandos para descargar nuevo contenido ejecutable que no sea el kernel (archivos u objetos de algún tipo). Y así.

Naturalmente, podría haber comenzado con un controlador de consola usando el teclado y el video de la PC (BIOS INT 0x16h e INT 0x10H, respectivamente, si no recuerdo mal). Sin embargo, sugiero comenzar con un controlador en serie, ya que luego puede automatizar su ciclo de compilación / implementación / prueba desde cualquier otro sistema (funcional) existente. Como su nuevo sistema operativo comenzará como un proyecto cruzado, será esencial que tenga una forma simplificada de manejarlo.

No sé qué tan lejos quieres llevar tu proyecto. Un objetivo razonablemente impresionante sería lograr un "alojamiento propio". Si puede crear un ensamblador / compilador simple que le permita usar su nuevo sistema operativo para (re) construir, vincular e iniciar en una versión funcional de su nuevo sistema operativo ... entonces habrá logrado ese objetivo. (Tenga en cuenta que no es un requisito. Muchos sistemas integrados nunca van a tener autohospedaje y no hay nada de malo en eso).


Es muy fácil gracias al hecho de que el BIOS ya tiene muchas funciones de entrada / salida integradas para cambiar el modo de pantalla, cambiar el color de los píxeles, escribir texto en la pantalla y muchas otras cosas. Sin embargo, no incluye soporte para sistemas de archivos, es una de las pocas cosas que debe incorporar en su sistema operativo.

El BIOS carga el primer sector en el disco duro y comienza a ejecutar el código desde allí, por lo que su sistema operativo debe colocarse con la primera instrucción en el primer sector del disco duro.

Este artículo de Wikipedia debería comenzar con las interrupciones del BIOS para escribir texto en la pantalla, recibir claves del teclado y otras cosas. https://en.wikipedia.org/wiki/BIOS_interrupt_call

Incluso si planea usar c ++, le recomiendo que lea la programación de ensamblaje, ya que es vital para entender cómo funciona el hardware.


Estudie el Sistema A2 (anteriormente llamado sistema Oberon ) para obtener ideas que pueda robar. Es un sistema operativo gráfico construido por solo dos personas, aunque hay que admitir que se trata de Niklaus Wirth. Lanzado por primera vez alrededor de 1990 y la velocidad es asombrosamente buena. Hay un libro de Gutknecht.


Intente leer el código de un SO de código abierto pequeño y básico, como MikeOS.

Alternativamente, sugiero los siguientes pasos (¡debería ser divertido!):

  1. Escribe una máquina virtual. Defina todas las instrucciones de su procesador para que conozca su sistema por dentro y por fuera. Interfazelo con SDL para teclado, mouse, pantalla, acceso de audio. Manténgalo simple para que pueda caber todo en su cabeza a la vez. No necesita ser una máquina virtual de última generación, solo una que pueda emular la función de una computadora "real".
  2. Escriba un ensamblador para el procesador de su máquina virtual. Recuerde que este ensamblador no necesita ser un programa escrito en el lenguaje de la máquina virtual, sino cualquier cosa que pueda convertir su lenguaje ensamblador a código máquina.
  3. Defina un formato ejecutable y escriba un enlazador simple.
  4. ¡Tienes todas las partes para escribir tu sistema operativo ahora! Escríbelo en el lenguaje ensamblador, ensamblarlo ... etc. No necesita un proceso de carga de arranque tan complicado, solo haga que su máquina ejecute su sistema operativo primero.

Los pasos anteriores pueden parecer un poco estúpidos para escribir un sistema operativo simple, pero bueno, es muy divertido.



Lo primero es lo primero. Lee, lee, lee, lee, lee. Debe tener una comprensión firme de cómo funciona el sistema operativo antes de poder implementar el suyo.

Tome uno de los libros de Andrew Tanenbaum sobre sistemas operativos. Este es el que usamos en mi clase de sistema operativo en la universidad:

Sistemas operativos modernos PDF

Sistemas operativos modernos en Amazon

A pesar de la portada ridícula, es una lectura fantástica, especialmente para un libro de texto. Tanenbaum es realmente un experto en esta área y sus explicaciones de cómo funciona el sistema operativo debajo del capó son claras y fáciles de entender. Este libro es principalmente teoría, pero creo que también tiene un libro que trata más sobre la implementación. Nunca lo leí, así que no puedo comentar sobre eso.

Eso debería ayudarlo a concentrarse en la administración de procesos, la administración de la memoria, los sistemas de archivos y todo lo demás que su núcleo del sistema operativo necesita para llevarlo a un estado de arranque. A partir de ese momento, es básicamente una cuestión de escribir controladores de dispositivo para el hardware que necesita admitir y ofrecer implementaciones de las funciones de la biblioteca C para hacer llamadas al núcleo para cosas como abrir archivos y dispositivos, leer y escribir, pasar mensajes entre procesos, etc. .

Lea sobre el ensamblaje x86 (suponiendo que está diseñando esto para una máquina x86). Eso debería responder muchas de sus preguntas con respecto a moverse entre los modos de funcionamiento del procesador.

Si tiene conocimientos de electrónica, puede ser más fácil comenzar con la escritura de un sistema operativo para un dispositivo integrado que tenga una amplia documentación, ya que generalmente será más simple que una PC x86. Siempre quise escribir mi propio sistema operativo y estoy empezando a escribir un sistema operativo integrado de microkernel para This Development Board de Digilent. Puede ejecutar el procesador MicroBlaze de núcleo blando de Xilinx, que tiene una documentación muy completa. También tiene algo de RAM, almacenamiento de datos flash, LED, interruptores, botones, salida VGA, etc. Un montón de cosas para jugar con la escritura de controladores simples.

Una de las ventajas de un dispositivo integrado es que también puede evitar escribir un controlador VGA durante mucho tiempo. En mi caso, la placa de desarrollo de Digilent tiene un UART a bordo, así que puedo usar de manera efectiva la salida de serie como mi consola para hacer todo y arrancar en una línea de comando con un mínimo esfuerzo.

Solo asegúrate de que lo que elijas orientar tenga un compilador fácilmente disponible y probado para ello. No desea escribir un sistema operativo y un compilador al mismo tiempo.


Más que cualquier otra cosa, si desea que esto se ejecute en hardware real, absolutamente necesita una copia del manual de su procesador. Los manuales de Intel ( http://www.intel.com/products/processor/manuals/ ) son invaluables. Repasa todo, desde el cambio de modos (real / protegido) a la administración de memoria virtual (si decide ir tan lejos) hasta hacer llamadas de sistema (si alguna vez llega a hacer el modo de usuario). Lo más importante es que explican con gran detalle una serie de cosas que se deben configurar para que funcionen las cosas, como el TSS y los registros de segmentos, que la mayoría de los textos del sistema operativo no discuten porque están más preocupados por los conceptos de nivel superior que por los procesadores. detalles específicos.



Muchas escuelas tienen clases de sistema operativo que hacen mucho de lo que describes. Mi escuela (CMU) enseñó el sistema operativo en C, y escribimos un kernel, un sistema de archivos y un shell, y recibimos el código para un gestor de arranque.

Lamentablemente, no pude encontrar ningún recurso definitivo para este curso (15-412) en la web, y ha evolucionado con el tiempo. Pero tal vez la gente podría publicar enlaces a fuentes y asignaciones para las escuelas que tienen buenos recursos en la web.


Puede disfrutar this tutorial llamado "Roll your own UNIX-clone OS", es muy perspicaz y debería ayudarlo en su camino.

Buena suerte.


Quizás desee considerar echar un vistazo a Conceptos de sistemas operativos, de Abraham Silberschatz : comprender los conceptos de programación de sistemas es un requisito fundamental, eche un vistazo al interior del kernel F / OSS de OSes linux * BSD y GNU/Linux , especialmente versiones anteriores, que probablemente estén un poco más documentados. alt text http://ecx.images-amazon.com/images/I/51zezQiqYYL._SL500_AA240_.jpg alt text http://ecx.images-amazon.com/images/I/51NEmsW4TCL._SL500_AA240_.jpg


Si no te importa usar la virtualización de hardware, hay un curso (libro + conferencias + software) que te llevará ''De Nand a Tetris''. Usted mismo crea un sistema completo de computadora desde la puerta NAND eléctrica (para estos propósitos atómica y dada), hasta la construcción del sistema operativo, un lenguaje y, finalmente, la codificación de un juego simple en su máquina personal.

Creo que es una gran idea y algo en lo que tengo la intención de quedar atrapado pronto. El libro es sorprendentemente barato y creo que el curso se imparte en el MIT. No puedo imaginar una sensación mayor que tener el conocimiento completo y completo de un sistema completo que construiste desde cero.

Enlace: http://www1.idc.ac.il/tecs/


Sugeriría que trabajes, al menos al principio, en Bochs u otra máquina virtual, ya que puedes llevarlo donde quieras, es más fácil depurarlo (puedes ver el estado exacto del hardware), y si necesita ayuda externa para la eliminación de fallas, pueden usar exactamente el mismo ''hardware'' que usted.

El consejo más útil que tengo es ponerme en un estado en el que pueda ejecutar el código C lo más rápido posible, es decir, iniciar, configurar las tablas de descriptores y llegar al punto donde sea seguro ejecutar C. compilada si no todo el kernel debería estar en C si quiere mantenerse sano y seguir trabajando en él. El montaje, aunque se requiere en algunos lugares, es tedioso y tiende a ser difícil de depurar.


Tienes un objetivo ambicioso Pero la ejecución es clave.

La mayoría de los enfoques estructurados (libro de texto o clase universitaria) lo guiarán a lo largo del proceso, pero brindan gran cantidad del código esencial que oculta los detalles arcanos de la plataforma elegida y le permite enfocarse en las ideas generales: programación de procesos, administración de memoria, prevención de interbloqueos, E / S, etc.

Mi consejo es este: reduzca sus expectativas y comience con una pregunta básica.

¿Qué es un sistema operativo?

Un científico informático (con suerte) nunca dirá que un sistema operativo es una interfaz gráfica de usuario o un navegador web, o una forma de conectar dispositivos USB, o cualquier cosa que el usuario pueda ver o tocar. En cambio, un sistema operativo en su nivel más fundamental son esas cosas que mencioné anteriormente. Todos caen bajo un gran paraguas: gestión de recursos.

Un sistema operativo no es más que un programa que administra los recursos de hardware de la computadora: memoria, CPU y periféricos.

Aquí hay un sistema operativo simple: un programa le permite al usuario ingresar un programa (en hexadecimal o binario) usando una conexión en serie. Una vez que el programa ha sido escrito, ejecuta el programa. Cuando el programa finaliza, se devuelve el control al usuario donde puede ejecutar el programa nuevamente o escribir uno nuevo.

Haga esto en una arquitectura "limpia" como un procesador ARM incrustado con 64K de memoria más o menos. Puede codificar esto en conjunto después de unos días de aprender los pormenores del ARM. Y voila! , tienes un sistema operativo.

Hace todo lo que un sistema operativo debe hacer:

  • Gestiona la memoria al no permitir que el usuario sobrescriba el sistema operativo.
  • Programa un único proceso para ejecutar.
  • Maneja la E / S a un solo periférico serial.

Esto te da un bloque de construcción para comenzar. Tienes muchas opciones ahora. Quizás uno de ellos sería permitir que dos programas se carguen en la memoria y dejar que el usuario decida cuál ejecutar luego.

O bien, puede dejar que el usuario suspenda la ejecución de un programa, cambiar al otro, suspender y volver atrás. Esto es una multitarea rudimentaria, a pesar de que es completamente manual.

Sus opciones son ilimitadas, pero cada una es un paso de bebé de lo que tenía antes.

¡Es divertido si no miras demasiado alto!


Veo muchas buenas referencias a sitios de desarrollo de SO, así que describiré un enfoque diferente:

Si desea la experiencia de implementar un sistema operativo desde cero, existen mejores opciones de hardware que una PC anterior. Con la arquitectura de PC, gastará una cantidad desmesurada de su tiempo de codificación en artefactos poco interesantes de su historial de diseño de 30 años. Por ejemplo, solo la parte del gestor de arranque del proyecto probablemente ha quemado a muchos valientes programadores.

Por ejemplo, necesitará un juego de controladores para leer su kernel fuera del disco y / o la red. Entonces necesitarás un código para entrar en modo protegido. En ese punto, ¡necesitas otro conjunto de drivers! Muy poco del trabajo que haga para obtener el chip en modo protegido será transferible después de ese punto. Desea ejecutarlo en una PC diferente + 4 años y necesitará otro conjunto de controladores.

Mire en el arranque de un ARM u otro chip "incrustado" de 32 bits. ¡Hay tableros de desarrollo baratos disponibles, o puede soldar los suyos! Algunos tienen ethernet y usb incorporados. Creo que se divertirán más trabajando en una arquitectura sana y no crujiente, y tal vez terminen con algunas habilidades reutilizables.


http://www.osdev.org/ y http://www.osdever.net/

Bienvenido al mundo de desarrollo de SO.

Consulte también otros enlaces de documentación x86 en la wiki de etiquetas x86 de SO: manuales de Intel y AMD, documentos de compilador / ensamblador y varias guías.

También sugiere utilizar BOCHS u otro entorno virtual para la depuración, ya que puede hacer un solo paso en su gestor de arranque y examinar los registros.


echa un vistazo a MikeOS . Es un sistema operativo bastante simple, escrito, es legible (como en el comentario). Aunque es bastante simple, tiene una GUI y admite algunas redes y multimedia.

editar : MenuetOS es gráfico. También está escrito es asm recta, pero es más sofisticado que MikeOS