2011-06-17 8 views
5

Tengo que construir un sistema operativo, una muy pequeña y básica uno, con menos funcionalidad realidad, codificado en C.¿Se puede usar stdio mientras se codifica un Kernel ...?

Probablemente un sistema operativo CUI, que lo hace un poco de gestión de memoria y tiene al menos un editor de texto y una calculadora, su solo va a ser una experimentación sobre cómo crear un código que tenga control total y directo sobre su hardware.

Todavía necesitaré una interfaz, que necesitará funciones de entrada/salida como printf (& args), scanf (& args). Ahora mi pregunta básica es si debo usar los encabezados existentes o ir a codificar en realidad desde cero, ¿y por qué?

Estaría más que muy agradecido con ustedes por su ayuda.

Respuesta

3

En primer lugar, no se puede enlazar nada desde libc ... tendrá que codificar todo desde cero.

Ahora, habiendo trabajado en un micro-kernel a mí mismo, yo no usaría los stdio encabezados reales que vienen con libc ya que van a ser estorbado con una gran cantidad de información adicional que será irrelevante para su sistema operativo, o voluntad crear errores de compilador debido a definiciones faltantes, etc. Lo que sería hacer es mantener las firmas de funciones para estas funciones estándar de la misma ... por lo que al final tendrías un archivo llamado stdio.h para tu sistema operativo, pero sería un archivo de encabezado muy depurado con los requisitos mínimos básicos para sus necesidades, y solo tiene las funciones de E/S estándar que necesita, con las firmas estándar correctas.

Tenga en cuenta que en el back-end, es decir, en su archivo stdio.c, tendrá que señalar estas funciones a un controlador de consola personalizado u otro tipo de unidad de caracteres para su pantalla. O eso, o simplemente podría usarlos como envoltorios para alguna otra rutina de impresión de visualización de nivel kernel. También querrá asegurarse de que aunque pueda utilizar una directiva #include <stdio.h> en sus otros módulos de código del sistema operativo para acceder a estas funciones de impresión, no haga un vínculo con libc. Esto se puede hacer usando gcc -ffreestanding.

+0

Muchas gracias, señor, pero ahora es otra carga para usted ... ahora que sé que ha pasado por todo esto, una vez que empiezo a hacer esto del SO , ¿puedo molestarte cuando sea golpeado :) – Kartikya

+1

Jaja, claro, no hay problema, aunque para ser honesto, creo que obtendrás mucha más ayuda de la gente de [OSdev.org] (http: // forum. osdev.org/). Escribir un kernel, especialmente cuando ingresas al lenguaje ensamblador, puede ser muy difícil, especialmente cuando comienzas a duplicar y triplicar fallas (al menos puedes detectar un doble error en un manejador de excepciones). Definitivamente sugiero usar un emulador como QEMU o BOCHS, y familiarizarme con sus depuradores (especialmente el depurador BOCHS). También prepárese para pasar mucho tiempo en el manual del desarrollador del procesador Intel. – Jason

+0

Gracias Señor, me pondré en contacto con usted tan pronto como haga algún progreso. – Kartikya

0

Just retarget newlib.

printf, scanf, etc depende de las funciones específicas de implementación para obtener un solo carácter o imprimir un solo carácter. A continuación, puede hacer que su stdin y stdout UART 1, por ejemplo.

+0

Así que señor este newlib ... se ejecutaría sin ningún tipo de soporte, quiero decir que no es un derecho dependiente de la plataforma , solo confirmando ? – Kartikya

+0

Sí. Compruébelo en http://sourceware.org/newlib/ –

0

Kernel en sí no requeriría las funciones printf y scanf, si no desea mantener el kernel en modo kernel y trabajar con las aplicaciones que ha planificado. Pero para las funciones básicas de printf y scanf, puede escribir sus propias funciones printf y scanf, que proporcionarían soporte básico para imprimir y tomar entrada. No tengo mucha experiencia en esto, pero puede intentar crear un búfer de consola, donde el controlador del teclado coloca la lectura en caracteres ASCII (después de la conversión desde códigos de exploración) y luego hacer que el printf y el scanf trabajen en él. Tengo una implementación básica si escribí gets en lugar de scanf y mantuve todo simple. Para obtener un resultado entero, puede escribir una función atoi para convertir la cadena en un número.

Para realizar el puerto en otras bibliotecas, debe crear los componentes de los que dependen las bibliotecas. Debe tomar la decisión si puede codificar en ese soporte en el núcleo para que las bibliotecas puedan ser portadas.Si es más difícil entonces codificar algunas funciones básicas de salida de entrada, creo que no será malo en esta etapa,

Cuestiones relacionadas