2019-10-21 19:35:16 +00:00
|
|
|
|
# Operating System development tutorials in Rust on the Raspberry Pi
|
2018-01-04 17:24:49 +00:00
|
|
|
|
|
2020-01-04 22:46:04 +00:00
|
|
|
|
![](https://github.com/rust-embedded/rust-raspi3-OS-tutorials/workflows/BSP-RPi3/badge.svg) ![](https://github.com/rust-embedded/rust-raspi3-OS-tutorials/workflows/BSP-RPi4/badge.svg) ![](https://github.com/rust-embedded/rust-raspi3-OS-tutorials/workflows/Unit-Tests/badge.svg) ![](https://github.com/rust-embedded/rust-raspi3-OS-tutorials/workflows/Integration-Tests/badge.svg) ![](https://img.shields.io/badge/License-MIT%20OR%20Apache--2.0-blue)
|
2019-10-29 21:41:02 +00:00
|
|
|
|
|
2020-01-14 23:06:35 +00:00
|
|
|
|
<br/>
|
|
|
|
|
|
|
|
|
|
<img src="doc/header.jpg" height="390"> <img src="doc/minipush_demo_frontpage.gif" height="390">
|
|
|
|
|
|
2019-12-30 21:06:04 +00:00
|
|
|
|
## ℹ️ Introduction
|
2019-05-25 18:17:32 +00:00
|
|
|
|
|
2019-12-30 21:06:04 +00:00
|
|
|
|
This is a tutorial series for hobby OS developers who are new to ARM's 64 bit
|
|
|
|
|
[ARMv8-A architecture]. The tutorials will give a guided, step-by-step tour of
|
|
|
|
|
how to write a [monolithic] Operating System `kernel` for an `embedded system`
|
|
|
|
|
from scratch. They cover implementation of common Operating Systems tasks, like
|
|
|
|
|
writing to the serial console, setting up virtual memory and handling HW
|
|
|
|
|
exceptions. All while leveraging `Rust`'s unique features to provide for safety
|
|
|
|
|
and speed.
|
2019-05-25 18:17:32 +00:00
|
|
|
|
|
2020-01-19 16:31:04 +00:00
|
|
|
|
_Cheers, Andre ([@andre-richter])_
|
|
|
|
|
|
|
|
|
|
P.S.: In the future, Chinese :cn: versions of the tutorials will be maintained as [`README.CN.md`](README.CN.md) by [@colachg] and [@readlnh].
|
2019-12-30 21:06:04 +00:00
|
|
|
|
|
|
|
|
|
[ARMv8-A architecture]: https://developer.arm.com/products/architecture/cpu-architecture/a-profile/docs
|
|
|
|
|
[monolithic]: https://en.wikipedia.org/wiki/Monolithic_kernel
|
2020-01-19 16:31:04 +00:00
|
|
|
|
[@andre-richter]: https://github.com/andre-richter
|
|
|
|
|
[@colachg]: https://github.com/colachg
|
|
|
|
|
[@readlnh]: https://github.com/readlnh
|
2019-12-30 21:06:04 +00:00
|
|
|
|
|
2019-12-30 23:10:33 +00:00
|
|
|
|
## 📑 Organization
|
2019-12-30 21:06:04 +00:00
|
|
|
|
|
2019-12-31 11:23:27 +00:00
|
|
|
|
- Each tutorial contains a stand-alone, bootable `kernel` binary.
|
2019-12-30 21:06:04 +00:00
|
|
|
|
- Each new tutorial extends the previous one.
|
|
|
|
|
- Each tutorial `README` will have a short `tl;dr` section giving a brief
|
|
|
|
|
overview of the additions, and show the source code `diff` to the previous
|
|
|
|
|
tutorial, so that you can conveniently inspect the changes/additions.
|
|
|
|
|
- Some tutorials have a full-fledged, detailed text in addition to the `tl;dr`
|
|
|
|
|
section. The long-term plan is that all tutorials get a full text, but for now
|
|
|
|
|
this is exclusive to tutorials where I think that `tl;dr` and `diff` are not
|
|
|
|
|
enough to get the idea.
|
2019-10-27 22:54:06 +00:00
|
|
|
|
- The code written in these tutorials supports and runs on the **Raspberry Pi
|
|
|
|
|
3** and the **Raspberry Pi 4**.
|
2019-12-30 21:06:04 +00:00
|
|
|
|
- Tutorials 1 till 5 are groundwork code which only makes sense to run in
|
|
|
|
|
`QEMU`.
|
2019-10-27 22:54:06 +00:00
|
|
|
|
- Starting with [tutorial 6](06_drivers_gpio_uart), you can load and run the
|
2019-12-30 21:06:04 +00:00
|
|
|
|
kernel on Raspberrys and observe output over `UART`.
|
|
|
|
|
- Although the Raspberry Pi 3 and 4 are the main target boards, the code is
|
|
|
|
|
written in a modular fashion which allows for easy porting to other CPU
|
|
|
|
|
architectures and/or boards.
|
|
|
|
|
- I would really love if someone takes a shot at a **RISC-V** implementation!
|
2020-03-10 22:40:04 +00:00
|
|
|
|
- For editing, I recommend [Visual Studio Code] with [Rust Analyzer].
|
2019-12-30 21:06:04 +00:00
|
|
|
|
- In addition to the tutorial text, also check out the `make doc` command to
|
|
|
|
|
browse the code with HTML goodness.
|
2019-10-27 22:54:06 +00:00
|
|
|
|
|
2019-11-04 21:59:31 +00:00
|
|
|
|
[Visual Studio Code]: https://code.visualstudio.com
|
2020-03-10 22:40:04 +00:00
|
|
|
|
[Rust Analyzer]: https://rust-analyzer.github.io
|
2019-10-10 21:10:54 +00:00
|
|
|
|
|
2019-12-31 11:23:27 +00:00
|
|
|
|
## 🚀 Ease of use
|
2019-10-27 22:54:06 +00:00
|
|
|
|
|
2019-12-30 21:06:04 +00:00
|
|
|
|
This series tries to put a strong focus on user friendliness. Therefore, I made
|
2019-10-27 22:54:06 +00:00
|
|
|
|
efforts to eliminate the biggest painpoint in embedded development: Toolchain
|
|
|
|
|
hassles.
|
|
|
|
|
|
2019-12-30 21:06:04 +00:00
|
|
|
|
Users eager to try the code will not be bothered with complicated toolchain
|
|
|
|
|
installation/compilation steps. This is achieved by using the standard Rust
|
|
|
|
|
toolchain as much as possible, and provide all additional tooling through an
|
|
|
|
|
accompanying Docker container. The container will be pulled in automagically
|
|
|
|
|
once it is needed. The only requirement is that you have [installed Docker for
|
|
|
|
|
your distro](https://docs.docker.com/install/).
|
2019-10-27 22:54:06 +00:00
|
|
|
|
|
2019-12-30 21:06:04 +00:00
|
|
|
|
The development setup consists of the following components:
|
2019-10-27 22:54:06 +00:00
|
|
|
|
|
|
|
|
|
- Compiler, linker and binutils are used from Rust nightly.
|
2019-12-30 21:06:04 +00:00
|
|
|
|
- Additional OS Dev tools, like `QEMU` or `GDB`, are provided by [this
|
2019-10-27 22:54:06 +00:00
|
|
|
|
container](docker/rustembedded-osdev-utils).
|
|
|
|
|
|
2019-12-30 21:06:04 +00:00
|
|
|
|
If you want to know more about docker and peek at the the container used for the
|
|
|
|
|
tutorials, please refer to the repository's [docker](docker) folder.
|
2019-10-27 22:54:06 +00:00
|
|
|
|
|
2019-12-08 11:16:53 +00:00
|
|
|
|
## 🛠 Prerequisites
|
2018-01-04 17:24:49 +00:00
|
|
|
|
|
2019-12-30 21:06:04 +00:00
|
|
|
|
Before you can start, you must install a suitable Rust toolchain:
|
2019-09-20 13:11:22 +00:00
|
|
|
|
|
2018-03-31 18:12:42 +00:00
|
|
|
|
```bash
|
2019-12-30 22:02:20 +00:00
|
|
|
|
curl https://sh.rustup.rs -sSf \
|
|
|
|
|
| \
|
|
|
|
|
sh -s -- \
|
|
|
|
|
--default-toolchain nightly-2019-12-20 \
|
2020-03-10 22:40:04 +00:00
|
|
|
|
--component rust-src llvm-tools-preview rustfmt
|
2019-09-10 16:31:42 +00:00
|
|
|
|
|
2019-12-30 22:02:20 +00:00
|
|
|
|
source $HOME/.cargo/env
|
2018-08-21 19:22:50 +00:00
|
|
|
|
cargo install cargo-xbuild cargo-binutils
|
2018-03-31 18:12:42 +00:00
|
|
|
|
```
|
|
|
|
|
|
2020-03-10 22:40:04 +00:00
|
|
|
|
In case you use `Visual Studio Code`, I strongly recommend installing the
|
|
|
|
|
[Rust Analyzer extension] as well.
|
|
|
|
|
|
|
|
|
|
[Rust Analyzer extension]: https://marketplace.visualstudio.com/items?itemName=matklad.rust-analyzer
|
|
|
|
|
|
2019-12-31 11:23:27 +00:00
|
|
|
|
## 📟 USB Serial Output
|
|
|
|
|
|
|
|
|
|
Since the kernel developed in the tutorials runs on the real hardware, it is
|
|
|
|
|
highly recommended to get a USB serial debug cable to make the experience.
|
|
|
|
|
The cable also powers the Raspberry once you connect it, so you don't need extra
|
|
|
|
|
power over the dedicated power-USB.
|
|
|
|
|
|
|
|
|
|
- I use a bunch of [these serial cables](https://www.amazon.de/dp/B0757FQ5CX/ref=cm_sw_r_tw_dp_U_x_ozGRDbVTJAG4Q).
|
|
|
|
|
- You connect it to the GPIO pins `14/15` as shown below.
|
|
|
|
|
- [Tutorial 6](06_drivers_gpio_uart) is the first where you can use it.
|
|
|
|
|
Check it out for instructions on how to prepare the SD card to boot your
|
|
|
|
|
self-made kernel from it.
|
|
|
|
|
- Starting with [tutorial 7](07_uart_chainloader), booting kernels on your
|
|
|
|
|
Raspberry is getting _really_ comfortable. In this tutorial, a so-called
|
2019-12-31 11:26:33 +00:00
|
|
|
|
`chainloader` is developed, which will be the last file you need to manually
|
2019-12-31 11:23:27 +00:00
|
|
|
|
copy on the SD card for a while. It will enable you to load the tutorial
|
2020-01-01 22:38:27 +00:00
|
|
|
|
kernels during boot on demand over `UART`.
|
2018-01-04 17:24:49 +00:00
|
|
|
|
|
2019-10-11 21:08:19 +00:00
|
|
|
|
![UART wiring diagram](doc/wiring.png)
|
2018-01-04 17:24:49 +00:00
|
|
|
|
|
2019-12-08 11:16:53 +00:00
|
|
|
|
## 🙌 Acknowledgements
|
2019-10-27 22:54:06 +00:00
|
|
|
|
|
|
|
|
|
The original version of the tutorials started out as a fork of [Zoltan
|
|
|
|
|
Baldaszti](https://github.com/bztsrc)'s awesome [tutorials on bare metal
|
|
|
|
|
programming on RPi3](https://github.com/bztsrc/raspi3-tutorial) in `C`. Thanks
|
|
|
|
|
for giving me a head start!
|
|
|
|
|
|
2018-10-21 18:16:27 +00:00
|
|
|
|
## License
|
|
|
|
|
|
2019-11-25 18:54:05 +00:00
|
|
|
|
Licensed under either of
|
|
|
|
|
|
|
|
|
|
* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
|
|
|
|
|
* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
|
|
|
|
|
|
|
|
|
|
at your option.
|
|
|
|
|
|
|
|
|
|
### Contribution
|
|
|
|
|
|
|
|
|
|
Unless you explicitly state otherwise, any contribution intentionally submitted
|
|
|
|
|
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
|
|
|
|
|
dual licensed as above, without any additional terms or conditions.
|
2020-03-10 22:40:04 +00:00
|
|
|
|
|