> For the complete documentation index, see [llms.txt](https://hernandez-kevin.gitbook.io/pintos-vm/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hernandez-kevin.gitbook.io/pintos-vm/virtual-memory/supplementary-page-table.md).

# Supplementary Page Table

La media naranja faltante

## Un poco de Explicación...

Como debes saber, un proceso tiene dentro de su **Process Control Block (PCB)** guardado la Page Table, que sirve para traducir las direcciones virtuales a direcciones físicas.

En PintOS, cada proceso también tiene su propia Page Table, pero está muy limitado; es decir, tiene un límite sobre la información que puede guardar sobre una página del proceso.\
Esta Page Table solamente puede guardar la dirección física y un vector de flags (este vector de flags te servirá mucho, te recomiendo que leas el archivo **pde.c**).

Es necesario poder expandir esta Page Table para guardar información extra sobre las páginas, y por eso surge la necesidad de implementar una "Supplementary Page Table".

![](https://media.giphy.com/media/6nCOC4R1ssBXy/giphy.gif)

## Objetivo

La Page Table que PintOS utiliza para cada proceso es muy limitada, por ello es necesario crear una Tabla que pueda complementarla y suplementar cierta información extra.

## Archivos

No encontrarás en ninguna parte algún archivo que haga referencia a esta tabla complementaria. ***Tú*** debes implementarla desde 0 y el primer paso es creando el archivo.

{% hint style="info" %}
**SUGERENCIA:** crea los archivos dentro del directorio ***vm***.
{% endhint %}

Crea los archivos ***page.h*** y ***page.c***.\
Dentro del archivo ***page.h*** estarás colocando la definición de estructuras que necesites y la declaración de métodos y funciones.\
Y dentro del archivo ***page.c*** estarás implementando todas aquellas funciones que declaraste en el archivo anterior.

## Código

Al igual que la Frame Table, la forma de cómo quieres construir la Supplementary PageTable también dependerá mucho de ti. Puedes utilizar una **lista**, un **hashmap** o cualquier otra estructura que desees, pero el mejor consejo sigue siendo que utilices aquella estructura que tengas experiencia y sepas manejarla correctamente.

El código base que te estaré proporcionando es sobre las entradas de la Supplementary Page Table, es decir, lo que estarás guardando dentro de dicha tabla.

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

Este ***struct*** lo estarás modificando conforme a las necesidades que surjan a lo largo de esta fase.

{% hint style="info" %}
Se estará utilizando el término ***SPTE*** para referirse a ***Supplementary Page Table Entry***.
{% endhint %}

## FAQ

* ¿Es una estructura que muchos procesos estarán consultándola o modificándola?

  No. Cada proceso tiene su propio Supplementary Page Table.\
  No tiene sentido que otros procesos estén consultando las páginas de otros procesos de manera directa.

{% hint style="info" %}
En alguna parte debes de **declarar una estructura** propia de cada proceso que represente a su "Supplementary Page Table".

Pista: ***threads/***
{% endhint %}

* ¿En dónde puedo inicializar la Supplementary Page Table?

  Te daré una pista: busca dentro del directorio de ***threads***/
* ¿Tiene alguna ventaja utilizar algún tipo de estructura de datos?

  No, queda a tu discreción cuál utilizar.
* ¿Estaré utilizando esta Tabla frecuentemente o en toda la parte de VM?

  En toda la parte de VM.
