From 6202cfb8bf56d2aa41eb5213cb3460a5cf4a9375 Mon Sep 17 00:00:00 2001 From: ParrotXray Date: Sun, 12 Oct 2025 14:14:04 +0800 Subject: [PATCH] refactor: Change file structure and rename --- TODO.txt | 2 +- builder/build.rs | 4 +-- kernel/src/arch/amd64/isr.rs | 3 +- kernel/src/arch/amd64/mod.rs | 1 - kernel/src/{arch/amd64 => hal}/acpi.rs | 0 kernel/src/hal/cpu.rs | 34 ++++++++++++++----- kernel/src/hal/mod.rs | 22 ++---------- kernel/src/hal/rtc.rs | 0 kernel/src/{ => kernel}/k_init.rs | 15 ++++---- kernel/src/{ => kernel}/k_main.rs | 4 +-- kernel/src/kernel/mod.rs | 2 ++ kernel/src/libs/logger.rs | 1 - kernel/src/libs/mod.rs | 3 +- kernel/src/libs/string.rs | 0 kernel/src/main.rs | 10 +++--- .../frame.rs} | 2 +- kernel/src/mm/{ => allocator}/heap.rs | 3 +- kernel/src/mm/allocator/mod.rs | 2 ++ kernel/src/mm/mod.rs | 5 +-- kernel/src/mm/paging.rs | 0 kernel/src/mm/vmm.rs | 0 21 files changed, 59 insertions(+), 54 deletions(-) rename kernel/src/{arch/amd64 => hal}/acpi.rs (100%) create mode 100644 kernel/src/hal/rtc.rs rename kernel/src/{ => kernel}/k_init.rs (91%) rename kernel/src/{ => kernel}/k_main.rs (92%) create mode 100644 kernel/src/kernel/mod.rs create mode 100644 kernel/src/libs/string.rs rename kernel/src/mm/{frame_allocator.rs => allocator/frame.rs} (97%) rename kernel/src/mm/{ => allocator}/heap.rs (95%) create mode 100644 kernel/src/mm/allocator/mod.rs create mode 100644 kernel/src/mm/paging.rs create mode 100644 kernel/src/mm/vmm.rs diff --git a/TODO.txt b/TODO.txt index ef82997..17b2f21 100644 --- a/TODO.txt +++ b/TODO.txt @@ -4,7 +4,7 @@ // - ACPI 初始化 - OK // - PIC/APIC 初始化 -// - 滾動 +// - 滾動 - OK // 2. 內存管理 // - 物理內存分配器 diff --git a/builder/build.rs b/builder/build.rs index 7c21ad5..9fa0e17 100644 --- a/builder/build.rs +++ b/builder/build.rs @@ -20,8 +20,8 @@ fn main() { .create_disk_image(&uefi_path) .expect("Failed to create UEFI disk image"); - println!("cargo:warning=✓ BIOS image: {:?}", bios_path); - println!("cargo:warning=✓ UEFI image: {:?}", uefi_path); + println!("cargo:warning=BIOS image: {:?}", bios_path); + println!("cargo:warning=UEFI image: {:?}", uefi_path); println!("cargo:rustc-env=BIOS_IMAGE={}", bios_path.display()); println!("cargo:rustc-env=UEFI_IMAGE={}", uefi_path.display()); diff --git a/kernel/src/arch/amd64/isr.rs b/kernel/src/arch/amd64/isr.rs index a58466f..d92aac0 100644 --- a/kernel/src/arch/amd64/isr.rs +++ b/kernel/src/arch/amd64/isr.rs @@ -2,6 +2,7 @@ use x86_64::structures::idt::{InterruptStackFrame, PageFaultErrorCode}; use crate::kprintln; use crate::{log_trace, log_debug, log_info, log_warn, log_error, log_fatal}; +use crate::hal::cpu; /// Divide Error (#DE) pub extern "x86-interrupt" fn divide_error_handler(stack_frame: InterruptStackFrame) { @@ -151,7 +152,7 @@ pub extern "x86-interrupt" fn page_fault_handler( kprintln!(); log_fatal!("EXCEPTION: PAGE FAULT (#PF)"); - log_fatal!("Accessed Address: {:?}", Cr2::read()); + log_fatal!("Accessed Address: {:?}", cpu::cpu_r_cr2()); log_fatal!("Error Code: {:?}", error_code); log_fatal!("Present: {}", error_code.contains(PageFaultErrorCode::PROTECTION_VIOLATION)); log_fatal!("Write: {}", error_code.contains(PageFaultErrorCode::CAUSED_BY_WRITE)); diff --git a/kernel/src/arch/amd64/mod.rs b/kernel/src/arch/amd64/mod.rs index ebb6a2d..bbdfd89 100644 --- a/kernel/src/arch/amd64/mod.rs +++ b/kernel/src/arch/amd64/mod.rs @@ -1,5 +1,4 @@ pub mod gdt; pub mod idt; pub mod isr; -pub mod acpi; // pub mod segment; \ No newline at end of file diff --git a/kernel/src/arch/amd64/acpi.rs b/kernel/src/hal/acpi.rs similarity index 100% rename from kernel/src/arch/amd64/acpi.rs rename to kernel/src/hal/acpi.rs diff --git a/kernel/src/hal/cpu.rs b/kernel/src/hal/cpu.rs index 81f2adc..1214f1c 100644 --- a/kernel/src/hal/cpu.rs +++ b/kernel/src/hal/cpu.rs @@ -2,6 +2,7 @@ use x86_64::registers::control::{Cr0, Cr0Flags, Cr2, Cr3, Cr4, Cr4Flags}; use x86_64::instructions::{interrupts, hlt}; use core::arch::asm; +use x86_64::{PhysAddr, structures::paging::PhysFrame}; use x86_64::VirtAddr; /// 64 位元暫存器類型 @@ -51,8 +52,8 @@ pub struct SgReg { /// 讀取 CR0 暫存器 #[allow(dead_code)] #[inline] -pub fn cpu_r_cr0() -> Cr0Flags { - Cr0::read() +pub fn cpu_r_cr0() -> u64 { + Cr0::read_raw() } /// 讀取 CR2 暫存器 @@ -65,15 +66,34 @@ pub fn cpu_r_cr2() -> u64 { /// 讀取 CR3 暫存器 #[allow(dead_code)] #[inline] -pub fn cpu_r_cr3() -> u64 { - Cr3::read().0.start_address().as_u64() +pub fn cpu_r_cr3_frame() -> PhysFrame { + Cr3::read_raw().0 } +#[allow(dead_code)] +#[inline] +pub fn cpu_r_cr3_flag() -> u16 { + Cr3::read_raw().1 +} + +#[allow(dead_code)] +#[inline] +pub fn cpu_r_cr3() -> u64 { + cpu_r_cr3_addr().as_u64() +} + +#[allow(dead_code)] +#[inline] +pub fn cpu_r_cr3_addr() -> PhysAddr { + cpu_r_cr3_frame().start_address() +} + + /// 讀取 CR4 暫存器 #[allow(dead_code)] #[inline] -pub fn cpu_r_cr4() -> Cr4Flags { - Cr4::read() +pub fn cpu_r_cr4() -> u64 { + Cr4::read_raw() } /// 寫入 CR0 暫存器 @@ -87,8 +107,6 @@ pub fn cpu_w_cr0(val: Cr0Flags) { #[allow(dead_code)] #[inline] pub fn cpu_w_cr3(val: u64) { - use x86_64::{PhysAddr, structures::paging::PhysFrame}; - let frame = PhysFrame::containing_address(PhysAddr::new(val)); unsafe { Cr3::write(frame, Cr3::read().1); diff --git a/kernel/src/hal/mod.rs b/kernel/src/hal/mod.rs index 77bd768..c380425 100644 --- a/kernel/src/hal/mod.rs +++ b/kernel/src/hal/mod.rs @@ -1,22 +1,4 @@ pub mod io; pub mod cpu; - -pub use io::io_port_wb; -pub use io::io_port_wl; -pub use io::io_port_rb; -pub use io::io_port_rl; - -pub use cpu::cpu_r_cr0; -pub use cpu::cpu_r_cr2; -pub use cpu::cpu_r_cr3; -pub use cpu::cpu_w_cr0; -pub use cpu::cpu_w_cr3; -pub use cpu::cpu_get_model; -pub use cpu::cpu_brand_string_supported; -pub use cpu::cpu_get_brand; -pub use cpu::cpu_rdtsc; -pub use cpu::cpu_pause; -pub use cpu::cpu_halt; -pub use cpu::cpu_idle; -pub use cpu::cpu_enable_interrupts; -pub use cpu::cpu_disable_interrupts; \ No newline at end of file +pub mod acpi; +mod rtc; \ No newline at end of file diff --git a/kernel/src/hal/rtc.rs b/kernel/src/hal/rtc.rs new file mode 100644 index 0000000..e69de29 diff --git a/kernel/src/k_init.rs b/kernel/src/kernel/k_init.rs similarity index 91% rename from kernel/src/k_init.rs rename to kernel/src/kernel/k_init.rs index ec2f946..fb20f0d 100644 --- a/kernel/src/k_init.rs +++ b/kernel/src/kernel/k_init.rs @@ -2,13 +2,14 @@ use bootloader_api::BootInfo; use x86_64::structures::paging::OffsetPageTable; use x86_64::VirtAddr; -use crate::arch::amd64::{gdt, idt, acpi}; -use crate::mm::{heap, frame_allocator}; +use crate::arch::amd64::{gdt, idt}; +use crate::mm::allocator::{heap, frame}; use crate::tty::tty; use crate::kprintln; -use crate::k_main; -use crate::libs::logger::{init as logger_init, LoggerConfig, LogLevel}; -use crate::{log_trace, log_debug, log_info, log_warn, log_error}; +use crate::kernel::k_main; +use crate::libs::logger::{init as logger_init, LogLevel, LoggerConfig}; +use crate::{log_debug, log_error, log_info, log_trace, log_warn}; +use crate::hal::acpi; fn _logger_init() { logger_init( @@ -28,7 +29,7 @@ fn _critical_init() { fn _memory_init( memory_regions: &'static bootloader_api::info::MemoryRegions, physical_memory_offset: u64 -) -> (OffsetPageTable<'static>, frame_allocator::BootInfoFrameAllocator) { +) -> (OffsetPageTable<'static>, frame::BootInfoFrameAllocator) { let phys_mem_offset = VirtAddr::new(physical_memory_offset); let mut mapper = unsafe { @@ -36,7 +37,7 @@ fn _memory_init( }; let mut frame_allocator = unsafe { - frame_allocator::BootInfoFrameAllocator::init(memory_regions) + frame::BootInfoFrameAllocator::init(memory_regions) }; heap::init_heap(&mut mapper, &mut frame_allocator) diff --git a/kernel/src/k_main.rs b/kernel/src/kernel/k_main.rs similarity index 92% rename from kernel/src/k_main.rs rename to kernel/src/kernel/k_main.rs index bd1eb40..c005197 100644 --- a/kernel/src/k_main.rs +++ b/kernel/src/kernel/k_main.rs @@ -16,10 +16,10 @@ pub fn _kernel_main() -> ! { ); kprintln!(); - log_debug!("CR0: 0x{:016x}", cpu::cpu_r_cr0().bits()); + log_debug!("CR0: 0x{:016x}", cpu::cpu_r_cr0()); log_debug!("CR2: 0x{:016x}", cpu::cpu_r_cr2()); log_debug!("CR3: 0x{:016x}", cpu::cpu_r_cr3()); - log_debug!("CR4: 0x{:016x}", cpu::cpu_r_cr4().bits()); + log_debug!("CR4: 0x{:016x}", cpu::cpu_r_cr4()); // kprintln!(); // kprintln!("=== Logger Level Demonstration ==="); diff --git a/kernel/src/kernel/mod.rs b/kernel/src/kernel/mod.rs new file mode 100644 index 0000000..3e0ac12 --- /dev/null +++ b/kernel/src/kernel/mod.rs @@ -0,0 +1,2 @@ +pub mod k_init; +pub mod k_main; \ No newline at end of file diff --git a/kernel/src/libs/logger.rs b/kernel/src/libs/logger.rs index 5786fa7..193b918 100644 --- a/kernel/src/libs/logger.rs +++ b/kernel/src/libs/logger.rs @@ -92,7 +92,6 @@ impl LoggerState { tty::write_str(level.tag(), level.color()); tty::write_str(" ", 0xFFFFFF); - // 如果啟用位置信息 if self.config.show_location { if let (Some(f), Some(l)) = (file, line) { let mut location_buf = [0u8; 128]; diff --git a/kernel/src/libs/mod.rs b/kernel/src/libs/mod.rs index 6b4328e..fd02c8a 100644 --- a/kernel/src/libs/mod.rs +++ b/kernel/src/libs/mod.rs @@ -1,2 +1,3 @@ pub mod print; -pub mod logger; \ No newline at end of file +pub mod logger; +pub mod string; \ No newline at end of file diff --git a/kernel/src/libs/string.rs b/kernel/src/libs/string.rs new file mode 100644 index 0000000..e69de29 diff --git a/kernel/src/main.rs b/kernel/src/main.rs index b1189ab..6e261b9 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -17,11 +17,10 @@ use x86_64::{ mod hal; mod libs; -mod k_init; -mod k_main; pub mod arch; pub mod mm; pub mod tty; +pub mod kernel; use hal::cpu; const CONFIG: BootloaderConfig = { @@ -30,8 +29,7 @@ const CONFIG: BootloaderConfig = { config }; -entry_point!(k_init::_kernel_init, config = &CONFIG); - +entry_point!(kernel::k_init::_kernel_init, config = &CONFIG); #[cfg(not(test))] #[panic_handler] @@ -43,10 +41,10 @@ fn panic(info: &PanicInfo) -> ! { kprintln!(); log_fatal!("{}", info); kprintln!(); - log_fatal!(" CR0: 0x{:016x}", cpu::cpu_r_cr0().bits()); + log_fatal!(" CR0: 0x{:016x}", cpu::cpu_r_cr0()); log_fatal!(" CR2: 0x{:016x}", cpu::cpu_r_cr2()); log_fatal!(" CR3: 0x{:016x}", cpu::cpu_r_cr3()); - log_fatal!(" CR4: 0x{:016x}", cpu::cpu_r_cr4().bits()); + log_fatal!(" CR4: 0x{:016x}", cpu::cpu_r_cr4()); loop { cpu::cpu_halt(); diff --git a/kernel/src/mm/frame_allocator.rs b/kernel/src/mm/allocator/frame.rs similarity index 97% rename from kernel/src/mm/frame_allocator.rs rename to kernel/src/mm/allocator/frame.rs index 4e488c0..b321ae3 100644 --- a/kernel/src/mm/frame_allocator.rs +++ b/kernel/src/mm/allocator/frame.rs @@ -1,5 +1,5 @@ -// kernel/src/mm/frame_allocator.rs +// kernel/src/mm/frame use bootloader_api::info::{MemoryRegion, MemoryRegionKind, MemoryRegions}; use x86_64::{ structures::paging::{FrameAllocator, PhysFrame, Size4KiB}, diff --git a/kernel/src/mm/heap.rs b/kernel/src/mm/allocator/heap.rs similarity index 95% rename from kernel/src/mm/heap.rs rename to kernel/src/mm/allocator/heap.rs index 4ea647a..a3fe455 100644 --- a/kernel/src/mm/heap.rs +++ b/kernel/src/mm/allocator/heap.rs @@ -61,7 +61,8 @@ pub fn init_heap( } pub unsafe fn get_level_4_table(physical_memory_offset: VirtAddr) -> &'static mut PageTable { - let virt = physical_memory_offset + cpu::cpu_r_cr3(); + let phys = cpu::cpu_r_cr3_addr().as_u64(); + let virt = physical_memory_offset + phys; let page_table_ptr: *mut PageTable = virt.as_mut_ptr(); &mut *page_table_ptr diff --git a/kernel/src/mm/allocator/mod.rs b/kernel/src/mm/allocator/mod.rs new file mode 100644 index 0000000..dbaf89e --- /dev/null +++ b/kernel/src/mm/allocator/mod.rs @@ -0,0 +1,2 @@ +pub mod frame; +pub mod heap; \ No newline at end of file diff --git a/kernel/src/mm/mod.rs b/kernel/src/mm/mod.rs index 8990591..46e5ce6 100644 --- a/kernel/src/mm/mod.rs +++ b/kernel/src/mm/mod.rs @@ -1,2 +1,3 @@ -pub mod frame_allocator; -pub mod heap; \ No newline at end of file +pub mod allocator; +pub mod paging; +pub mod vmm; \ No newline at end of file diff --git a/kernel/src/mm/paging.rs b/kernel/src/mm/paging.rs new file mode 100644 index 0000000..e69de29 diff --git a/kernel/src/mm/vmm.rs b/kernel/src/mm/vmm.rs new file mode 100644 index 0000000..e69de29