Preguntas sobre el desarrollo del sistema operativo en C ++

9

Como proyecto de maestría, estoy diseñando un sistema operativo simple. Está siendo diseñado para ejecutarse en modo real de 16 bits en una arquitectura x86. Idealmente, me gustaría desarrollar este sistema operativo en C ++, y solo usar el ensamblaje cuando sea necesario. Hasta ahora, tengo un gestor de arranque escrito en ensamblado, que carga un kernel que es una mezcla de C ++ y asm. Mi pregunta es sobre el uso de C ++. A partir de ahora, se ha compilado y puede ejecutarse, pero no he utilizado ninguna asignación de memoria dinámica.

Si estuviera usando C, tendría sentido escribir funciones malloc que manejarían la asignación de memoria, pero en C ++ se usa la nueva palabra clave. Entonces...

¿Cómo funciona 'nuevo' detrás de escena para asignar memoria, y cómo haría para manejar esto?

Y como corolario ...

¿Tiene sentido tratar de usar C ++ para aprovechar sus abstaciones de nivel superior? ¿O sería más dolor de cabeza usarlo y debería seguir con C?

Proporcione una justificación si cree que C ++ no sería una buena opción.

bunglestink
fuente

Respuestas:

9

La newpalabra clave entrega la asignación real a operator new, que se comporta de manera bastante similar a malloc: obtiene memoria de algún lugar. El compilador hará toda la magia del constructor. Por lo tanto, el compilador de C ++ esperará que la biblioteca en tiempo de ejecución de C ++ (o su código) proporcione una implementación de operator new.

Ciertamente tiene sentido usar C ++ para ciertas abstracciones. No hay ninguna razón por la cual un sistema operativo debería funcionar por su cuenta std::list<>. Las excepciones son mucho más problemáticas. En el medio hay un gradiente de cosas útiles a inútiles. std::complex? Funciona perfectamente, pero ¿por qué lo necesitarías?

MSalters
fuente
5

Muchas de las ventajas de C ++ sobre C no tienen nada que ver con el soporte de tiempo de ejecución, y en esos casos realmente no hay diferencia entre el código escrito en C y el código escrito en C ++. Las plantillas, por ejemplo, no hacen nada en tiempo de ejecución. No hacen nada que usted no pueda hacer con una gran cantidad de tipeo adicional. C ++ es un lenguaje muy razonable para escribir sistemas operativos, ya que proporciona acceso de bajo nivel cuando lo necesita, combinado con abstracciones de nivel superior que C cuando no necesita enfocarse en el giro de bits.

newhace dos cosas: obtiene memoria de alguna parte y ejecuta los constructores necesarios. Al obtener la memoria, no es diferente de malloc.

David Thornley
fuente
3

Quizás sería razonable dar una idea aproximada del código que normalmente se genera para una newexpresión. Es generado por el compilador, pero si lo estuviera implementando como una función, se vería así:

template <class T>
T *new_object() { 
    void *raw_data = ::operator new(sizeof(T));
    return new(raw_data) T;
}

Si te importa cómo newfunciona, el seguimiento (casi) inevitable es cómo deletefunciona:

template <class T>
void delete_object(T const *object) { 
    object->~T();
    ::operator delete(object);
}

Como otros ya han señalado, ::operator newy ::operator deleteson asignadores de memoria bastante básicos. Por ejemplo, en un sistema de tipo Unix que habían probablemente llaman algo así como brko sbrkpara asignar grandes trozos de memoria, y luego repartir trozos más pequeños de los grandes bloques. En su propio sistema operativo, es probable que aún desee algún tipo de análogo sbrky tal, algo que comience esencialmente con toda la memoria como "libre" y asigne fragmentos de memoria según sea necesario. Dado que está trabajando en modo real, eso probablemente será bastante simple: dada la pequeña cantidad de memoria disponible, un diseño práctico casi necesita enfatizar el tamaño pequeño sobre los algoritmos elaborados.

Jerry Coffin
fuente
-4

La mayoría de los sistemas operativos están escritos en CI think. Por otro lado, es un proyecto de maestría, así que haz algo diferente e interesante.

Kevin
fuente
1
La mayoría de los sistemas operativos grandes se escribieron inicialmente antes de que C ++ estuviera disponible. Eso limitó la elección. :-)
Bo Persson
1
a veces pienso que los votos negativos son contagiosos.
Kevin