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. |
||
|---|---|---|
| .. | ||
| bin | ||
| src | ||
| assemble.ps1 | ||
| assemble.sh | ||
| build.rs | ||
| Cargo.toml | ||
| link.x | ||
| 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.
- 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 useriscv32imac-unknown-none-elf. - Get Rust. Go to https://rustup.rs/ and follow its instructions.
- Install the proper toolchain:
rustup target add ${target_arch} - 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
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.