rcore-os / rCore-Tutorial-Book-v3

A book about how to write OS kernels in Rust easily.

Home Page:https://rcore-os.github.io/rCore-Tutorial-Book-v3/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

rCore-Tutorial-Book-v3/chapter7/4signal

utterances-bot opened this issue · comments

信号 - rCore-Tutorial-Book-v3 3.6.0-alpha.1 文档

http://rcore-os.cn/rCore-Tutorial-Book-v3/chapter7/4signal.html

commented
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

这段似乎少了`,导致格式有点乱。

commented
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覆盖掉,而它应该保持不变,您是想表达这个意思吗?

commented

@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 字节来保证这一点。

不会跨页跟对齐有什么关系?