refactor: Change file structure and rename
This commit is contained in:
parent
ce0ba28c55
commit
6202cfb8bf
2
TODO.txt
2
TODO.txt
@ -4,7 +4,7 @@
|
||||
// - ACPI 初始化 - OK
|
||||
// - PIC/APIC 初始化
|
||||
|
||||
// - 滾動
|
||||
// - 滾動 - OK
|
||||
|
||||
// 2. 內存管理
|
||||
// - 物理內存分配器
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
pub mod gdt;
|
||||
pub mod idt;
|
||||
pub mod isr;
|
||||
pub mod acpi;
|
||||
// pub mod segment;
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
pub mod acpi;
|
||||
mod rtc;
|
||||
0
kernel/src/hal/rtc.rs
Normal file
0
kernel/src/hal/rtc.rs
Normal file
@ -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)
|
||||
@ -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 ===");
|
||||
2
kernel/src/kernel/mod.rs
Normal file
2
kernel/src/kernel/mod.rs
Normal file
@ -0,0 +1,2 @@
|
||||
pub mod k_init;
|
||||
pub mod k_main;
|
||||
@ -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];
|
||||
|
||||
@ -1,2 +1,3 @@
|
||||
pub mod print;
|
||||
pub mod logger;
|
||||
pub mod logger;
|
||||
pub mod string;
|
||||
0
kernel/src/libs/string.rs
Normal file
0
kernel/src/libs/string.rs
Normal file
@ -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();
|
||||
|
||||
@ -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},
|
||||
@ -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
|
||||
2
kernel/src/mm/allocator/mod.rs
Normal file
2
kernel/src/mm/allocator/mod.rs
Normal file
@ -0,0 +1,2 @@
|
||||
pub mod frame;
|
||||
pub mod heap;
|
||||
@ -1,2 +1,3 @@
|
||||
pub mod frame_allocator;
|
||||
pub mod heap;
|
||||
pub mod allocator;
|
||||
pub mod paging;
|
||||
pub mod vmm;
|
||||
0
kernel/src/mm/paging.rs
Normal file
0
kernel/src/mm/paging.rs
Normal file
0
kernel/src/mm/vmm.rs
Normal file
0
kernel/src/mm/vmm.rs
Normal file
Loading…
x
Reference in New Issue
Block a user