> For the complete documentation index, see [llms.txt](https://francisco-hernandez.gitbook.io/la-guia-del-frijol/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://francisco-hernandez.gitbook.io/la-guia-del-frijol/master.md).

# Pintos: Guía Fase 1

## Introducción

La siguiente guía, tiene como propósito ayudarle a comprender mejor la primera asignación y proporcionarle las ideas necesarias de forma que usted minimice la cantidad de tiempo que pasa confundido por la sintaxis en general de Pintos y pueda aprovechar este tiempo en el diseño y la implementación de las distintas tareas a realizar.

{% hint style="info" %}
Esta guía es solamente una referencia, siempre es recomendable referirse a la documentación oficial de Pintos en el [Sitio de Stanford](https://web.stanford.edu/class/cs140/projects/pintos/pintos_1.html) y leer esta información antes de utilizar la presente guía.
{% endhint %}

Le quedarán distintos aspectos por descubrir por sí mismo, sin embargo, se espera poder proveerle distintas pistas y consejos que le sean de utilidad para comprender Pintos más a detalle.

Esta guía se enfoca más a cómo implementar distintas funcionalidades, por lo que no se preocupará de detallar tanto a nivel conceptual. Se espera que el lector domine diversos conceptos de sistemas operativos y entienda términos comúnmente usados leyendo previamente la documencación oficial.\
\
Cualquier detalle que quiera usted remarcar en la presente guía, ya sean posibles errores o recomendaciones, o incluso si desea realizar contribuciones a la mejora de está guía, puede hacernoslo saber dirigiéndose al área de contacto.

## Vista General

En la primera fase, se proporciona un sistema de threads mínimo en funcionalidad. El trabajo consiste en extender la funcionalidad de este sistema y ganar entendimiento de problemas de sincronización.

La definición de la estructura thread se encuentra en `src/threads/thread.h`y se ve así:

{% code title="thread.h" %}

```c
struct thread
  {
    /* Owned by thread.c. */
    tid_t tid;                          /* Thread identifier. */
    enum thread_status status;          /* Thread state. */
    char name[16];                      /* Name (for debugging purposes). */
    uint8_t *stack;                     /* Saved stack pointer. */
    int priority;                       /* Priority. */
    struct list_elem allelem;           /* List element for all threads list. */

    /* Shared between thread.c and synch.c. */
    struct list_elem elem;              /* List element. */

    //PUEDE DECLARARLO AQUI COMO UN UINT64_T

#ifdef USERPROG
    /* Owned by userprog/process.c. */
    uint32_t *pagedir;                  /* Page directory. */
#endif

    /* Owned by thread.c. */
    unsigned magic;                     /* Detects stack overflow. */
  };
```

{% endcode %}

Todos los elementos de esta estructura son sencillos de comprender, y son esos por defecto. A lo largo del proyecto, puede agregar más elementos libremente pero asegúrese de **NO** agregar lemeentos abajo de la declaración de **unsigned magic** ya que puede alterar el comportamiento del sistema.

Algunas de las funciones importantes de **thread.h** son:

| Función               | Descripción                                                                                                                                                    |
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| thread\_init          | Inicializa las estructuras globales que todos los threads utilizan, como locks o semáforos.                                                                    |
| thread\_create        | Crea un nuevo thread y lo coloca en un **ready state.**                                                                                                        |
| thread\_block         | Bloquea al thread actual en ejecución                                                                                                                          |
| thread\_unblock       | Toma al thread que se pasa como argumento y lo desbloquea.                                                                                                     |
| thread\_current       | Retorna un puntero al thread actual en ejecución.                                                                                                              |
| thread\_foreach       | Toma la función pasada como argumento y la aplica sobre cada thread.                                                                                           |
| thread\_get\_priority | Retorna la prioridad del thread actual en ejecución (Implementada en la  Priority Scheduling).                                                                 |
| thread\_set\_priority | Toma el entero pasado como argumento, y cambia la prioridad del thread actual en ejecución al valor de este entero. (Implementada en la  Priority Scheduling). |

En el Kernel de Pintos hay un solo **address space,** pueden haber varios threads en ejecucion en el modo kernel y todos estos **kernel threads** comparten ese mismo **address space**.

El **addresss space** del Kernel de Pintos son poco más de 64MB de memoria física, y empieza a ser mapeada en PHYS\_BASE (0xc0000000).&#x20;

El Kernel mantiene un Thread Control Block para cada thread, el cual se representa con la **estructura** **thread** mostrada previamente.

El stack de cada thread es del tamaño de una página que en Pintos son 4KB. Los estados de un thread en Pintos son los siguientes:

![](/files/-M8_A9sEHioGjaSu2Jzg)

Será importante comprender un poco la estructura, funcionamiento y manejo de la estructura lista, ya que serán frecuentemente utilizadas, estas puede encontrarlas en `src/lib/kernel/list.h   y   list.c` . En la primera tarea, Alarm Clock, veremos como hacer esto.

Esta información es la más general y considerablemente importante a entender previo a la implementaciónde las distintas tareas.

![](/files/-M8Zp-hx5vBG5alc8xDH)
