README.md for 01 & 02 with corrections/improvements

pull/150/head
zanez 2 years ago
parent 0353949fc1
commit e073b53012

@ -1,24 +1,24 @@
# Tutorial 01 - Esperar para siempre
# Tutorial 01 - Esperar para infinitamente
## tl;dr
* Se configura la estructura que tendrá el proyecto.
* Se configura la estructura que tiene el proyecto.
* Se ejecuta una pequeño código hecho en ensamblador que tiene como función detener todos los núcleos del procesador que están ejecutando el kernel.
## Compilar
* El archivo `Makefile` selecciona:
* El archivo `Makefile` permite ejecutar:
* `doc`: Genera la documentación.
* `qemu`: Ejecutar el kernel en QEMU.
* `clippy`
* `clippy`: Analiza el código y sugiere mejoras.
* `clean`
* `clean`: Elimina todos los archivos generados durante la compilación, etc.
* `readelf`: Inspeccionar la salida de `ELF`.
* `readelf`: Inspecciona el archivo `ELF` de salida.
* `objdump`: Inspecciona el ensamblador.
@ -26,7 +26,7 @@
## Código a revisar
* El script enlazador específico de `BSP` llamado `link.ld`.
* El script para enlazado específico para la `BSP` llamado `link.ld`.
* Carga la dirección en `0x8_0000`.
@ -36,15 +36,15 @@
* `#![no_std]`, `#![no_main]`.
* `boot.s`: La función de ensamblador `__start()` que inicia `wfe` (Wait For Event / Esperar Por Un Evento), detiene todos los núcleos del procesador que están ejecutando `_start()`.
* `boot.s`: La función de ensamblador `_start()` que inicia `wfe` (Wait For Event / Esperar Hasta Un Evento), detiene todos los núcleos del procesador que están ejecutando `_start()`.
* Tenemos que definir una función `#[panic_handler]` para que el compilador no nos cause problemas.
* Tenemos que definir una función que funcione como `#[panic_handler]` (manejador de pánico) para que el compilador no nos cause problemas.
* Hazla una `unimplemented!()` porque se eliminará ya que no está siendo usada.
* Hazla `unimplemented!()` porque se eliminará ya que no está siendo usada.
## Pruébalo
Dentro de la carpeta del proyecto, ejecuta a QEMU y mira el núcleo del procesador hilado en `wfe`:
Dentro de la carpeta del proyecto, ejecuta a QEMU y mira el núcleo del procesador ejecutando `wfe` en bucle:
```
$ make qemu

@ -1,9 +1,9 @@
# Tutorial 02 - Inicio de Tiempo de Ejecución
# Tutorial 02 - Inicialización del `runtime`
## tl;dr
* Extendimos la funcionalidad de `boot.s` para que sea capaz de llamar código de Rust por primera vez. Antes de que el cambio a Rust ocurra, se realizan algunos trabajos de inicio de tiempo de ejecución (runtime init).
* El código de Rust que es llamado solo pausa la ejecución con una llamada a `panic!()`.
* Extendimos la funcionalidad de `boot.s` para que sea capaz de llamar código Rust por primera vez. Antes de que el cambio a Rust ocurra, se realizan algunos trabajos de inicialización del `runtime` (soporte para ejecución de código).
* El código Rust que es llamado solo pausa la ejecución con una llamada a `panic!()`.
* Ejecuta `make qemu` de nuevo para que puedas ver el código adicional en acción.
## Adiciones importantes
@ -12,27 +12,27 @@
* Nuevas secciones: `.rodata`, `.got`, `.data`, `.bss`.
* Un lugar totalmente dedicado para enlazar argumentos de tiempo de arranque (boot-time) que necesitan estar listos cuando se llame a `_start()`.
* Un lugar totalmente dedicado a enlazar argumentos de tiempo de arranque (boot-time) que necesitan estar listos cuando se llame a `_start()`.
* `_start()` en `_arch/__arch_name__/cpu/boot.s`:
1. Para el núcleo del procesador `if core != core0` (si la variable `core` es diferente de la variable `core0`).
1. Para todos los núcleos expecto el núcleo 0.
2. Inicializa la [`DRAM`](https://es.wikipedia.org/wiki/DRAM) haciendo ceros la sección de [`bsp`](https://en.wikipedia.org/wiki/.bss).
2. Inicializa la [`DRAM`](https://es.wikipedia.org/wiki/DRAM) poniendo a cero la sección de [`bss`](https://en.wikipedia.org/wiki/.bss).
3. Configura el `stack pointer` (puntero a la memoria *stack*).
3. Configura el `stack pointer` (puntero a la memoria [pila](https://es.wikipedia.org/wiki/Pila_(inform%C3%A1tica))).
4. Salta hacia la función `_start_rust()`, definida en `arch/__arch_name__/cpu/boot.rs`.
. `_start_rust()`:
* `_start_rust()`:
. Llama a `kernel_init()`, que llama a `panic!()`, que eventualmente también pausa a core0.
* Llama a `kernel_init()`, que llama a `panic!()`, que al final también pone al núcleo 0 en pausa.
. La librería ahora usa el crate [cortex-a](https://github.com/rust-embedded/cortex-a), que nos da abstracciones conocidas como *zero-overhead* y envulve las partes que hacen uso de un `unsafe` (partes con código que no es seguro y podría causar errores) cuando se trabaja con los recursos del procesador.
* La librería ahora usa el crate [cortex-a](https://github.com/rust-embedded/cortex-a), que nos da abstracciones sin coste y envuelve las partes que hacen uso de un `unsafe` (partes con código que no es seguro y podría causar errores) cuando se trabaja directamente con los recursos del procesador.
. Lo puedes ver en acción en `_arch/__arch_name__/cpu.rs`.
* Lo puedes ver en acción en `_arch/__arch_name__/cpu.rs`.
## Diff del archivo anterior
## Diferencia con el archivo anterior
```diff
diff -uNr 01_wait_forever/Cargo.toml 02_runtime_init/Cargo.toml

Loading…
Cancel
Save