Open utterances-bot opened 2 years ago
请问我们在使用switch加载了s0-s11寄存器之后调用restore有重新加载了x5-x27这个过程,switch加载的寄存器数据不久被restore覆盖了么?
请问我们在使用switch加载了s0-s11寄存器之后调用restore有重新加载了x5-x27这个过程,switch加载的寄存器数据不久被restore覆盖了么?
@status-code-404 在这里我们讨论的是如何从内核态第一次进入用户态执行用户态代码。此时__switch
加载的TaskContext是由TaskContext::goto_restore
生成的,可以看到里面的s0-s11均为0,也就是并不带有任何信息,只是起到一个占位作用。真正有意义的是TaskContext中ra和sp两个寄存器的值,它们能帮助我们从内核栈的位置开始执行__restore
回到用户态。这个过程中s0-s11会被覆盖,但正如之前所说这些寄存器的值目前本来就是无意义的,可以随意覆盖。
pub struct TaskManager {
num_app: usize,
inner: UPSafeCell
这里是否应该是UnSafeCell
是我搞错了 没问题了😂
为什么在多道程序中,我在 user/bin 目录下又创建了一个新的应用,比如:01write_bb.rs
,
然后启动并加载之后就会报错了呢?
let mut inner = self.inner.borrow_mut();
应该是
let mut inner = self.inner.exclusive_access();
吧。
Codebase 里是 exclusive_access
请问大家:这个"如果是应用出错也应该调用该接口,不过我们这里并没有实现,有兴趣的同学可以尝试"有同学实现了吗?我尝试实现,发现如果有两个应用出错(这里的两个出错应用我沿用的是ch2分支的03priv_inst.rs
和04store_fail.rs
并且它们被排在第四,第五)内核会panic。报错信息如下:
AAAAAAAAAA [1/5] [INFO]: 0 is coming to an end! BBBBBBBBBB [1/2] [INFO]: 1 is coming to an end! CCCCCCCCCC [1/3] [INFO]: 2 is coming to an end! Try to execute privileged instruction in U Mode Kernel should kill this application! [kernel] IllegalInstruction in application, kernel killed it. [INFO]: 3 is coming to an end! Panicked at src/syscall/fs.rs:10 called `Result::unwrap()` on an `Err` value: Utf8Error { valid_up_to: 51, error_len: Some(1) }
如果是一个应用出错,则内核将正常运行。
为什么在mark_current_suspended
和mark_current_exited
中调用了self.inner.exclusive_access()
不需要像ch2一样手动drop()
呢?
@lyingqi 因为这两个函数并没有通过__switch跨越函数调用边界,而是可以正常返回,于是编译器会在返回的时候帮助我们进行drop。
请问大家:这个"如果是应用出错也应该调用该接口,不过我们这里并没有实现,有兴趣的同学可以尝试"有同学实现了吗?我尝试实现,发现如果有两个应用出错(这里的两个出错应用我沿用的是ch2分支的
03priv_inst.rs
和04store_fail.rs
并且它们被排在第四,第五)内核会panic。报错信息如下:AAAAAAAAAA [1/5] [INFO]: 0 is coming to an end! BBBBBBBBBB [1/2] [INFO]: 1 is coming to an end! CCCCCCCCCC [1/3] [INFO]: 2 is coming to an end! Try to execute privileged instruction in U Mode Kernel should kill this application! [kernel] IllegalInstruction in application, kernel killed it. [INFO]: 3 is coming to an end! Panicked at src/syscall/fs.rs:10 called `Result::unwrap()` on an `Err` value: Utf8Error { valid_up_to: 51, error_len: Some(1) }
如果是一个应用出错,则内核将正常运行。
默认panic!替换成crate::task::exit_current_and_run_next()是ok的 你这里的报错信息是sys_write出的, 检查一下buf对不对, 以及user下面是否copy/paste的时候带入了non-utf8
多道程序与协作式调度 — rCore-Tutorial-Book-v3 3.6.0-alpha.1 文档
https://rcore-os.github.io/rCore-Tutorial-Book-v3/chapter3/3multiprogramming.html