diff --git a/os/src/syscall/mod.rs b/os/src/syscall/mod.rs index 4ee28f4c88eac6031552d2a0f00a5caf50364119..089838e60e9e909d726f556f772cb79405eeba44 100644 --- a/os/src/syscall/mod.rs +++ b/os/src/syscall/mod.rs @@ -51,6 +51,7 @@ const SYSCALL_SETUID: usize =146; const SYSCALL_KILL: usize = 129; const SYSCALL_SIGACTION: usize = 134; const SYSCALL_SIGPROCMASK: usize = 135; +const SYSCALL_SIGRETURN: usize = 139; const SYSCALL_TIMES: usize = 153; const SYSCALL_SETPGID:usize = 154; const SYSCALL_GETPGID:usize = 155; @@ -144,6 +145,9 @@ pub fn syscall(syscall_id: usize, args: [usize; 6]) -> isize { SYSCALL_SIGPROCMASK => { result = Ok(sys_sigprocmask(args[0] as i32, args[1] as *const _, args[2] as *mut _)); } + SYSCALL_SIGRETURN => { + result = Ok(sys_sigreturn()); + } SYSCALL_GET_TIME => { result = sys_get_time(args[0] as *mut TimeSpec); }, @@ -362,6 +366,9 @@ fn sysid_to_string(syscall_id: usize)->String{ SYSCALL_SIGPROCMASK => { ret.push_str("sys_sigprocmask"); }, + SYSCALL_SIGRETURN => { + ret.push_str("sys_sigreturn"); + } SYSCALL_GET_TIME => { ret.push_str("sys_gettime"); }, diff --git a/os/src/syscall/process.rs b/os/src/syscall/process.rs index a916b2fb4c5c967df90b7d56ae05e4c5c69870e8..7493cbcaf655eaf6d5ecd5a5ab76520b5a6de89d 100644 --- a/os/src/syscall/process.rs +++ b/os/src/syscall/process.rs @@ -553,17 +553,7 @@ pub fn sys_kill(pid: usize, signal: u32) -> SysResult<isize> { } } -fn check_sigaction_error(signal: SignalFlags, action: usize, old_action: usize) -> bool { - if action == 0 - || old_action == 0 - || signal == SignalFlags::SIGKILL - || signal == SignalFlags::SIGSTOP - { - true - } else { - false - } -} + pub fn sys_sigaction( signum: i32, @@ -575,41 +565,43 @@ pub fn sys_sigaction( let mut inner = task.inner_exclusive_access(); // 检查信å·ç¼–å·æ˜¯å¦åˆæ³• - if signum as usize > MAX_SIG { - println!("[kernel] sys_sigaction: Invalid signal number: {}", signum); + if signum <= 0 || signum as usize > MAX_SIG { + return -1; } // å°† signum 转æ¢ä¸º SignalFlags - if let Some(flag) = SignalFlags::from_bits(1 << signum) { - // æ£€æŸ¥å‚æ•°æ˜¯å¦åˆæ³• - if check_sigaction_error(flag, action as usize, old_action as usize) { - println!( - "[kernel] sys_sigaction: Invalid parameters for signal: {:?}", flag - ); - return -1; + let flag = match SignalFlags::from_bits(1 << signum) { + Some(flag) => flag, + None => { + + SignalFlags::empty() } + }; - // ä¿å˜æ—§çš„ä¿¡å·å¤„ç†å‡½æ•° - let prev_action = inner.signal_actions.table[signum as usize]; - if !old_action.is_null() { - *translated_refmut(token, old_action) = prev_action; - } + // æ£€æŸ¥å‚æ•°æ˜¯å¦åˆæ³• + if check_sigaction_error(flag) { + + return -1; + } - // 设置新的信å·å¤„ç†å‡½æ•° - if !action.is_null() { - inner.signal_actions.table[signum as usize] = *translated_ref(token, action); - } + // ä¿å˜æ—§çš„ä¿¡å·å¤„ç†å‡½æ•° + let prev_action = inner.signal_actions.table[signum as usize]; + if !old_action.is_null() { + *translated_refmut(token, old_action) = prev_action; + } - println!( - "[kernel] sys_sigaction: Set signal handler for signum={}, handler={:#x}", - signum, inner.signal_actions.table[signum as usize].handler - ); - 0 - } else { - println!("[kernel] sys_sigaction: Signal not supported: {}", signum); - -1 + // 设置新的信å·å¤„ç†å‡½æ•° + if !action.is_null() { + inner.signal_actions.table[signum as usize] = *translated_ref(token, action); } + + 0 +} + +fn check_sigaction_error(signal: SignalFlags) -> bool { + // åªé™åˆ¶ SIGKILL å’Œ SIGSTOP + signal == SignalFlags::SIGKILL || signal == SignalFlags::SIGSTOP } // 定义 how 傿•°çš„å¯èƒ½å€¼ï¼ˆå‚考 POSIX) @@ -634,27 +626,18 @@ pub fn sys_sigprocmask(how: i32, set: *const SignalFlags, oldset: *mut SignalFla match how { SIG_BLOCK => { inner.signal_mask |= new_set; - println!( - "[kernel] sys_sigprocmask: Block signals, new mask: {:#x}", - inner.signal_mask.bits() - ); + } SIG_UNBLOCK => { inner.signal_mask &= !new_set; - println!( - "[kernel] sys_sigprocmask: Unblock signals, new mask: {:#x}", - inner.signal_mask.bits() - ); + } SIG_SETMASK => { inner.signal_mask = new_set; - println!( - "[kernel] sys_sigprocmask: Set signal mask to {:#x}", - inner.signal_mask.bits() - ); + } _ => { - println!("[kernel] sys_sigprocmask: Invalid how value: {}", how); + return -1; } } @@ -662,7 +645,25 @@ pub fn sys_sigprocmask(how: i32, set: *const SignalFlags, oldset: *mut SignalFla 0 } else { - println!("[kernel] sys_sigprocmask: No current task found"); + -1 } } + +pub fn sys_sigreturn() -> isize { + if let Some(task) = current_task() { + let mut task_inner = task.inner_exclusive_access(); + if let Some(backup) = task_inner.trap_ctx_backup.take() { + task_inner.handling_sig = -1; + task_inner.trap_cx = backup; + // 返回信å·å¤„ç†ç¨‹åºçš„返回值(通常为 0) + 0 + } else { + + -1 + } + } else { + + -1 + } +} \ No newline at end of file diff --git a/os/src/task/mod.rs b/os/src/task/mod.rs index d8f75a758bafb5b343f9d3558ed04ff9ea2efc0f..afb78eb5ea827542640b26d7e59219fe84758d5f 100644 --- a/os/src/task/mod.rs +++ b/os/src/task/mod.rs @@ -151,11 +151,14 @@ fn check_pending_signals() { Some(task) => task, None => return, }; - for sig in 0..=MAX_SIG { + for sig in 1..=MAX_SIG { let task_inner = task.inner_exclusive_access(); let signal = match SignalFlags::from_bits(1 << sig) { Some(signal) => signal, - None => continue, + None => { + println!("[kernel] check_pending_signals: Signal {} not in SignalFlags, but proceeding", sig); + SignalFlags::empty() + } }; // æ£€æŸ¥ä¿¡å·æ˜¯å¦è¢«å±è”½ if task_inner.signals.contains(signal) { @@ -191,7 +194,6 @@ fn check_pending_signals() { if signal == SignalFlags::SIGKILL || signal == SignalFlags::SIGSTOP || signal == SignalFlags::SIGCONT - || signal == SignalFlags::SIGDEF { call_kernel_signal_handler(sig, signal); } else { @@ -203,29 +205,28 @@ fn check_pending_signals() { } /// 处ç†å†…æ ¸æ€ä¿¡å· -fn call_kernel_signal_handler(_sig: usize, signal: SignalFlags) { +fn call_kernel_signal_handler(sig: usize, signal: SignalFlags) { let task = current_task().unwrap(); let mut task_inner = task.inner_exclusive_access(); match signal { SignalFlags::SIGSTOP => { task_inner.frozen = true; task_inner.signals.remove(SignalFlags::SIGSTOP); + println!("[kernel] Task {} stopped by SIGSTOP", task.getpid()); } SignalFlags::SIGCONT => { task_inner.frozen = false; task_inner.signals.remove(SignalFlags::SIGCONT); + println!("[kernel] Task {} continued by SIGCONT", task.getpid()); } SignalFlags::SIGKILL => { task_inner.killed = true; - // ä¸è¦ç§»é™¤ä¿¡å·ï¼Œä¿ç•™ä»¥ä¾¿ check_error 使用 - } - SignalFlags::SIGDEF => { - // 默认信å·å¤„ç†ï¼šå¿½ç•¥ - task_inner.signals.remove(SignalFlags::SIGDEF); + println!("[kernel] Task {} killed by SIGKILL", task.getpid()); } _ => { - // å…¶ä»–ä¿¡å·ï¼šç»ˆæ¢è¿›ç¨‹ + // å…¶ä»–å†…æ ¸ä¿¡å·ï¼šç»ˆæ¢è¿›ç¨‹ task_inner.killed = true; + println!("[kernel] Task {} terminated by signal {}", task.getpid(), sig); } } } @@ -248,16 +249,34 @@ fn call_user_signal_handler(sig: usize, signal: SignalFlags) { // 修改 trap 上下文以调用信å·å¤„ç†å‡½æ•° trap_ctx.sepc = handler; trap_ctx.x[10] = sig; // a0 = ä¿¡å·ç¼–å· + println!("[kernel] Calling user signal handler for signal {} at {:#x}", sig, handler); } else { - // 默认行为:终æ¢è¿›ç¨‹ - println!("[kernel] call_user_signal_handler: No handler for signal {}, default action: terminate", sig); - task_inner.killed = true; + // 默认行为 + match signal { + SignalFlags::SIGCHLD => { + // SIGCHLD 默认忽略 + task_inner.signals.remove(signal); + println!("[kernel] Signal {} (SIGCHLD) ignored by default", sig); + } + SignalFlags::SIGCONT => { + // SIGCONT 默认继ç»è¿›ç¨‹ï¼ˆå·²åœ¨ call_kernel_signal_handler ä¸å¤„ç†ï¼‰ + task_inner.signals.remove(signal); + println!("[kernel] Signal {} (SIGCONT) handled by kernel", sig); + } + SignalFlags::SIGWINCH => { + // SIGWINCH 默认忽略 + task_inner.signals.remove(signal); + println!("[kernel] Signal {} (SIGWINCH) ignored by default", sig); + } + _ => { + // å…¶ä»–ä¿¡å·é»˜è®¤ç»ˆæ¢è¿›ç¨‹ + task_inner.killed = true; + println!("[kernel] Task {} terminated by signal {} (default action)", task.getpid(), sig); + } + } } } -/// 检查当å‰ä»»åŠ¡æ˜¯å¦å› ä¿¡å·è¢«ç»ˆæ¢ï¼Œå¹¶è¿”回错误ç å’Œæ¶ˆæ¯ -/// -/// å¦‚æžœä»»åŠ¡è¢«æ ‡è®°ä¸º `killed`,返回 `Some((error_code, error_message))`,å¦åˆ™è¿”回 `None`。 pub fn check_signals_error_of_current() -> Option<(isize, &'static str)> { let task = match current_task() { Some(task) => task, @@ -272,5 +291,4 @@ pub fn check_signals_error_of_current() -> Option<(isize, &'static str)> { } else { None } -} - +} \ No newline at end of file diff --git a/os/src/task/signal.rs b/os/src/task/signal.rs index eec9ffeba08dfdd7064333a9613b3a82595d06cf..c6ebbc06f35fa73f021d89c979517db4c16ddcce 100644 --- a/os/src/task/signal.rs +++ b/os/src/task/signal.rs @@ -5,34 +5,69 @@ use bitflags::*; bitflags! { pub struct SignalFlags: u32 { /// 默认信å·å¤„ç†ï¼Œä¿¡å·ç¼–å·ä¸º 0 - const SIGDEF = 1 << 0; - - /// 挂起信å·ï¼ˆStop),信å·ç¼–å·ä¸º 1 - const SIGSTOP = 1 << 1; - + const SIGDEF = 1 << 0; // 0 + /// 挂起信å·ï¼ˆHangup),信å·ç¼–å·ä¸º 1 + const SIGHUP = 1 << 1; // 1 /// 䏿–ä¿¡å·ï¼ˆInterrupt),通常由 Ctrl+C 触å‘,信å·ç¼–å·ä¸º 2 - const SIGINT = 1 << 2; - - /// ç»§ç»ä¿¡å·ï¼ˆContinue),信å·ç¼–å·ä¸º 3 - const SIGCONT = 1 << 3; - + const SIGINT = 1 << 2; // 2 + /// 退出信å·ï¼ˆQuit),信å·ç¼–å·ä¸º 3 + const SIGQUIT = 1 << 3; // 3 /// éžæ³•指令信å·ï¼ˆIllegal Instruction),信å·ç¼–å·ä¸º 4 - const SIGILL = 1 << 4; - + const SIGILL = 1 << 4; // 4 + /// 陷阱信å·ï¼ˆTrap),信å·ç¼–å·ä¸º 5 + const SIGTRAP = 1 << 5; // 5 /// 终æ¢ä¿¡å·ï¼ˆAbort),通常由程åºé”™è¯¯è§¦å‘,信å·ç¼–å·ä¸º 6 - const SIGABRT = 1 << 6; - + const SIGABRT = 1 << 6; // 6 + /// 总线错误信å·ï¼ˆBus Error),信å·ç¼–å·ä¸º 7 + const SIGBUS = 1 << 7; // 7 /// 浮点异常信å·ï¼ˆFloating-Point Exception),信å·ç¼–å·ä¸º 8 - const SIGFPE = 1 << 8; - + const SIGFPE = 1 << 8; // 8 /// æ€æ»ä¿¡å·ï¼ˆKill),信å·ç¼–å·ä¸º 9 - const SIGKILL = 1 << 9; - + const SIGKILL = 1 << 9; // 9 /// ç”¨æˆ·å®šä¹‰ä¿¡å· 1,信å·ç¼–å·ä¸º 10 - const SIGUSR1 = 1 << 10; - + const SIGUSR1 = 1 << 10; // 10 /// 分段错误信å·ï¼ˆSegmentation Violationï¼‰ï¼Œé€šå¸¸ç”±éžæ³•内å˜è®¿é—®è§¦å‘,信å·ç¼–å·ä¸º 11 - const SIGSEGV = 1 << 11; + const SIGSEGV = 1 << 11; // 11 + /// ç”¨æˆ·å®šä¹‰ä¿¡å· 2,信å·ç¼–å·ä¸º 12 + const SIGUSR2 = 1 << 12; // 12 + /// 管é“错误信å·ï¼ˆBroken Pipe),信å·ç¼–å·ä¸º 13 + const SIGPIPE = 1 << 13; // 13 + /// 闹钟信å·ï¼ˆAlarm Clock),信å·ç¼–å·ä¸º 14 + const SIGALRM = 1 << 14; // 14 + /// 终æ¢ä¿¡å·ï¼ˆTerminate),信å·ç¼–å·ä¸º 15 + const SIGTERM = 1 << 15; // 15 + /// å †æ ˆé”™è¯¯ä¿¡å·ï¼ˆStack Fault),信å·ç¼–å·ä¸º 16 + const SIGSTKFLT = 1 << 16; // 16 + /// åè¿›ç¨‹çŠ¶æ€æ”¹å˜ä¿¡å·ï¼ˆChild Status Changed),信å·ç¼–å·ä¸º 17 + const SIGCHLD = 1 << 17; // 17 + /// ç»§ç»ä¿¡å·ï¼ˆContinue),信å·ç¼–å·ä¸º 18 + const SIGCONT = 1 << 18; // 18 + /// åœæ¢ä¿¡å·ï¼ˆStop),信å·ç¼–å·ä¸º 19 + const SIGSTOP = 1 << 19; // 19 + /// ç»ˆç«¯åœæ¢ä¿¡å·ï¼ˆTerminal Stop),信å·ç¼–å·ä¸º 20 + const SIGTSTP = 1 << 20; // 20 + /// 终端输入信å·ï¼ˆTerminal Input),信å·ç¼–å·ä¸º 21 + const SIGTTIN = 1 << 21; // 21 + /// 终端输出信å·ï¼ˆTerminal Output),信å·ç¼–å·ä¸º 22 + const SIGTTOU = 1 << 22; // 22 + /// 紧急信å·ï¼ˆUrgent Condition),信å·ç¼–å·ä¸º 23 + const SIGURG = 1 << 23; // 23 + /// CPU æ—¶é—´é™åˆ¶ä¿¡å·ï¼ˆCPU Time Limit Exceeded),信å·ç¼–å·ä¸º 24 + const SIGXCPU = 1 << 24; // 24 + /// 文件大å°é™åˆ¶ä¿¡å·ï¼ˆFile Size Limit Exceeded),信å·ç¼–å·ä¸º 25 + const SIGXFSZ = 1 << 25; // 25 + /// 虚拟定时器信å·ï¼ˆVirtual Timer Expired),信å·ç¼–å·ä¸º 26 + const SIGVTALRM = 1 << 26; // 26 + /// 性能分æžå®šæ—¶å™¨ä¿¡å·ï¼ˆProfiling Timer Expired),信å·ç¼–å·ä¸º 27 + const SIGPROF = 1 << 27; // 27 + /// 窗å£å¤§å°æ”¹å˜ä¿¡å·ï¼ˆWindow Size Change),信å·ç¼–å·ä¸º 28 + const SIGWINCH = 1 << 28; // 28 + /// I/O ä¿¡å·ï¼ˆI/O Possible),信å·ç¼–å·ä¸º 29 + const SIGIO = 1 << 29; // 29 + /// ç”µæºæ•…障信å·ï¼ˆPower Failure),信å·ç¼–å·ä¸º 30 + const SIGPWR = 1 << 30; // 30 + /// 系统调用错误信å·ï¼ˆBad System Call),信å·ç¼–å·ä¸º 31 + const SIGSYS = 1 << 31; // 31 } }