rust-raspberrypi-OS-tutorials/01_wait_forever/README.md

43 lines
1.1 KiB
Markdown
Raw Normal View History

2019-09-25 09:56:41 +00:00
# Tutorial 01 - Wait Forever
## tl;dr
2020-03-28 12:27:39 +00:00
The project skeleton is set up; A small piece of assembly code runs that just halts all CPU cores
executing the kernel code.
2019-09-25 09:56:41 +00:00
2020-03-28 12:27:39 +00:00
## Building
2019-09-25 09:56:41 +00:00
- `Makefile` targets:
- `doc`: Generate documentation.
- `qemu`: Run the `kernel` in QEMU
- `clippy`
- `clean`
- `readelf`: Inspect the `ELF` output.
- `objdump`: Inspect the assembly.
- `nm`: Inspect the symbols.
2020-03-28 12:27:39 +00:00
## Code to look at
2019-09-25 09:56:41 +00:00
- Custom `link.ld` linker script.
- Load address at `0x80_000`
- Only `.text` section.
- `main.rs`: Important [inner attributes]:
- `#![no_std]`, `#![no_main]`
2020-03-28 12:27:39 +00:00
- `cpu.S`: Assembly `_start()` function that executes `wfe` (Wait For Event), halting all cores that
are executing `_start()`.
2019-09-25 09:56:41 +00:00
- We (have to) define a `#[panic_handler]` function.
2019-10-12 07:06:34 +00:00
- Just waits infinitely for a cpu event.
2019-09-25 09:56:41 +00:00
[inner attributes]: https://doc.rust-lang.org/reference/attributes.html
2019-10-21 19:39:09 +00:00
2019-12-30 23:00:09 +00:00
### Test it
2019-10-21 19:39:09 +00:00
In the project folder, invoke QEMU and observe the CPU core spinning on `wfe`:
```console
2020-03-28 12:27:39 +00:00
$ make qemu
2019-10-21 19:39:09 +00:00
[...]
2019-12-30 23:00:09 +00:00
IN:
0x00080000: d503205f wfe
2019-10-21 19:39:09 +00:00
0x00080004: 17ffffff b #0x80000
```