rCore-Tutorial-Book-v3
rCore-Tutorial-Book-v3 copied to clipboard
rCore-Tutorial-Book-v3/chapter7/4signal
信号 - rCore-Tutorial-Book-v3 3.6.0-alpha.1 文档
http://rcore-os.cn/rCore-Tutorial-Book-v3/chapter7/4signal.html
pub fn sigaction(signum: i32, action: *const SignalAction, old_action:
*const SignalAction) -> isize {
sys_sigaction(signum, action, old_action)
}
这里old_action
的类型应该是*mut SignalAction
。
如何->如果内核发现进程由于内存访问错误等产生异常
sys_kill
的主要工作是对进程号为pid的进程发值为signum的信号。具体而言,先根据
pid
这段似乎少了`
,导致格式有点乱。
pub fn sys_sigreturn() -> isize {
if let Some(task) = current_task() {
let mut inner = task.inner_exclusive_access();
inner.handling_sig = -1;
// restore the trap context
let trap_ctx = inner.get_trap_cx();
*trap_ctx = inner.trap_ctx_backup.unwrap();
0
} else {
-1
}
}
这里的返回值不应该是 trap_ctx_backup
存储的信号处理前的中断返回值吗。
@341101 也就是说进程上下文中的a0
寄存器现在会被0覆盖掉,而它应该保持不变,您是想表达这个意思吗?
@wyfcyx 对
@341101 好的,多谢您指出这个错误,稍后有空时修改。
SignalFlags::SIGCONT => {
if task_inner.signals.contains(SignalFlags::SIGCONT) {
task_inner.signals ^= SignalFlags::SIGCONT;
task_inner.frozen = false;
}
}
这里的if task_inner.signals.contains(SignalFlags::SIGCONT)
有什么作用呢?
注意使用
translated_ref(mut)
的前提是类型T
不会跨页,我们通过设置SignalAction
对齐到 16 字节来保证这一点。
不会跨页跟对齐有什么关系?
不太理解... 为啥对齐到 16 字节就不会夸虚拟内存页, 这里有什么黑魔法吗?