¿Cómo puedo construir un pequeño sistema operativo en una vieja computadora de escritorio? [cerrado]

StackOverflow https://stackoverflow.com/questions/1224617

Pregunta

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

  • No espero construir el próximo Linux o Windows.

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

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

Este es un proyecto futuro, ya que estoy ocupado con otras cosas en este momento y no tengo tiempo de inmediato, pero pensé en preguntarlo ahora, así que tal vez podría obtener muchas respuestas a esto, y podría acumularse y ser un recurso útil para este tipo de enfoque (todo lo demás que he visto implicaba construir desde minix, usar un cargador de arranque existente, construirlo 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 en blanco .

Quiero aprender a escribir mi propio gestor de arranque (he encontrado muchos recursos sobre esto, pero para completar, aún 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 hacerlo la mayoría de las computadoras desde una memoria USB?

  • ¿Qué controladores necesito y puede sugerirme alguna referencia para construirlos?

  • Después de la secuencia de arranque, ¿entonces qué? ¿Cómo entro en 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?

  • ¿Con qué me encontraré sin duda 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 haría algo como una línea de comando, con 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 se ejecutan una al lado de la otra).

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

Créeme, entiendo que este es un proyecto muy complicado, y probablemente nunca podré completarlo o escribir nada sobre él de alguna utilidad.

Hay muchas otras piezas en esto que no he mencionado, si piensa en alguna, siéntase 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 a tener en cuenta, etc.

Además, no sugiera construir a partir de otra O / S o código preexistente. Sé que leeré una gran cantidad de código preexistente (como el kernel de Linux, o recursos de ejemplo, controladores existentes, etc.), pero finalmente quiero escribir todo yo mismo. Sé que debería construir a partir de otra cosa, y hay muchas otras preguntas sobre SO que puedo leer si cambio de opinión y sigo esa ruta. Pero este se trata de hacer todo desde cero.

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

¿Fue útil?

Solución

Primero lo primero. Leer, leer, leer, leer, leer. 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 SO en la universidad:

PDF de sistemas operativos modernos

Sistemas operativos modernos en Amazon

A pesar de la ridícula portada, es una lectura fantástica, especialmente para un libro de texto. Tanenbaum es realmente un experto en esta área y sus explicaciones sobre cómo funciona el sistema operativo debajo del capó son claras y fáciles de entender. Este libro es principalmente teórico, pero creo que él también tiene un libro que discute más sobre la implementación. Sin embargo, nunca lo he leído, así que no puedo comentarlo.

Eso debería ayudarlo a mejorar la administración de procesos, la administración de memoria, los sistemas de archivos y todo lo que su núcleo del sistema operativo necesita para llevarlo a un estado de arranque. A partir de ese momento, se trata básicamente 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 operativos del procesador.

Si tiene algún conocimiento de electrónica, puede ser más fácil comenzar a escribir un sistema operativo para un dispositivo integrado que tenga una amplia documentación, porque generalmente será más simple que una PC x86. Siempre quise escribir mi propio sistema operativo, y estoy comenzando a escribir un sistema operativo integrado de microkernel para Esta placa de desarrollo 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 Digilent tiene un UART integrado, por lo que puedo usar de manera efectiva la salida en serie como mi consola para poner todo en marcha y arrancar en una línea de comandos con un mínimo de alboroto.

Solo asegúrate de que cualquier cosa que elijas apuntar tiene un compilador disponible y bien probado. no desea escribir un sistema operativo y un compilador al mismo tiempo.

Otros consejos

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 tag wiki : manuales de Intel y AMD, documentos del compilador / ensamblador y varias guías.

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

Sugeriría trabajar, al menos al principio, en Bochs o en alguna otra máquina virtual, la razón es que puede llevarlo a donde quiera, es más fácil de depurar (puede ver el estado exacto del hardware), y si necesita ayuda externa para la depuración, pueden usar exactamente el mismo 'hardware' que usted.

El consejo más útil que tengo es que te pongas en un estado en el que puedas ejecutar el código C lo más rápido posible, es decir, arrancar, configurar tus tablas de descriptores y llegar a un punto donde sea seguro ejecutar compilado C. La mayoría, si no todo, el núcleo debería estar en C si desea mantenerse cuerdo y seguir trabajando en él. El ensamblaje, aunque se requiere en algunos lugares, es tedioso y tiende a ser difícil de depurar.

En su nivel más bajo, lo mínimo que un sistema operativo debe poder hacer es manejar el hardware de un sistema de alguna manera y de alguna manera cargar y ejecutar algún tipo de "código de usuario". Si va a comenzar con una PC, debe escribir un código que pueda cargarse desde un dispositivo u otro. Las PC más antiguas tienen un BIOS en el firmware que determina cómo el hardware realiza una 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 ... lo cual es en gran medida una diferencia pedante; sirven para los mismos propósitos para esta discusión).

Comience por aprender los detalles de bajo nivel de cómo usar el BIOS u otro firmware en su sistema de destino. Es decir, aprenda a escribir un programa que el BIOS pueda cargar y ejecutar. Eso eventualmente se transformará en su 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 unidad de memoria USB, sería un buen comienzo ... o en un disco duro si lo desea).

A partir de ahí, recomendaría escribir un controlador en serie muy simple ... actualice su gestor de arranque para inicializar algún puerto en serie e inicie una descarga desde allí. Luego puede ejecutar el código que extrae. A partir de ahí, escriba un poco de arranque que pueda escribir en otro conjunto de bloques (aún no hemos implementado un sistema de archivos ... ni siquiera el análisis de la tabla de particiones; por lo tanto, al principio solo nos ocuparíamos de los rangos sin procesar de bloques en el disco ).

En ese punto, 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 algún tipo de manejo de la tabla de particiones ... si corresponde a las convenciones estándar de PC depende de usted en este punto) y ejecútelo.

Desde allí, debería poder trabajar en funciones mucho más sofisticadas. Desde esta base, puede escribir y compilar un nuevo '' kernel '' ... reinicie su banco de pruebas y despliegue el nuevo núcleo en él.

(Su gestor de arranque debería tomar alguna señal, como un DESCANSO sobre las líneas de apretón de manos 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í escribir una capa terminal muy simple y un shell de comando? ¿Un sistema de archivos? Implemente comandos para descargar nuevo contenido ejecutable que no sea el kernel (archivos u objetos de algún tipo). Y así sucesivamente.

Naturalmente, podría haber comenzado con un controlador de consola utilizando el teclado y el video de la PC (el BIOS INT 0x16h y el INT 0x10H, respectivamente, si recuerdo correctamente). Sin embargo, sugeriría 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. Dado que su nuevo sistema operativo comenzará como un proyecto de compilación cruzada, será esencial que tenga una forma simplificada de manejar eso.

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

Si no le importa usar la virtualización de hardware, hay un curso (libro + conferencias + software) que lo llevará 'De Nand a Tetris'. Usted crea un sistema informático completo por su cuenta desde la compuerta NAND eléctrica (para estos fines, 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 quedarme atrapado pronto. El libro es sorprendentemente barato y creo que el curso se imparte en el MIT. No puedo imaginar una sensación más grande que tener el conocimiento completo y completo de un sistema completo que usted mismo construyó desde cero.

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

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

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

temas específicos.

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

El BIOS realizará el arranque básico.


¿Qué controladores necesito? ¿Puede sugerirme alguna referencia para construirlos?

cualquier cosa que no sea operaciones directas de CPU / memoria. 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 en modo protegido, etc.?

El modo protegido formará parte de la secuencia de arranque.

luego comienzas la multitarea y descubres cómo iniciar los 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 querrá resolver un sistema de memoria virtual eventualmente.


¿Qué me encontraré sin duda 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 pena. Busque Windows 3.1 y Linux, en particular X windows.


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

Buscar X ventanas.


consejo final: estudie linux / x windows. No es perfecto, pero proporciona una comprensión del enfoque one . También estudie los sistemas embebidos.

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, hay muchas mejores opciones de hardware que una PC antigua. Con la arquitectura de PC, pasará una cantidad excesiva de tiempo codificando artefactos poco interesantes de su historia de diseño de 30 años. Por ejemplo, solo la parte del gestor de arranque del proyecto probablemente ha quemado a muchos programadores valientes.

Por ejemplo, necesitará un conjunto de controladores para leer su núcleo fuera del disco y / o la red. Entonces necesitarás código para entrar en modo protegido. En ese punto, ¡necesitas otro conjunto de controladores! Muy poco del trabajo que realice para poner 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.

Examine el arranque de un ARM u otro "incrustado" de 32 bits chip. Hay tableros de desarrollo económicos disponibles, ¡o puede soldar los suyos! Algunos tienen ethernet y usb incorporados. Creo que te divertirás más trabajando en una arquitectura sensata y no crujiente, y tal vez termines con algunas habilidades reutilizables.

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. Abarcan todo, desde cambiar de modo (real / protegido) a la gestión de memoria virtual (si elige ir tan lejos) hasta hacer syscalls (si alguna vez llega al modo de usuario). Lo más importante explican con gran detalle una serie de cosas que deben configurarse para que funcionen, como el TSS y los registros de segmento, que la mayoría de los textos del sistema operativo no discuten porque están más preocupados por conceptos de nivel superior que los detalles específicos del procesador.

La OS Development Series @ BrokenThorn puede interesarle.

Intente leer el código de un SO pequeño y básico de código abierto, 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. Interfaz con SDL para teclado, mouse, pantalla, acceso de audio. Hazlo simple para que puedas caber todo en tu cabeza a la vez. No necesita ser una máquina virtual de vanguardia, 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 de máquina.
  3. Defina un formato ejecutable y escriba un enlazador simple.
  4. ¡Tienes todas las partes para escribir tu sistema operativo ahora! Escríbalo en el lenguaje ensamblador, ensamblelo ... 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.

echa un vistazo a MikeOS . Es un sistema operativo bastante simple escrito que 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 como asm directo, pero es más sofisticado que MikeOS

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 través del proceso, pero brindan una gran cantidad de código esencial que pasa por alto los detalles arcanos de la plataforma elegida y le permite concentrarse en lo grande. ideas de imágenes: programación de procesos, gestión de memoria, prevención de interbloqueo, 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 un usuario pueda ver o tocar. En cambio, un sistema operativo en su nivel más fundamental son las cosas que mencioné anteriormente. Todos caen bajo un gran paraguas: la gestión de recursos.

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

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

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

Hace todo lo que se supone que debe hacer un sistema operativo:

  • Administra la memoria al no permitir que el usuario sobrescriba el sistema operativo.
  • Programa la ejecución de un solo proceso.
  • Maneja la E / S al periférico serial único.

Esto le 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 a continuación.

O podría permitir que el usuario suspenda la ejecución de un programa, cambie al otro, suspenda y vuelva a cambiar. Esta es una multitarea rudimentaria, aunque es completamente manual.

Sus opciones son ilimitadas, pero cada una es un pequeño paso de lo que tenía antes.

¡Es divertido si no te fijas demasiado alto!

Mantengo una lista de recursos en StackOverflow: Cómo comenzar en el desarrollo del sistema operativo . Agregue nuevos recursos a medida que comience su aventura (estoy a punto de comenzar :))

Muchas escuelas tienen clases de SO que hacen mucho de lo que usted describe. Mi escuela (CMU) enseñó SO en C, y escribimos un núcleo, un sistema de archivos y un shell, y se nos proporcionó el código para un cargador de arranque.

Desafortunadamente, 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 tareas para escuelas que tienen buenos recursos en la web.

Puede disfrutar de este tutorial llamado " Ruede su propio juguete UNIX -clone OS " ;, es muy perspicaz y debería ayudarte en tu camino.

Buena suerte.

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

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 duda que me confundirá?

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

No se preocupe por los disquetes y demás, la mayoría de las veces utilizará un emulador como Bochs o QEmu.

Puede considerar echar un vistazo a Conceptos de sistemas operativos, por Abraham Silberschatz - Comprender los conceptos de programación de sistemas es un requisito fundamental, eche un vistazo a las partes internas del kernel F / OSS de OSes linux * BSD y GNU / Linux , especialmente las versiones anteriores, que probablemente estén un poco más documentadas.  texto alternativo texto alternativo ??

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

Es muy fácil gracias al hecho de que el BIOS ya tiene muchas funciones de entrada / salida incorporadas 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, esa 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 en el disco duro.

Este artículo de Wikipedia debería ayudarlo 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 recomendaría leer la programación de ensamblaje, ya que es vital para comprender cómo funciona el hardware.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top