Loader

El que le permite al proceso dar sus primeros pasos.

Si has llegado acá, es porque toda la parte de Stack Growth funciona completamente.

En el proceso del loader, este obtiene frames libres para que el proceso pueda realizar sus primeras instrucciones. Estos frames también deben ser registradas en la Frame Table y las páginas virtuales asociadas también deben quedarse registradas en la Supplementary Page Table.

En pocas palabras, debes de utilizar la función que implementaste en Stack Growth dentro de la función load_segment(). (¡Te dejo el reto que busques dónde se encuentra esta función!)

Sin embargo, hay que mencionar algo muy importante... (me adelantaré un poco)

En la documentación oficial de PintOS, menciona en alguna parte de Page Replacement que la página puede ser leída del Swap o del Filesystem. Es necesario respetar la premisa de PintOS que solamente se guardan aquellas páginas al Swap File si son modificables, de lo contrario, esas páginas se leen otra vez del filesystem.

En el loader, sería conveniente guardar información adicional sobre esas páginas porque en algún momento pueden ser víctimas de reemplazo y en algún otro momento, el proceso puede requerir de esas páginas.

Esto implica que deberás hacer unos cambios en la función que implementaste o crear uno nuevo, como desees.

Mira la función setup_stack(), encontrarás que es necesario hacer un cambio similar al que hiciste al load_segment().

Recordatorio...

¿Te acuerdas de esto?

struct supplementary_page_table_entry {
    void * page_address;
    bool writeable;    // ¡Esto nos servirá mucho en un futuro!
    
    // Decide cómo quieres guardar esta entrada
};

Sí, así es... ahora todo empieza a cobrar sentido. En el loader hay una variable que se llama "writeable" que sirve para indicar si la página es read-only o no. Te servirá mucho guardar ese writeable en cada SPTE.

FAQ

  • Entonces... ¿Cuál es el writeable para las páginas que se añaden cuando el proceso crece?

Última actualización