xous-core/kernel
bunnie 8d7065d741 implement hard-OOM handler
A hard-OOM is what happens when the allocator really runs out
of memory. To review, there are two types of OOMs handled by
the swapper:

- "OOM Doom": impending OOM. This is detected by a userspace
process that can do more sophisticated processing and
algorithms to predict an impending OOM. The
OOM Doom handler is also interruptable, which allows other
progresses to make progress while memory is being cleared up,
hopefully allowing for a more graceful failure curve.

- "Hard OOM": Literally no more pages are available. This is
triggered when the page allocator can't map a single more page.
The hard-OOM handler turns off all interrupts, and all the OOM
process happens within the uninterruptable userspace context.
This effectively turns the OOM handler "inside out" compared to
the normal, interruptable userspace handler. In order to support
this, a set of calls that implement the kernel space pre-amble
and post-amble (i.e. StealPage and ReleaseMemory) are introduced.

This does introduce an extra edge case in the exit path of
the hard-OOM, namely, if the hard-OOM failed on a page that was
swapped. Here, after clearing memory, we have an empty page,
but no data; we have to again re-enter the userspace handler to
fill that page. The twist here is we have to remember to re-instate
interrupts on this edge case otherwise we lose pre-emption.
2024-05-21 01:13:13 +08:00
..
bin add the .a artifacts to the tree for the asm.S 2024-01-06 16:41:40 +08:00
src implement hard-OOM handler 2024-05-21 01:13:13 +08:00
assemble.ps1 kernel: asm: align kernel stack to 16 bytes 2023-12-29 18:15:48 +08:00
assemble.sh kernel: asm: align kernel stack to 16 bytes 2023-12-29 18:15:48 +08:00
build.rs ok, format the kernel now that all in-line assembly has been checked 2024-01-14 19:27:14 +08:00
Cargo.toml add test and debug deps/features 2024-05-18 00:22:23 +08:00
link.x add an "endcap" to the kernel region 2023-01-17 23:07:05 +08:00
README.md

Xous Kernel

This contains the core kernel for Xous. It requires a stage 1 loader in order to start up, as it assumes the system is already running in Supervisor mode.

Building

To build the kernel, you will need a riscv32 target for Rust. Possible targets include riscv32i-unknown-none-elf, riscv32imac-unknown-none-elf, or riscv32imac-unknown-xous-elf.

  1. Decide what target you want. For simple, embedded systems this could be riscv32i-unknown-none-elf, and for more complex systems with compressed instructions you could use riscv32imac-unknown-none-elf.
  2. Get Rust. Go to https://rustup.rs/ and follow its instructions.
  3. Install the proper toolchain: rustup target add ${target_arch}
  4. Build the kernel: cargo build --release --target ${target_arch}

Using

To use the kernel, you must package it up into an arguments binary with xous-tools.

Testing

TBD

Contribution Guidelines

Contributor Covenant

Please see CONTRIBUTING for details on how to make a contribution.

Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide its terms.

License

Copyright © 2020

This project is licensed under the Apache License 2.0 LICENSE. For accurate information, please check individual files.