Skip to main content

os/
main.rs

1#![no_std]
2#![no_main]
3
4macro_rules! linker_symbol_addr {
5    ($symbol:path) => {
6        ($symbol as *const ()).addr()
7    };
8}
9
10extern crate alloc;
11
12#[macro_use]
13extern crate bitflags;
14
15use log::*;
16
17#[path = "boards/qemu.rs"]
18mod board;
19
20#[macro_use]
21mod console;
22mod config;
23mod device_tree;
24mod drivers;
25mod fs;
26mod lang_items;
27mod logging;
28mod mm;
29mod sbi;
30mod sync;
31mod syscall;
32mod task;
33mod timer;
34mod trap;
35
36use core::arch::global_asm;
37
38global_asm!(include_str!("entry.asm"));
39
40fn clear_bss() {
41    unsafe extern "C" {
42        safe fn sbss();
43        safe fn ebss();
44    }
45    unsafe {
46        core::slice::from_raw_parts_mut(
47            linker_symbol_addr!(sbss) as *mut u8,
48            linker_symbol_addr!(ebss) - linker_symbol_addr!(sbss),
49        )
50        .fill(0);
51    }
52}
53
54/// the rust entry-point of os
55#[unsafe(no_mangle)]
56pub fn rust_main(_hart_id: usize, dtb_pa: usize) -> ! {
57    clear_bss();
58    logging::init();
59    device_tree::init(dtb_pa);
60    info!("[kernel] Hello, world!");
61    mm::init();
62    mm::remap_test();
63    trap::init();
64    trap::enable_timer_interrupt();
65    timer::set_next_trigger();
66    fs::list_apps();
67    task::add_initproc();
68    task::run_tasks();
69    panic!("Unreachable in rust_main!");
70}