From 5b59005f930266d0e9c0092373e894826150f862 Mon Sep 17 00:00:00 2001 From: LoGin Date: Sun, 4 Feb 2024 15:46:24 +0800 Subject: [PATCH] =?UTF-8?q?x86=5F64:=20=E4=BD=BF=E7=94=A8Rust=E9=87=8D?= =?UTF-8?q?=E5=86=99=E5=86=85=E6=A0=B8=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=20(#507)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * x86_64: 使用Rust重写内核初始化代码 --- kernel/Cargo.toml | 2 + kernel/src/arch/riscv64/init/mod.rs | 80 +++++--- kernel/src/arch/riscv64/mod.rs | 5 + kernel/src/arch/riscv64/process/idle.rs | 19 ++ kernel/src/arch/riscv64/process/mod.rs | 1 + kernel/src/arch/riscv64/sched.rs | 18 ++ kernel/src/arch/riscv64/smp/mod.rs | 15 ++ kernel/src/arch/x86_64/asm/head.S | 11 +- kernel/src/arch/x86_64/c_adapter.rs | 11 +- kernel/src/arch/x86_64/driver/c_adapter.rs | 27 +-- kernel/src/arch/x86_64/driver/hpet.rs | 2 +- kernel/src/arch/x86_64/init/main.c | 205 +------------------- kernel/src/arch/x86_64/init/mod.rs | 117 +++++++++++ kernel/src/arch/x86_64/mod.rs | 5 +- kernel/src/arch/x86_64/process/c_adapter.rs | 20 -- kernel/src/arch/x86_64/process/idle.rs | 19 ++ kernel/src/arch/x86_64/process/mod.rs | 2 +- kernel/src/arch/x86_64/sched.rs | 32 ++- kernel/src/arch/x86_64/setup.rs | 10 - kernel/src/arch/x86_64/smp/mod.rs | 32 ++- kernel/src/common/printk.h | 1 - kernel/src/driver/base/c_adapter.rs | 10 - kernel/src/driver/base/init.rs | 4 +- kernel/src/driver/base/mod.rs | 1 - kernel/src/driver/pci/pci.rs | 22 +-- kernel/src/exception/softirq.rs | 1 + kernel/src/filesystem/vfs/core.rs | 7 +- kernel/src/init/c_adapter.rs | 11 -- kernel/src/init/init.rs | 84 ++++++++ kernel/src/init/mod.rs | 19 +- kernel/src/libs/futex/futex.rs | 5 - kernel/src/libs/lib_ui/screen_manager.h | 7 - kernel/src/libs/lib_ui/screen_manager.rs | 12 +- kernel/src/libs/lib_ui/textui.h | 7 - kernel/src/libs/lib_ui/textui.rs | 33 ++-- kernel/src/mm/c_adapter.rs | 10 +- kernel/src/mm/init.rs | 1 + kernel/src/process/c_adapter.rs | 7 +- kernel/src/process/kthread.rs | 2 + kernel/src/process/mod.rs | 1 + kernel/src/sched/core.rs | 7 +- kernel/src/sched/mod.rs | 12 ++ kernel/src/smp/mod.rs | 12 ++ kernel/src/syscall/mod.rs | 15 +- kernel/src/time/clocksource.h | 2 +- kernel/src/time/clocksource.rs | 5 - kernel/src/time/jiffies.h | 3 - kernel/src/time/timekeeping.h | 3 - kernel/src/time/timekeeping.rs | 14 +- kernel/src/time/timer.h | 11 -- kernel/src/time/timer.rs | 3 +- kernel/src/virt/kvm/mod.rs | 4 +- 52 files changed, 494 insertions(+), 475 deletions(-) create mode 100644 kernel/src/arch/riscv64/process/idle.rs create mode 100644 kernel/src/arch/riscv64/smp/mod.rs delete mode 100644 kernel/src/arch/x86_64/process/c_adapter.rs create mode 100644 kernel/src/arch/x86_64/process/idle.rs delete mode 100644 kernel/src/arch/x86_64/setup.rs delete mode 100644 kernel/src/driver/base/c_adapter.rs delete mode 100644 kernel/src/init/c_adapter.rs create mode 100644 kernel/src/init/init.rs delete mode 100644 kernel/src/libs/lib_ui/screen_manager.h delete mode 100644 kernel/src/time/jiffies.h delete mode 100644 kernel/src/time/timekeeping.h delete mode 100644 kernel/src/time/timer.h diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml index 1effba09..62cb65e1 100644 --- a/kernel/Cargo.toml +++ b/kernel/Cargo.toml @@ -19,6 +19,8 @@ members = [ default = ["backtrace"] # 内核栈回溯 backtrace = [] +# kvm +kvm = [] # 运行时依赖项 diff --git a/kernel/src/arch/riscv64/init/mod.rs b/kernel/src/arch/riscv64/init/mod.rs index 8951b465..1c851151 100644 --- a/kernel/src/arch/riscv64/init/mod.rs +++ b/kernel/src/arch/riscv64/init/mod.rs @@ -1,13 +1,12 @@ -use core::intrinsics::unreachable; - use fdt::node::FdtNode; +use system_error::SystemError; use crate::{ arch::mm::init::mm_early_init, driver::{firmware::efi::init::efi_init, open_firmware::fdt::open_firmware_fdt_driver}, - init::{boot_params, init_before_mem_init}, + init::{boot_params, init::start_kernel}, kdebug, kinfo, - mm::{init::mm_init, memblock::mem_block_manager, PhysAddr, VirtAddr}, + mm::{memblock::mem_block_manager, PhysAddr, VirtAddr}, print, println, }; @@ -33,37 +32,19 @@ impl ArchBootParams { } } +static mut BOOT_HARTID: usize = 0; +static mut BOOT_FDT_PADDR: PhysAddr = PhysAddr::new(0); + #[no_mangle] unsafe extern "C" fn kernel_main(hartid: usize, fdt_paddr: usize) -> ! { let fdt_paddr = PhysAddr::new(fdt_paddr); - // system_reset(sbi::reset::ResetType::Shutdown, sbi::reset::ResetReason::NoReason); - init_before_mem_init(); - boot_params().write().arch.fdt_paddr = fdt_paddr; - kinfo!( - "DragonOS kernel is running on hart {}, fdt address:{:?}", - hartid, - fdt_paddr - ); - - mm_early_init(); - - let fdt = fdt::Fdt::from_ptr(fdt_paddr.data() as *const u8).expect("Failed to parse fdt!"); - print_node(fdt.find_node("/").unwrap(), 0); - - parse_dtb(); - - for x in mem_block_manager().to_iter() { - kdebug!("before efi: {x:?}"); + unsafe { + BOOT_HARTID = hartid; + BOOT_FDT_PADDR = fdt_paddr; } - efi_init(); - - open_firmware_fdt_driver().early_init_fdt_scan_reserved_mem(); - - mm_init(); - loop {} - unreachable() + start_kernel(); } #[inline(never)] @@ -92,3 +73,44 @@ unsafe fn parse_dtb() { .early_scan_device_tree() .expect("Failed to scan device tree at boottime."); } + +#[inline(never)] +pub fn early_setup_arch() -> Result<(), SystemError> { + let hartid = unsafe { BOOT_HARTID }; + let fdt_paddr = unsafe { BOOT_FDT_PADDR }; + boot_params().write().arch.fdt_paddr = fdt_paddr; + kinfo!( + "DragonOS kernel is running on hart {}, fdt address:{:?}", + hartid, + fdt_paddr + ); + mm_early_init(); + + let fdt = + unsafe { fdt::Fdt::from_ptr(fdt_paddr.data() as *const u8).expect("Failed to parse fdt!") }; + print_node(fdt.find_node("/").unwrap(), 0); + + unsafe { parse_dtb() }; + + for x in mem_block_manager().to_iter() { + kdebug!("before efi: {x:?}"); + } + + efi_init(); + + open_firmware_fdt_driver().early_init_fdt_scan_reserved_mem(); + + return Ok(()); +} + +#[inline(never)] +pub fn setup_arch() -> Result<(), SystemError> { + // todo + return Ok(()); +} + +#[inline(never)] +pub fn setup_arch_post() -> Result<(), SystemError> { + // todo + return Ok(()); +} diff --git a/kernel/src/arch/riscv64/mod.rs b/kernel/src/arch/riscv64/mod.rs index 24319be2..e7c2fe22 100644 --- a/kernel/src/arch/riscv64/mod.rs +++ b/kernel/src/arch/riscv64/mod.rs @@ -13,6 +13,7 @@ pub mod pio; pub mod process; pub mod rand; pub mod sched; +pub mod smp; pub mod syscall; pub mod time; @@ -24,3 +25,7 @@ pub use self::pio::RiscV64PortIOArch as CurrentPortIOArch; pub use self::time::RiscV64TimeArch as CurrentTimeArch; pub use self::elf::RiscV64ElfArch as CurrentElfArch; + +pub use crate::arch::smp::RiscV64SMPArch as CurrentSMPArch; + +pub use crate::arch::sched::RiscV64SchedArch as CurrentSchedArch; diff --git a/kernel/src/arch/riscv64/process/idle.rs b/kernel/src/arch/riscv64/process/idle.rs new file mode 100644 index 00000000..f003f69c --- /dev/null +++ b/kernel/src/arch/riscv64/process/idle.rs @@ -0,0 +1,19 @@ +use core::hint::spin_loop; + +use crate::{arch::CurrentIrqArch, exception::InterruptArch, kBUG, process::ProcessManager}; + +impl ProcessManager { + /// 每个核的idle进程 + pub fn arch_idle_func() -> ! { + loop { + if CurrentIrqArch::is_irq_enabled() { + unsafe { + riscv::asm::wfi(); + } + } else { + kBUG!("Idle process should not be scheduled with IRQs disabled."); + spin_loop(); + } + } + } +} diff --git a/kernel/src/arch/riscv64/process/mod.rs b/kernel/src/arch/riscv64/process/mod.rs index 2a4baed5..fde3ae98 100644 --- a/kernel/src/arch/riscv64/process/mod.rs +++ b/kernel/src/arch/riscv64/process/mod.rs @@ -5,6 +5,7 @@ use crate::process::{fork::KernelCloneArgs, KernelStack, ProcessControlBlock, Pr use super::interrupt::TrapFrame; +pub mod idle; pub mod kthread; pub mod syscall; diff --git a/kernel/src/arch/riscv64/sched.rs b/kernel/src/arch/riscv64/sched.rs index 8a9cf82d..5bc5e31d 100644 --- a/kernel/src/arch/riscv64/sched.rs +++ b/kernel/src/arch/riscv64/sched.rs @@ -1,5 +1,23 @@ +use crate::sched::SchedArch; + /// 发起调度 #[no_mangle] pub extern "C" fn sched() { unimplemented!("RiscV64::sched") } + +pub struct RiscV64SchedArch; + +impl SchedArch for RiscV64SchedArch { + fn enable_sched_local() { + todo!() + } + + fn disable_sched_local() { + todo!() + } + + fn initial_setup_sched_local() { + todo!() + } +} diff --git a/kernel/src/arch/riscv64/smp/mod.rs b/kernel/src/arch/riscv64/smp/mod.rs new file mode 100644 index 00000000..973bd86a --- /dev/null +++ b/kernel/src/arch/riscv64/smp/mod.rs @@ -0,0 +1,15 @@ +use system_error::SystemError; + +use crate::smp::SMPArch; + +pub struct RiscV64SMPArch; + +impl SMPArch for RiscV64SMPArch { + fn prepare_cpus() -> Result<(), SystemError> { + todo!() + } + + fn init() -> Result<(), SystemError> { + todo!() + } +} diff --git a/kernel/src/arch/x86_64/asm/head.S b/kernel/src/arch/x86_64/asm/head.S index 4e043db1..c85531e8 100644 --- a/kernel/src/arch/x86_64/asm/head.S +++ b/kernel/src/arch/x86_64/asm/head.S @@ -417,15 +417,16 @@ repeat_set_idt: pushq %rax + // 传参 + movq mb2_info, %rdi + movq mb2_magic, %rsi + movq %r13, %rdx // GDT size + movq %r12, %r10 // IDT size - movq mb2_info, %r15 - movq mb2_magic, %r14 - - lretq go_to_kernel: - .quad Start_Kernel + .quad kernel_main start_smp: diff --git a/kernel/src/arch/x86_64/c_adapter.rs b/kernel/src/arch/x86_64/c_adapter.rs index d79ae525..5666b303 100644 --- a/kernel/src/arch/x86_64/c_adapter.rs +++ b/kernel/src/arch/x86_64/c_adapter.rs @@ -1,15 +1,6 @@ use crate::time::TimeArch; -use super::{ - driver::tsc::TSCManager, setup::setup_arch, syscall::init_syscall_64, CurrentTimeArch, -}; - -#[no_mangle] -unsafe extern "C" fn rs_setup_arch() -> i32 { - return setup_arch() - .map(|_| 0) - .unwrap_or_else(|e| e.to_posix_errno()); -} +use super::{driver::tsc::TSCManager, syscall::init_syscall_64, CurrentTimeArch}; /// 获取当前的时间戳 #[no_mangle] diff --git a/kernel/src/arch/x86_64/driver/c_adapter.rs b/kernel/src/arch/x86_64/driver/c_adapter.rs index 09c56421..dc47630e 100644 --- a/kernel/src/arch/x86_64/driver/c_adapter.rs +++ b/kernel/src/arch/x86_64/driver/c_adapter.rs @@ -1,29 +1,4 @@ -use super::{ - hpet::{hpet_init, hpet_instance}, - tsc::TSCManager, -}; - -#[no_mangle] -unsafe extern "C" fn rs_hpet_init() -> i32 { - hpet_init() - .map(|_| 0) - .unwrap_or_else(|e| e.to_posix_errno()) -} - -#[no_mangle] -unsafe extern "C" fn rs_hpet_enable() -> i32 { - hpet_instance() - .hpet_enable() - .map(|_| 0) - .unwrap_or_else(|e| e.to_posix_errno()) -} - -#[no_mangle] -unsafe extern "C" fn rs_tsc_init() -> i32 { - TSCManager::init() - .map(|_| 0) - .unwrap_or_else(|e| e.to_posix_errno()) -} +use super::hpet::hpet_instance; #[no_mangle] unsafe extern "C" fn rs_handle_hpet_irq(timer_num: u32) { diff --git a/kernel/src/arch/x86_64/driver/hpet.rs b/kernel/src/arch/x86_64/driver/hpet.rs index 82b2bd28..5ceda536 100644 --- a/kernel/src/arch/x86_64/driver/hpet.rs +++ b/kernel/src/arch/x86_64/driver/hpet.rs @@ -106,7 +106,7 @@ impl Hpet { } /// 使能HPET - pub(super) fn hpet_enable(&self) -> Result<(), SystemError> { + pub fn hpet_enable(&self) -> Result<(), SystemError> { // !!!这里是临时糊代码的,需要在apic重构的时候修改!!! let (inner_guard, regs) = unsafe { self.hpet_regs_mut() }; let freq = regs.frequency(); diff --git a/kernel/src/arch/x86_64/init/main.c b/kernel/src/arch/x86_64/init/main.c index b073d17e..125e53c5 100644 --- a/kernel/src/arch/x86_64/init/main.c +++ b/kernel/src/arch/x86_64/init/main.c @@ -2,207 +2,10 @@ // Created by longjin on 2022/1/20. // -#include "common/glib.h" -#include "common/kprint.h" -#include "common/printk.h" -#include "exception/gate.h" -#include "exception/irq.h" -#include "exception/trap.h" -#include "mm/mm.h" -#include "mm/slab.h" -#include "process/process.h" -#include "smp/smp.h" -#include "syscall/syscall.h" -#include -#include -#include -#include -#include +#include -#include -#include "driver/acpi/acpi.h" -#include "driver/disk/ata.h" -#include "driver/multiboot2/multiboot2.h" -#include