    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79

    //! The main module and entrypoint
    //!
    //! Various facilities of the kernels are implemented as submodules. The most
    //! important ones are:
    //!
    //! - [`trap`]: Handles all cases of switching from userspace to the kernel
    //! - [`task`]: Task management
    //! - [`syscall`]: System call handling and implementation
    //!
    //! The operating system also starts in this module. Kernel code starts
    //! executing from `entry.asm`, after which [`rust_main()`] is called to
    //! initialize various pieces of functionality. (See its source code for
    //! details.)
    //!
    //! We then call [`task::run_first_task()`] and for the first time go to
    //! userspace.

    #![deny(missing_docs)]
    #![deny(warnings)]
    #![no_std]
    #![no_main]
    #![feature(panic_info_message)]
    #![feature(alloc_error_handler)]

    extern crate alloc;

    #[macro_use]
    extern crate bitflags;

    #[cfg(feature = "board_k210")]
    #[path = "boards/k210.rs"]
    mod board;
    #[cfg(not(any(feature = "board_k210")))]
    #[path = "boards/qemu.rs"]
    mod board;

    #[macro_use]
    mod console;
    mod config;
    mod lang_items;
    mod loader;
    mod mm;
    mod sbi;
    mod sync;
    pub mod syscall;
    pub mod task;
    mod timer;
    pub mod trap;

    core::arch::global_asm!(include_str!("entry.asm"));
    core::arch::global_asm!(include_str!("link_app.S"));

    /// clear BSS segment
    fn clear_bss() {
        extern "C" {
            fn sbss();
            fn ebss();
        }
        unsafe {
            core::slice::from_raw_parts_mut(sbss as usize as *mut u8, ebss as usize - sbss as usize)
                .fill(0);
        }
    }

    #[no_mangle]
    /// the rust entry-point of os
    pub fn rust_main() -> ! {
        clear_bss();
        println!("[kernel] Hello, world!");
        mm::init();
        println!("[kernel] back to world!");
        mm::remap_test();
        trap::init();
        //trap::enable_interrupt();
        trap::enable_timer_interrupt();
        timer::set_next_trigger();
        task::run_first_task();
        panic!("Unreachable in rust_main!");
    }