From ac26122fc614d1ed2044bb89784e9cd3d4f79962 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E7=9D=BF?= Date: Tue, 21 Jan 2025 10:30:54 +0800 Subject: [PATCH] task ok --- crates/sparreal-kernel/src/globals/mod.rs | 2 ++ crates/sparreal-kernel/src/platform/mod.rs | 12 ++++++++++++ crates/sparreal-kernel/src/task/tcb.rs | 22 ++++++++++++++-------- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/crates/sparreal-kernel/src/globals/mod.rs b/crates/sparreal-kernel/src/globals/mod.rs index 287e360..2a7204b 100644 --- a/crates/sparreal-kernel/src/globals/mod.rs +++ b/crates/sparreal-kernel/src/globals/mod.rs @@ -16,6 +16,8 @@ use crate::{ platform::{self, cpu_list}, }; +pub const STACK_SIZE: usize = 32 * 1024 * 1024; + mod percpu; pub struct GlobalVal { diff --git a/crates/sparreal-kernel/src/platform/mod.rs b/crates/sparreal-kernel/src/platform/mod.rs index 5d6c74d..cafc263 100644 --- a/crates/sparreal-kernel/src/platform/mod.rs +++ b/crates/sparreal-kernel/src/platform/mod.rs @@ -113,6 +113,18 @@ pub fn kstack_size() -> usize { PlatformImpl::kstack_size() } +pub fn page_size() -> usize { + #[cfg(feature = "mmu")] + { + MMUImpl::page_size() + } + + #[cfg(not(feature = "mmu"))] + { + 0x1000 + } +} + pub fn app_main() { unsafe extern "C" { fn __sparreal_rt_main(); diff --git a/crates/sparreal-kernel/src/task/tcb.rs b/crates/sparreal-kernel/src/task/tcb.rs index 140eede..73dc990 100644 --- a/crates/sparreal-kernel/src/task/tcb.rs +++ b/crates/sparreal-kernel/src/task/tcb.rs @@ -9,7 +9,13 @@ use core::{ use alloc::{boxed::Box, string::String}; use log::debug; -use crate::{globals::global_val, mem::VirtAddr, platform_if::PlatformImpl, task::schedule::*}; +use crate::{ + globals::{STACK_SIZE, global_val}, + mem::VirtAddr, + platform, + platform_if::PlatformImpl, + task::schedule::*, +}; use super::{TaskConfig, TaskError}; @@ -59,7 +65,8 @@ impl TaskControlBlock { let buffer = NonNull::new(unsafe { alloc::alloc::alloc_zeroed( - Layout::from_size_align(Self::tcb_size(config.stack_size), TCB_ALIGN).unwrap(), + Layout::from_size_align(Self::tcb_size(config.stack_size), platform::page_size()) + .unwrap(), ) }) .ok_or(TaskError::NoMemory)?; @@ -94,7 +101,7 @@ impl TaskControlBlock { let buffer = NonNull::new(unsafe { alloc::alloc::alloc_zeroed( - Layout::from_size_align(Self::tcb_size(0), TCB_ALIGN).unwrap(), + Layout::from_size_align(Self::tcb_size(0), platform::page_size()).unwrap(), ) }) .ok_or(TaskError::NoMemory) @@ -126,15 +133,14 @@ impl TaskControlBlock { unsafe { self.stack_bottom().add(self.stack_size) } } - pub(super) fn stack(&self) -> &[u8] { - unsafe { core::slice::from_raw_parts_mut(self.stack_bottom(), self.stack_size) } - } - pub(super) unsafe fn drop(self) { let size = Self::tcb_size(self.stack_size); unsafe { - alloc::alloc::dealloc(self.0, Layout::from_size_align_unchecked(size, TCB_ALIGN)) + alloc::alloc::dealloc( + self.0, + Layout::from_size_align_unchecked(size, platform::page_size()), + ) }; }