Mejor respuesta
Depende de lo que quieras decir con sistema operativo. Una vez escribí un sistema de cola simple que ejecutaría múltiples sesiones de protocolo en forma de turnos. Pero se ejecutó bajo un sistema operativo estándar. Cuando los microcontroladores aparecieron por primera vez para sistemas integrados, los ingenieros generalmente escribían su propio sistema operativo rudimentario como se indica en una de las otras respuestas.
El sistema operativo útil más pequeño que he usado que tenía las características básicas de una operación multitarea -el sistema de estantería se llamaba QNX. Era un sistema Unix reducido y se ejecutaba en la primera PC de IBM. No tenía gráficos elegantes, pero podía desarrollar cómodamente software en él. De hecho, la única diferencia real con una máquina moderna era la interfaz de usuario con colores y gráficos. Básicamente, la introducción de DOS por parte de IBM hizo retroceder a la industria de la computación al menos 10 años. Había varios sistemas operativos superiores (que podrían haber sido adaptados) o en desarrollo en ese momento y, por supuesto, Unix establecía el estándar.
Respuesta
Acabo de terminar de desarrollar un núcleo para una clase ( CS-4284 Systems & Networking Capstone ) durante mi último semestre en la escuela. Anteriormente, tomé una clase de SO que tiene como objetivo trabajar con el SO desde la perspectiva del programador, y no desde la perspectiva de un diseñador de SO. Estar involucrado en el desarrollo del SO y del kernel durante el último año y medio (no es mucho tiempo, pero he aprendido mucho), esto es lo que recomiendo:
1. Maestro C No puedo enfatizar más esto. No realmente, domínalo. El desarrollo del sistema operativo es difícil. Incluye muchos conceptos que realmente necesitas para dominar C, por lo que no se interpone en tu camino. Por ejemplo, tome la tubería Unix (escrita | en un shell). Para desarrollar una tubería en su sistema operativo, necesita comprender muy bien el sistema de archivos del sistema operativo y la estructura de archivos. Es un problema típico de búfer delimitado (consumidor / productor) y tendrá que lidiar con toda la sincronización. Debe estar atento a la memoria virtual mientras la escribe. Además, Unix es típicamente BYOB (traiga su propio búfer). necesitará administrar adecuadamente el búfer que el usuario ha proporcionado, etc. Lo último que querría hacer aquí es lidiar con problemas básicos de C, como punteros y administración de memoria (nota: la administración de la memoria en el sistema operativo es 10 veces más difícil que la administración de la memoria C: debe tener en cuenta los espacios de direcciones de usuario y de kernel)
2. Kernel frente a SO Necesita comprender la diferencia entre un kernel y un SO. Un kernel es esencialmente el cerebro del SO. El SO es un conjunto de aplicaciones agrupadas. Por ejemplo, Mac OS X incluye: un kernel, la interfaz (GUI), aplicaciones estándar integradas (Finder, que es solo una abstracción de visualice el sistema de archivos, TextEdit, un shell, etc.)
3. No se sumerja directamente en Es imposible comenzar haciendo el desarrollo del kernel en cuestión de días o semanas. Le sugiero que comience con lo siguiente:
- Familiarícese con los pasos de compilación de GCC (qué sucede cuando ejecuta gcc, cómo se produce un ejecutable y qué sucede cuando ejecuta el programa). También puede escribir un ensamblador simple en C (tome el código ensamblador como código de máquina de entrada y salida. Esto requiere que comprenda qué secciones .data, .text y .bss están en ensamblador (muy útil abajo el camino para comprender la memoria virtual del sistema operativo). También comprenderá el direccionamiento a nivel de máquina y cómo se resuelven las ramas.
- Familiarícese con mach herramientas y programas de nivel ine. Sugiero hacer el laboratorio de bombas, porque hay muchos materiales educativos disponibles para ello. Solo laboratorio de bombas de Google.
- Familiarícese con los ataques básicos del sistema operativo. Sugiero mirar el desbordamiento del búfer por la misma razón que el punto 1 (laboratorio de desbordamiento del búfer de Google).
- Aprenda sobre las llamadas al sistema, los subprocesos y los procesos en C. A partir de ahí, desarrolle su propio shell en C.
- Aprenda acerca de la asignación de memoria e implemente malloc y gratis en C. Aprenda sobre las compensaciones de diseño, las estrategias de asignación, las estrategias de liberación, etc.
- Aprenda sobre multiproceso y multiprocesamiento en C. A partir de ahí, sumérjase en los mecanismos de sincronización (bloqueos, mutex, semáforos) y desarrolle un grupo de subprocesos en C, que otros programas pueden usar.
4. Ahora, puede comenzar el desarrollo del kernel de SO real pero simplificado En este punto, puede comenzar a desarrollar en un SO real como diseñador de SO. Google Stanford Pintos y obtendrá acceso a un pequeño núcleo educativo desarrollado en Stanford. Viene con documentación y un conjunto de 4 proyectos. Puede buscar en Google algunas escuelas que tienen diapositivas de conferencias para Pintos. Sugiero comprar Operating System Concepts ( Amazon.com: Operating System Concepts (9781118063330): Abraham Silberschatz, Peter B.Galvin, Greg Gagne: Libros ). La documentación está bastante bien y los proyectos están bien explicados. El sistema operativo también incluye pruebas que puede ejecutar ejecutando `make check`, para que pueda ver si» ha hecho las cosas correctamente o no «.
5. Puede comenzar a contribuir a Linux . Se necesitará mucho esfuerzo para examinar el código fuente y las decisiones de diseño de Linux (que son mucho más complicadas que las de Pintos), pero creo que en este punto, podrá al menos comenzar. Con más práctica y lectura, podrá retomarlo.
Acabo de completar el paso 4. Me encantaron los pasos del 1 al 3, pero, francamente, a la mitad del 4 me di cuenta de que no estoy TAN interesado en el desarrollo de SO. Me gustó mucho trabajar con el sistema operativo como programador (desde la perspectiva de un programador), pero no disfruté profundizar tanto. Sin embargo, aprendí mucho del desarrollo del kernel y te expone a muchas cosas. Además, si puede escribir un kernel, escribe cualquier pieza de software que exista. Recomiendo encarecidamente hacer al menos los primeros 3 pasos, ya que le brinda una gran comprensión del sistema operativo. Literalmente, se convertirá en un mejor ingeniero de software en general. Aprenderá a apreciar más los lenguajes de alto nivel y aprenderá a utilizar la herramienta, el lenguaje o la tecnología adecuados para el trabajo adecuado también.
Ya tengo una gran cantidad de material sobre desarrollo de sistemas operativos, proyectos, pruebas, etc. proporcionar proyectos y comentarios en los que trabajar.