kernel/src/main.rs

61 lines
1.4 KiB
Rust
Raw Normal View History

2022-11-01 07:24:50 -05:00
#![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");
}