#![no_std] // 不链接 Rust 标准库 #![no_main] // 禁用 main 入口点,因为没有运行时 #![feature(custom_test_frameworks)] #![test_runner(anos::test_runner)] #![reexport_test_harness_main = "test_main"] extern crate alloc; use anos::println; use bootloader::{entry_point, BootInfo}; use core::panic::PanicInfo; use alloc::{boxed::Box, rc::Rc, vec, vec::Vec}; entry_point!(kernel_main); fn kernel_main(boot_info: &'static BootInfo) -> ! { use anos::memory::{self, BootInfoFrameAllocator}; use anos::allocator; use x86_64::{structures::paging::Page, VirtAddr}; println!("Hello World{}", "!"); anos::init(); let phys_mem_offset = VirtAddr::new(boot_info.physical_memory_offset); let mut mapper = unsafe { memory::init(phys_mem_offset) }; let mut frame_allocator = unsafe { BootInfoFrameAllocator::init(&boot_info.memory_map) }; let page = Page::containing_address(VirtAddr::new(0xdeadbeaf000)); memory::create_example_mapping(page, &mut mapper, &mut frame_allocator); let page_ptr: *mut u64 = page.start_address().as_mut_ptr(); unsafe { page_ptr.offset(400).write_volatile(0x_f021_f077_f065_f04e) }; allocator::init_heap(&mut mapper, &mut frame_allocator).expect("heap initialization failed"); let heap_value = Box::new(41); println!("heap_value at {:p}", heap_value); let mut vec = Vec::new(); for i in 0..500 { vec.push(i); } println!("vec at {:p}", vec.as_slice()); let reference_counted = Rc::new(vec![1, 2, 3]); let cloned_reference = reference_counted.clone(); println!( "current reference count is {}", Rc::strong_count(&cloned_reference) ); core::mem::drop(reference_counted); println!( "reference count is {} now", Rc::strong_count(&cloned_reference) ); // 触发一个中断 x86_64::instructions::interrupts::int3(); println!("It didn't crash!"); #[cfg(test)] test_main(); anos::hlt_loop(); } // 在非测试模式下,将 panic 信息打印到 VGA 缓冲区 #[cfg(not(test))] #[panic_handler] // panic! 时将会进行栈展开,执行各种 drop 函数来回收垃圾 // 禁用标准库之后,这些东西就都没有了,我们需要把它重写一遍 fn panic(info: &PanicInfo) -> ! { println!("{}", info); anos::hlt_loop(); } #[cfg(test)] #[panic_handler] fn panic(info: &PanicInfo) -> ! { anos::test_panic_handler(info) }