| Crates.io | axplat |
| lib.rs | axplat |
| version | 0.2.0 |
| created_at | 2025-07-02 05:52:56.375506+00 |
| updated_at | 2025-08-21 03:54:25.008333+00 |
| description | This crate provides a unified abstraction layer for diverse hardware platforms. |
| homepage | https://github.com/arceos-org/arceos |
| repository | https://github.com/arceos-org/axplat_crates |
| max_upload_size | |
| id | 1734534 |
| size | 30,140 |
This crate provides a unified abstraction layer for diverse hardware platforms. It allows kernel developers to bootstrap custom kernels across various platforms and interact with essential peripherals using hardware-agnostic APIs.
Interfaces can be divided into the following categories:
| Category | Trait | Description |
|---|---|---|
| init | InitIf |
Platform initialization |
| console | ConsoleIf |
Console input and output |
| power | PowerIf |
Power management |
| mem | MemIf |
Physical memory information |
| time | TimeIf |
Time-related operations |
| irq | IrqIf |
Interrupt request handling |
Each category of interfaces provides a trait (e.g., ConsoleIf) for a platform package to implement. You can use the corresponding platform-related functions in your project directly from the axplat crate without importing the specific platform package.
// Link you kernel with the specific platform package in some crate.
// extern crate your_platform_crate;
// Write your kernel code (can be in another crate).
#[axplat::main]
fn kernel_main(cpu_id: usize, arg: usize) -> ! {
// Initialize trap, console, time.
axplat::init::init_early(cpu_id, arg);
// Initialize platform peripherals (not used in this example).
axplat::init::init_later(cpu_id, arg);
// Write your kernel code here.
axplat::console_println!("Hello, ArceOS!");
// Power off the system.
axplat::power::system_off();
}
More APIs can be found in the documentation. More example kernels can be found in the examples directory.
use axplat::impl_plat_interface;
/// Implementation of Platform initialization.
struct InitIfImpl;
#[impl_plat_interface]
impl axplat::init::InitIf for InitIfImpl {
fn init_early(cpu_id: usize, arg: usize) { /* ... */ }
fn init_later(cpu_id: usize, arg: usize) { /* ... */ }
fn init_early_secondary(cpu_id: usize) { /* ... */ }
fn init_later_secondary(cpu_id: usize) { /* ... */ }
}
/// Implementation of Console input and output.
struct ConsoleIfImpl;
#[impl_plat_interface]
impl axplat::console::ConsoleIf for ConsoleIfImpl {
fn write_bytes(bytes: &[u8]) { /* ... */ }
fn read_bytes(bytes: &mut [u8]) -> usize { /* ... */ 0 }
}
// Implementation of other traits...
#[unsafe(no_mangle)]
unsafe extern "C" fn __start() -> ! {
// platform bootstrapping code here.
/* ... */
// Call the entry function of axplat.
axplat::call_main(0, 0xdeadbeef); // cpu_id = 0, arg = 0xdeadbeef
}
We also provide a cargo plugin called cargo-axplat for creating a new platform package and adding it into your project.
Some examples of platform packages for various platforms are listed in the platforms directory.