Al inicializar el kernel, tengo algunas cosas que deben ocurrir: 1) paginación debe estar habilitado, 2) el administrador de memoria física tiene que analizar el mapa de memoria del prisionero, y 3) la puesta en marcha surtidos el código necesita acceder a los datos que deben permanecer allí para más adelante (por ejemplo, GDT, IDT, estructuras de administración de memoria).mitad superior del núcleo de inicialización
Las dependencias entre estos pasos me están volviendo loco. Con la mitad superior, el kernel está vinculado en su dirección virtual y las opciones que he encontrado son 1) habilitar la paginación en el ensamblaje, lo que implica seguir todos los punteros de arranque múltiple (en el ensamblaje) para que aún estén accesibles al administrador de la memoria física y luego desmarcarlos todos, 2) vincular el código de inicio en su dirección física y luego hacer alguna manipulación del puntero para acceder también a las estructuras del kernel en sus direcciones físicas, o 3) no usar una mitad superior núcleo.
Además, hay que precisar bootstrapping el administrador de memoria física sin conocer la cantidad de memoria física en tiempo de compilación. Estoy bastante seguro de que debo evitar cuidadosamente todas las estructuras de arranque múltiple al asignar las primeras estructuras, o usarlas todas primero y luego no preocuparme por sobrescribirlas (aunque todavía tendría que tratar con módulos y este enfoque probablemente implica copiar las tablas de arranque múltiple en una ubicación conocida, ya que las necesito al configurar el administrador de memoria física).
Estos problemas son por eso he evitado una mitad superior del núcleo hasta ahora. ¿Alguien tiene un buen sistema para resolver estas dependencias? ¿Tal vez alguna variación en this GDT trick para acceder tanto al kernel en su dirección vinculada/virtual como a las tablas de arranque múltiple en su dirección física, o usando algún tipo de tablas de página predefinidas que eviten los problemas anteriores, tal vez con PSE?
¡Gracias! Una pregunta: el montón de inicialización (supongo) contiene el MBI reubicado, que puede descartarse cuando haya terminado con él, pero parece que también contiene las tablas de página para la asignación inicial. ¿Desechas también esos una vez que creas tu primer proceso? – rpjohnst
@Rusky: Sí, el MBI podría descartarse pero no lo hago porque es muy pequeño. No coloco el directorio de página y las tablas de página en ese montón, pero en algún lugar con muy poca memoria (alrededor de 4 KB). No los descarto porque el primer proceso que ejecuto los heredará. Es decir. mi primer proceso se ejecutará en el espacio de direcciones que configuré durante la inicialización. – Job