mirror of
https://github.com/rust-embedded/rust-raspberrypi-OS-tutorials.git
synced 2024-11-11 07:10:59 +00:00
2432c0d283
It is too risky to rely on the compiler to not insert any operations using the stack. Having a stack-setting call in Rust using the cortex-a crate as the first action in a Rust-only _start() function does not work if you're subsequently using the stack, because the compiler often inserts the operations to make room on the stack to prepare a function call BEFORE the call to set the stack, which crashes the boot process. Hence, keep on using a small piece of assembly boot code throughout. |
||
---|---|---|
.. | ||
.vscode | ||
src | ||
build.rs | ||
Cargo.lock | ||
Cargo.toml | ||
Makefile | ||
README.CN.md | ||
README.md |
Tutorial 01 - Wait Forever
tl;dr
- The project skeleton is set up.
- A small piece of assembly code runs that just halts all CPU cores executing the kernel code.
Building
Makefile
targets:doc
: Generate documentation.qemu
: Run thekernel
in QEMUclippy
clean
readelf
: Inspect theELF
output.objdump
: Inspect the assembly.nm
: Inspect the symbols.
Code to look at
- Custom
link.ld
linker script.- Load address at
0x8_0000
- Only
.text
section.
- Load address at
main.rs
: Important inner attributes:#![no_std]
,#![no_main]
boot.s
: Assembly_start()
function that executeswfe
(Wait For Event), halting all cores that are executing_start()
.- We (have to) define a
#[panic_handler]
function to make the compiler happy.- Make it
unimplemented!()
because it will be stripped out since it is not used.
- Make it
Test it
In the project folder, invoke QEMU and observe the CPU core spinning on wfe
:
$ make qemu
[...]
IN:
0x00080000: d503205f wfe
0x00080004: 17ffffff b #0x80000