Red de conocimiento informático - Material del sitio web - Cómo escribir un sistema operativo sencillo desde cero

Cómo escribir un sistema operativo sencillo desde cero

¿Cómo escribir un sistema operativo sencillo desde cero?

Leí esto: Escribe un sistema operativo simple desde cero. Por favor, dame algún consejo.

Al usuario de Zhihu solo le queda medio año de carrera estudiantil.

548 personas estuvieron de acuerdo

Finalmente puedo responder a esta pregunta...

Hace más de un año, al final del primer semestre de mi primer año , Vi que fui a la respuesta del tío @fleuria a esta pregunta y luego miré el enlace proporcionado por el tío F. Está basado en la implementación del kernel del sistema operativo de Bochs. Por supuesto, no pude entender nada, además de sorprenderme. También aprendí una cosa: una persona escribe un kernel de sistema operativo simple, algo muy atractivo y factible.

Entonces comencé a escribir. En ese momento, mi nivel probablemente era el siguiente: solo podía hacer ejercicios de lenguaje C, solo sabía presionar F9 al compilar, conocía instrucciones comunes de ensamblaje y. Sabía un poco de programación Win 32 y puedo usar Windows sin problemas.

Al principio busqué "30 días para crear su propio sistema operativo" y lo leí todos los días. Luego escribí el código del libro, lo compilé y lo ejecuté una y otra vez. Debido a que tuve que escribir ensamblador y C al mismo tiempo, comencé a usar vim a partir de ese momento.

Después de terminar casi la mitad del libro, comencé a sentir que era aburrido... porque sentía que el autor había omitido demasiados detalles para simplificar el contenido. También leí "El nacimiento de un sistema operativo de Orange" de Yu Yuan, pero todavía no pude leerlo: se utilizó demasiado ensamblaje. Durante este período, envié audazmente un correo electrónico al tío F y él me recomendó el tutorial de desarrollo del kernel de Bran, así que comencé de nuevo con este tutorial: parada "30 días para crear su propio sistema operativo" e inicio "OS67".

Probablemente fue el primer semestre de mi segundo año, así que abrí otro repositorio en github. Al principio lo desarrollé en Windows y luego cambié a Linux porque el gestor de arranque utilizado por Bran era Grub, que no cumplía con mi intención original. , Así que escribí uno yo mismo y luego seguí los tutoriales para escribirlo, crucé la barrera del modo protegido y completé el controlador básico del dispositivo.

Después de completar el de Bran, hice referencia parcial a ¿Qué tan difícil es escribir el kernel de un sistema operativo? ¿Cuáles son los contenidos y pasos generales? - Recomendado en la respuesta de To Qianmo: hurley25/hurlex-doc · Documento de GitHub, completa algunas funciones de depuración simples y funciones de biblioteca, printk y asignación de memoria.

Resulta que es muy importante escribir funciones de depuración como pánico, afirmación y impresión lo antes posible. El uso extensivo lo ayudará a encontrar errores lo más rápido posible (por supuesto, la premisa es que estas funciones en sí mismas no pueden tener errores).

Después de leer las partes necesarias de hurlex-doc, no supe qué hacer durante mucho tiempo y seguí recibiendo errores al intentar imitar el cambio de hilo del kernel en hurlex-doc. Esta situación duró hasta que comencé a leer Xv6, un sistema operativo de enseñanza simple tipo Unix.

Si observa las preguntas de Zhihu sobre el "kernel casero", encontrará que xv6 se menciona y recomienda repetidamente. De hecho, es muy digno de recomendación: esto es después de que leí la mayor parte del código. siéntelo.

Los documentos anteriores de Bran y Hurlex eran relativamente pequeños. Los leí en mi computadora y Kindle. El tamaño del código xv6 es relativamente grande, con 9000 líneas y un documento. Luego encontré esto: ranxian/xv6. -chino · La traducción al chino del documento GitHub xv6, así que fui a la imprenta de la escuela y gasté doce yuanes para imprimir un documento chino y un código. Esta fue otra buena decisión, ya que me permitió leer el código sin tener que enfrentarme a la computadora.

A continuación, primero leí las partes relacionadas con el sistema de archivos de xv6 y luego reescribí su código para agregar un sistema de archivos similar a Minix a mi kernel. Luego casi copié la parte de programación del proceso (con algunas simplificaciones), agregué la interfaz del sistema operativo basada en el código original y luego escribí el programa de usuario. El proceso fue casi "sin problemas". Mientras miraba xv6, a menudo me encontraba en un estado de iluminación.

Finalmente, finalmente completé este kernel de sistema operativo simple hace casi un mes:

LastAvenger/OS67 · GitHub (sí, en realidad estoy aquí para engañar a la estrella)

Me tomó un año y encendí muchos árboles de habilidades en el camino (aunque no todos se hicieron bien). ¿Se considera esto "escribir un sistema operativo simple desde cero"? Además, ¿quién no empieza de cero? Así que si quieres hacerlo, empieza a hacerlo ahora.

Este es el código fuente xv6 y el documento chino que ha sido "empañado" (en realidad estaba desgastado en una mochila escolar)

Ahora que se ha contado la "historia", hablemos de ello a continuación Hablando por experiencia...

* Siempre hay gente en Zhihu discutiendo temas como "¿Qué es más interesante, hacer un compilador de juguete o hacer un núcleo de juguete?", y luego está Siempre hay varios saltos grandes en V. Hablemos de qué tan sucio está el kernel y qué tan limpio está el compilador. De hecho, a excepción de algunas tablas en la CPU que son un poco desagradables por razones históricas, no hay nada particularmente sucio en el kernel. Además, quiero hacer algo para matar el tiempo, pero solo hay dos. Es un proyecto introductorio con una cantidad de código un poco mayor.

* En el proceso de escribir el kernel, entrarás en contacto con algunos conocimientos que probablemente solo utilizarás una vez en tu vida. La línea A20 se ha convertido en historia y no es necesario que la comprendas. Estructura de GDT IDT en la programación diaria. Pero la redundancia vale la pena sólo por el conocimiento que brinda sobre las partes principales del kernel (sistema de archivos, proceso, memoria).

* Implemente funciones de depuración lo antes posible y úselas ampliamente, y haga un buen uso del depurador integrado de bochs, que puede ahorrarle mucho tiempo.

* A veces siento que los métodos del libro son muy extraños. Si crees que tienes un método mejor, normalmente estás equivocado. (Por supuesto, es normal)

* Es falso decir que es un viaje sencillo con xv6. Pasé 20 horas copiando código y 80 horas depurando.

* Para personas con habilidades promedio como yo, "escribir el kernel" es solo una buena manera de decirlo. La forma correcta de decirlo es "copiar el kernel". Por supuesto, incluso si copias uno, te beneficiarás mucho.

* La ventaja de copiar xv6 es que incluso si su código comete un error, puede creer firmemente que la respuesta correcta debe estar en el código xv6. Tal vez aún no lo haya entendido completamente. Mientras sigas leyendo y comprendiendo, te acercarás cada vez más al camino correcto.

Finalmente, me gustaría agradecer a @fleuria por su ayuda en Weibo y correos electrónicos, a @To Qianmo por el documento hurlex-doc, a Xian Ran por el documento chino xv6 y a @Guo Jiahua por responder. Mi pregunta perfectamente. Las preguntas iniciales me permitieron usar el lenguaje C en el kernel.

También recibí ayuda de muchas personas en el canal #archlinuxcn.

Publicado el 09-11-2015

Qiu Yongchen, comediante e ingeniero de desarrollo

890 personas estuvieron de acuerdo

Cuando yo era estudiante de segundo año El profesor (Wan Hai de la Universidad Sun Yat-sen) nos dijo: "Si alguien puede escribir un núcleo por sí mismo, entonces no necesita asistir a conferencias ni hacer sus tareas habituales. Si lo hace, puede Obtén puntos extra. ¿Qué tal? ¿Hay alguien? ¿Estás interesado?

Después de algunas negociaciones con el maestro, me convertí en el único entre los cientos de personas en el grado que escribí el núcleo por mi cuenta. /no fui al salón de clases durante todo el semestre/no hice ninguna tarea (esto significa que no habrá nadie a mi alrededor que pueda brindarme referencias y tendré que buscar la información yo mismo).

Cuando compré por primera vez "30 días para crear su propio sistema operativo", decía que necesitaba disquetes y otros emuladores. Mi intención original era escribir uno que pudiera grabarse en una máquina real y. ejecutar simplemente presionando el botón de encendido, así que lo tiré después de leer algunas páginas. Más tarde encontré otro libro escrito por un chino, pero no era particularmente adecuado, así que lo tiré.

En ese momento vi el libro de texto (comúnmente conocido como Libro Verde), que tenía unas 800 páginas. En las siguientes dos semanas, fui a la biblioteca todos los días, lo leí a una velocidad de 10 páginas por hora y hice muchas marcas en él. Un libro en inglés de 800 páginas del que aprendí muchos conceptos básicos (procesos de subprocesos, algoritmos de memoria, métodos de direccionamiento, etc.).

Luego pensé en buscar información directamente en Internet en lugar de en libros. Brother TA me proporcionó el desarrollo del sistema operativo. Seguí el ejemplo anterior y escribí miles de códigos ensambladores.

En este punto, tengo conocimientos conceptuales básicos, entiendo el lenguaje del programa y sé cómo depurar la máquina virtual. El único problema que tengo es que no entiendo muy bien cómo funciona todo el kernel. trabaja en conjunto. Así que fui a buscar el PintOS que el profesor usaba para enseñar, el código del proyecto MIT y un sistema operativo hecho por mí mismo en una universidad nacional (escrito por varios estudiantes de posgrado), lo estudié detenidamente y finalmente comencé a escribir código.

Durante ese semestre, dejé LOL y me concentré en leer el código, escribir el kernel, escribir varios módulos y registrar el proceso en mi blog. Me tomó tres meses finalmente escribir una terminal con The. El kernel (el sistema de archivos no está bien escrito y no hay suficiente tiempo) puede ejecutar comandos, ejecutar funciones, administrar memoria y procesos, y manejar interrupciones.

--------------------------

Este título es muy bueno, espero sinceramente. No serán razones irrazonables para el bloqueo.