Esto podría ser en vano, ya que sé que escribir un sistema operativo es insoportablemente complicado (especialmente para uno mismo).
No espero construir el próximo Linux o Windows.
Sé que será horrible, tendrá errores y no funcionará, pero está bien.
Quiero escribir todo yo mismo, en Ensamblador , C y (algo) C ++ .
Este es un proyecto futuro, ya que estoy ocupado con otras cosas en este momento y no tengo 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 involucró la construcción de minix, el uso de un cargador de arranque existente, la construcción en un programa de arranque virtual, etc.).
Quiero configurar una de mis computadoras de escritorio más antiguas 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, 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 una memoria USB?
¿Qué controladores necesito y puede sugerir alguna referencia para construirlos?
Después de la secuencia de arranque, ¿luego qué? ¿Cómo entro en modo protegido, etc.
¿Cómo administro la memoria sin la ayuda de un sistema operativo? ¿Utilizo las direcciones que quiero? ¿No es necesaria la inicialización?
¿Qué me encontraré sin duda alguna que me confundirá?
¿Cómo puedo convertirlo en un O / S de línea de comandos y uno gráfico?
¿En qué se basa un O / S gráfico? Como, ¿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 cómo configurar 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 podría configurar una especie de sistema de ventanas? ¿Cómo muestro gráficos en la pantalla una vez configurada la multitarea simple?
Créame, entiendo que este es un proyecto muy complicado, y probablemente nunca lo completaré ni escribiré nada de utilidad.
Hay muchas otras piezas a esto que no he mencionado, si piensas en alguna, no dudes en agregarlas también.
Por favor escriba 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 otro 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 en última instancia, quiero escribir todo yo mismo. Sé que debería basarme en algo más, y hay muchas otras preguntas en SO sobre eso que puedo leer si cambio de opinión y sigo ese camino. 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.?
fuente
Respuestas:
Lo primero es lo primero. Leer, leer, leer, leer, leer. Debe tener un conocimiento firme de cómo funciona el sistema operativo antes de poder implementar el suyo.
Coge 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 teoría, pero creo que también tiene un libro que trata 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 demás que el kernel de su sistema operativo necesita hacer para que esté en un estado de arranque. A partir de ese momento, se trata básicamente de escribir controladores de dispositivos para el hardware que necesita admitir y ofrecer implementaciones de las funciones de la biblioteca C para realizar llamadas al kernel para cosas como abrir archivos y dispositivos, leer y escribir, pasar mensajes entre procesos, etc. .
Lea sobre el ensamblaje x86 (asumiendo que está diseñando esto para una máquina x86). Eso debería responder a muchas de sus preguntas con respecto al cambio entre los modos de funcionamiento del procesador.
Si tiene algún conocimiento de electrónica, puede ser más fácil comenzar escribiendo 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 también, y estoy empezando 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.
Uno de los beneficios de un dispositivo integrado es también que puede evitar escribir un controlador VGA durante mucho tiempo. En mi caso, la placa de desarrollo de Digilent tiene un UART integrado, por lo que puedo usar eficazmente la salida en serie como mi consola para poner todo en funcionamiento y arrancar en una línea de comandos con un mínimo de problemas.
Solo asegúrese de que cualquier cosa que elija tener como destino tenga un compilador bien probado y disponible para ello. Usted no quiere estar escribiendo un sistema operativo y un compilador al mismo tiempo.
fuente
http://www.osdev.org/ y http://www.osdever.net/
bienvenido al mundo del desarrollo de SO.
Consulte también otros enlaces de documentación x86 en SO x86 tag wiki : manuales de Intel y AMD, documentos de compilador / ensamblador y varias guías.
También sugiere usar BOCHS u otro entorno virtual para la depuración, ya que puede realizar un solo paso con su cargador de arranque y examinar los registros.
fuente
Sugeriría trabajar, al menos al principio, en Bochs o en alguna otra máquina virtual, ya que puede llevarlo a donde quiera, es más fácil de depurar (puede ver el estado exacto del hardware) y si necesitan ayuda externa para depurar, 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 código C lo más rápido posible, es decir, arrancar, configurar las tablas de descriptores y llegar a un punto en el que sea seguro ejecutar C compilado. si no, todo el kernel debería estar en C si quiere mantenerse cuerdo y seguir trabajando en él. El ensamblaje, aunque es necesario en algunos lugares, es tedioso y tiende a ser difícil de depurar.
fuente
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 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 ... lo cual es en gran medida una diferencia pedante; sirven los mismos propósitos para esta discusión).
Así que comience por conocer los detalles de bajo nivel sobre 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 una unidad flash 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 cargador de arranque para inicializar algún puerto en serie e inicie una descarga desde allí. Entonces puede ejecutar el código que extrae. 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 la tabla de particiones; por lo que solo trataríamos con rangos sin procesar de bloques en el disco al principio ).
En ese punto, su cargador de arranque debería poder extraer nuevo código a través de la línea serial, volcarlo en una partición (sí, implementar el manejo de la tabla de particiones de algún tipo ... si se ajusta a las convenciones estándar de PC depende de usted en este momento ) y ejecútelo.
A partir de ahí, 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 haga que se implemente el nuevo kernel.
(Su cargador de arranque debería tomar alguna señal, como un BREAK sobre las líneas de protocolo de enlace en serie como un comando para omitir la descarga y simplemente arrancar la imagen existente; y debería manejar algún tiempo de espera de esta manera también).
A partir de ahí, ¿escribir una capa 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 utilizando el teclado y el video de la PC (las cosas BIOS INT 0x16h e INT 0x10H, respectivamente, si recuerdo bien). 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é hasta dónde quiere llevar su proyecto. Un objetivo razonablemente impresionante sería lograr el "alojamiento propio". Si puede crear un ensamblador / compilador simple que le permita usar su nuevo sistema operativo para (volver a) construir, vincular y arrancar en una versión funcional de su nuevo sistema operativo ... entonces ha logrado ese objetivo. (Tenga en cuenta que no es un requisito. Muchos sistemas integrados nunca serán autohospedados y no hay nada de malo en ello).
fuente
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 completamente usted mismo desde la puerta 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 plena 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 más grande que tener el conocimiento completo y completo de todo un sistema que usted mismo construyó desde cero.
Enlace: http://www1.idc.ac.il/tecs/
fuente
Comenzaría poco a poco y compraría un kit de desarrollo integrado 8086 y desarrollaría un sistema operativo multitarea en eso. Una vez que tenga un kernel y esté familiarizado con el trabajo a nivel de hardware, estará listo para hacer algo más desafiante.
Crear incluso un clon de DOS con 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? ¿Pueden la mayoría de las computadoras hacerlo desde una memoria USB?
El BIOS hará un arranque elemental.
¿Qué controladores necesito y puede sugerir 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, ¿luego qué? ¿Cómo entro en modo protegido, etc.
El modo protegido será parte de la secuencia de arranque.
luego comienza a realizar múltiples tareas y descubre cómo iniciar los procesos.
¿Cómo administro la memoria sin la ayuda de un sistema operativo? ¿Utilizo las direcciones que quiero? ¿No es necesaria la inicialización?
Correcto. Probablemente querrá ordenar un sistema de memoria virtual eventualmente.
¿Qué me encontraré sin duda alguna que me confundirá?
no tener herramientas de depuración, no tener IO
¿Cómo puedo convertirlo en un O / S de línea de comandos y uno gráfico?
Con dolor. Busque Windows 3.1 y Linux, en particular X Windows.
¿En qué se basa un O / S gráfico? Como, ¿cómo haría algo como, una línea de comando, con una fuente y una imagen en la parte superior?
Busque X ventanas.
consejo final: estudie linux / x windows. No es perfecto, pero proporciona una comprensión de un enfoque. También estudie sistemas embebidos.
fuente
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 opciones de hardware mucho mejores que una PC antigua. Con la arquitectura de la PC, pasará una cantidad desmesurada de su tiempo codificando artefactos poco interesantes de sus 30 años de historia de diseño. Por ejemplo, solo la parte del proyecto del gestor de arranque probablemente haya quemado a muchos programadores valientes.
Por ejemplo, necesitará un conjunto de controladores para leer su kernel fuera del disco y / o la red. Entonces necesitará código para entrar en modo protegido. En ese momento, ¡necesita otro conjunto de controladores! Muy poco del trabajo que haga 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.
Busque arrancar un ARM u otro chip "integrado" de 32 bits. Hay disponibles placas de desarrollo económicas, ¡o puede soldar las suyas propias! Algunos tienen ethernet y usb integrados. Creo que te divertirás más trabajando en una arquitectura sana y no crujiente, y tal vez termines con algunas habilidades reutilizables.
fuente
Más que cualquier otra cosa, si desea que esto se ejecute en hardware real, es absolutamente necesario una copia del manual de su procesador. Los manuales de Intel ( http://www.intel.com/products/processor/manuals/ ) son invaluables. Repasan todo, desde el cambio de modos (real / protegido) hasta la gestión de la memoria virtual (si elige ir tan lejos) hasta la realización de llamadas al sistema (si alguna vez llega al modo de usuario). Lo más importante es que explican con gran detalle una serie de cosas que deben configurarse para que las cosas 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 relacionados con conceptos de nivel superior que con el procesador. detalles específicos.
fuente
La serie de desarrollo de SO @ BrokenThorn podría interesarle.
fuente
Intente leer el código de un sistema operativo pequeño y básico de código abierto, como MikeOS.
Alternativamente, sugiero los siguientes pasos (¡deberían ser divertidos!):
Los pasos anteriores pueden parecer un poco estúpidos para escribir un sistema operativo simple, pero es muy divertido.
fuente
echa un vistazo a MikeOS . Es un sistema operativo bastante simple escrito y legible (como en el comentario) ensamblado. Aunque es bastante simple, tiene una GUI y es compatible con algunas redes y multimedia.
editar : MenuetOS es gráfico. También está escrito en conjunto, pero es más sofisticado que MikeOS.
fuente
Tienes un objetivo ambicioso. Pero la ejecución es clave.
La mayoría de los enfoques estructurados (libros de texto o clases universitarias) lo guiarán a través del proceso, pero brindan gran parte del código esencial que pasa por alto los detalles arcanos de la plataforma elegida y le permite concentrarse en las ideas generales: programación de procesos, administració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, un navegador web, 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 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 escribir un programa (en hexadecimal o binario) usando una conexión serial. Una vez que se ha escrito el programa, lo ejecuta. Cuando el programa está terminado, el control se devuelve al usuario donde puede ejecutar el programa nuevamente o escribir uno nuevo.
Haga esto en una arquitectura "limpia", como un procesador ARM integrado con 64 K de memoria aproximadamente. Puede codificar esto en ensamblador después de unos días de aprender los entresijos del ARM. ¡Y listo! , tienes un sistema operativo.
Hace todo lo que se supone que debe hacer un sistema operativo:
Esto le da un bloque de construcción para comenzar. Ahora tienes muchas opciones. 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 puede 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 pone la mira demasiado alta!
fuente
Mantengo una lista de recursos en StackOverflow: Cómo comenzar en el desarrollo del sistema operativo . Agregue nuevos recursos al comenzar su aventura (estoy a punto de comenzar :))
fuente
Muchas escuelas tienen clases de SO que hacen mucho de lo que usted describe. Mi escuela (CMU) enseñó SO en C, y escribimos un kernel, 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 quizás la gente podría publicar enlaces a fuentes y asignaciones para escuelas que tienen buenos recursos en la web.
fuente
Puede disfrutar de este tutorial llamado "Roll your own toy UNIX-clone OS", es muy perspicaz y debería ayudarlo en su camino.
Buena suerte.
fuente
Estudie el sistema A2 (anteriormente llamado sistema Oberon ) en busca de ideas que pueda robar. Es un sistema operativo gráfico construido por solo dos personas, aunque es cierto que una es Niklaus Wirth. Lanzado por primera vez alrededor de 1990 y la velocidad es asombrosamente buena. Hay un libro de Gutknecht.
fuente
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).
Te darás cuenta de que en la PC hay un montón de cosas que no están claras: el conjunto de instrucciones x86 en sí es complicado, y cuando obtienes acceso directo al hardware, puede pasar bastante tiempo antes de que entiendas cómo escribir un solo carácter en la pantalla. .
No se preocupe por el disquete y demás, la mayoría de las veces utilizará un emulador como Bochs o QEmu.
fuente
Es posible que desee considerar echar un vistazo a los conceptos de sistemas operativos, por Abraham Silberschatz : comprender los conceptos de programación de sistemas es un requisito fundamental, eche un vistazo a los componentes internos del kernel de F / OSS de los sistemas operativos linux * BSD y GNU / Linux , especialmente las versiones anteriores, que probablemente estén un poco más documentados.
fuente
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 podría recibir un pago por sus contribuciones.
fuente
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, 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 del disco duro.
Este artículo de Wikipedia debería ayudarlo a comenzar con las interrupciones del BIOS para escribir texto en la pantalla, recibir teclas del teclado y otras cosas. https://en.wikipedia.org/wiki/BIOS_interrupt_call
Incluso si planea usar c ++, le recomiendo encarecidamente leer sobre programación en ensamblador, ya que es vital para comprender cómo funciona el hardware.
fuente