61 lines
1.4 KiB
Rust
61 lines
1.4 KiB
Rust
|
#![no_std]
|
||
|
#![no_main]
|
||
|
#![feature(abi_x86_interrupt)]
|
||
|
#![feature(alloc_error_handler)]
|
||
|
#![feature(allocator_api)]
|
||
|
#![feature(naked_functions)]
|
||
|
#![feature(int_roundings)]
|
||
|
#![feature(type_alias_impl_trait)]
|
||
|
#![deny(unsafe_op_in_unsafe_fn)]
|
||
|
|
||
|
extern crate alloc;
|
||
|
|
||
|
mod bootinfo;
|
||
|
mod gdt;
|
||
|
mod interrupts;
|
||
|
mod kernel_heap;
|
||
|
mod panic_handler;
|
||
|
mod physical_memory;
|
||
|
mod pit;
|
||
|
mod qemu_exit;
|
||
|
mod serial;
|
||
|
mod simple_loader;
|
||
|
mod start;
|
||
|
mod tasking;
|
||
|
mod virtual_memory;
|
||
|
|
||
|
use simple_loader::SimpleLoader;
|
||
|
use tasking::TASKING;
|
||
|
pub static INITRD: &[u8] = include_bytes!("../initrd.tar");
|
||
|
use elfloader::ElfBinary;
|
||
|
use tar_no_std::TarArchiveRef;
|
||
|
use x86_64::registers::rflags::{self, RFlags};
|
||
|
|
||
|
pub fn main() {
|
||
|
let mut rflags_data = rflags::read();
|
||
|
rflags_data |= RFlags::IOPL_HIGH | RFlags::IOPL_LOW;
|
||
|
unsafe {
|
||
|
rflags::write(rflags_data);
|
||
|
}
|
||
|
gdt::init();
|
||
|
interrupts::init();
|
||
|
kernel_heap::init();
|
||
|
pit::init(100);
|
||
|
let initrd = TarArchiveRef::new(INITRD);
|
||
|
let init = ElfBinary::new(
|
||
|
initrd
|
||
|
.entries()
|
||
|
.find(|x| x.filename() == *"bin/init")
|
||
|
.expect("Could not find init in initrd")
|
||
|
.data(),
|
||
|
)
|
||
|
.expect("Init not an ELF binary");
|
||
|
TASKING
|
||
|
.lock()
|
||
|
.new_process(
|
||
|
init.entry_point() as _,
|
||
|
SimpleLoader::load(&init).expect("Failed to load init"),
|
||
|
)
|
||
|
.expect("Failed to create init process");
|
||
|
}
|