diff --git a/src/arch/x86_64/smp.rs b/src/arch/x86_64/smp.rs index 3bc2af0..3af5555 100644 --- a/src/arch/x86_64/smp.rs +++ b/src/arch/x86_64/smp.rs @@ -19,8 +19,12 @@ pub fn start_other_cores(acpi: &ACPI_Result, mc: &mut MemoryController) { let page_table = unsafe{ *(0xFFFF_FFFF_FFFF_FFF8 as *const u32) } & 0xFFFF_F000; for i in 1 .. acpi.cpu_num { let apic_id = acpi.cpu_acpi_ids[i as usize]; + let kstack = mc.alloc_stack(7).unwrap(); + let kstack_top = kstack.top() as u64; + use core::mem::forget; + forget(kstack); // TODO pass this kstack to new AP *args = EntryArgs { - kstack: mc.alloc_stack(7).unwrap().top() as u64, + kstack: kstack_top, page_table: page_table, stack: 0x8000, // just enough stack to get us to entry64mp }; diff --git a/src/lib.rs b/src/lib.rs index c8801c3..1b997cc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -41,6 +41,7 @@ mod util; #[macro_use] // test! mod test_util; mod consts; +mod process; #[allow(dead_code)] #[cfg(target_arch = "x86_64")] @@ -76,9 +77,11 @@ pub extern "C" fn rust_main(multiboot_information_address: usize) -> ! { // memory_controller.print_page_table(); arch::smp::start_other_cores(&acpi, &mut memory_controller); + process::init(memory_controller.kernel_stack.take().unwrap()); + unsafe{ arch::interrupt::enable(); } - unsafe{ int!(120); } // to user +// unsafe{ int!(120); } // to user loop{} @@ -95,7 +98,7 @@ pub extern "C" fn other_main() -> ! { let cpu_id = arch::driver::apic::lapic_id(); println!("Hello world! from CPU {}!", arch::driver::apic::lapic_id()); unsafe{ arch::smp::notify_started(cpu_id); } - unsafe{ let a = *(0xdeadbeaf as *const u8); } // Page fault +// unsafe{ let a = *(0xdeadbeaf as *const u8); } // Page fault loop {} } diff --git a/src/memory/mod.rs b/src/memory/mod.rs index d039ddb..29a6b39 100644 --- a/src/memory/mod.rs +++ b/src/memory/mod.rs @@ -46,7 +46,7 @@ pub fn init(boot_info: &BootInformation) -> MemoryController { boot_info_start, boot_info_end, memory_map_tag.memory_areas()); - let mut active_table = remap_the_kernel(&mut frame_allocator, boot_info); + let (mut active_table, kernel_stack) = remap_the_kernel(&mut frame_allocator, boot_info); use self::paging::Page; use consts::{KERNEL_HEAP_OFFSET, KERNEL_HEAP_SIZE}; @@ -67,14 +67,15 @@ pub fn init(boot_info: &BootInformation) -> MemoryController { }; MemoryController { - active_table: active_table, - frame_allocator: frame_allocator, - stack_allocator: stack_allocator, + kernel_stack: Some(kernel_stack), + active_table, + frame_allocator, + stack_allocator, } } pub fn remap_the_kernel(allocator: &mut A, boot_info: &BootInformation) - -> ActivePageTable + -> (ActivePageTable, Stack) where A: FrameAllocator { let mut temporary_page = TemporaryPage::new(Page::containing_address(0xcafebabe), allocator); @@ -137,12 +138,14 @@ pub fn remap_the_kernel(allocator: &mut A, boot_info: &BootInformation) let stack_bottom = PhysicalAddress(stack_bottom as u64).to_kernel_virtual(); let stack_bottom_page = Page::containing_address(stack_bottom); active_table.unmap(stack_bottom_page, allocator); + let kernel_stack = Stack::new(stack_bottom + 8 * PAGE_SIZE, stack_bottom + 1 * PAGE_SIZE); println!("guard page at {:#x}", stack_bottom_page.start_address()); - active_table + (active_table, kernel_stack) } pub struct MemoryController { + pub kernel_stack: Option, active_table: paging::ActivePageTable, frame_allocator: AreaFrameAllocator, stack_allocator: stack_allocator::StackAllocator, @@ -150,7 +153,8 @@ pub struct MemoryController { impl MemoryController { pub fn alloc_stack(&mut self, size_in_pages: usize) -> Option { - let &mut MemoryController { ref mut active_table, + let &mut MemoryController { ref mut kernel_stack, + ref mut active_table, ref mut frame_allocator, ref mut stack_allocator } = self; stack_allocator.alloc_stack(active_table, frame_allocator, diff --git a/src/memory/stack_allocator.rs b/src/memory/stack_allocator.rs index 7249874..83a2f37 100644 --- a/src/memory/stack_allocator.rs +++ b/src/memory/stack_allocator.rs @@ -61,7 +61,7 @@ pub struct Stack { } impl Stack { - fn new(top: usize, bottom: usize) -> Stack { + pub(super) fn new(top: usize, bottom: usize) -> Stack { assert!(top > bottom); Stack { top: top, @@ -77,3 +77,9 @@ impl Stack { self.bottom } } + +impl Drop for Stack { + fn drop(&mut self) { + panic!("stack leak: {:#x?}", self); + } +} \ No newline at end of file diff --git a/src/process.rs b/src/process.rs new file mode 100644 index 0000000..9706526 --- /dev/null +++ b/src/process.rs @@ -0,0 +1,64 @@ +use alloc::{boxed::Box, string::String, btree_map::BTreeMap}; +use memory::Stack; + +pub fn init(kstack: Stack) { + let processor = Box::new(Processor::new(kstack)); + Box::into_raw(processor); +} + +#[derive(Debug)] +pub struct Process { + pid: Pid, + name: String, + kstack: Stack, +// page_table: Box, + status: Status, + context: Context, +} + +#[derive(Debug)] +struct Context { + +} + +#[derive(Debug)] +enum Status { + Uninit, Ready, Running, Sleeping(usize), Exited +} + +struct Processor { + procs: BTreeMap>, +} + +type Pid = usize; + +impl Processor { + fn new(kernel_stack: Stack) -> Self { + let mut processor = Processor { + procs: BTreeMap::>::new(), + }; + let initproc = Box::new(Process{ + pid: 0, + name: String::from("initproc"), + kstack: kernel_stack, + status: Status::Running, + context: Context{}, + }); + processor.procs.insert(0, initproc); + processor + } + fn alloc_pid(&self) -> Pid { + let mut next: Pid = 0; + for &i in self.procs.keys() { + if i != next { + return next; + } else { + next = i + 1; + } + } + return next; + } + fn schedule(&self) { + + } +} \ No newline at end of file