rcore-os / rCore-Tutorial-Book-v3

A book about how to write OS kernels in Rust easily.
https://rcore-os.github.io/rCore-Tutorial-Book-v3/
GNU General Public License v3.0
1.23k stars 233 forks source link

rCore-Tutorial-Book-v3/chapter3/3multiprogramming #138

Open utterances-bot opened 2 years ago

utterances-bot commented 2 years ago

多道程序与协作式调度 — rCore-Tutorial-Book-v3 3.6.0-alpha.1 文档

https://rcore-os.github.io/rCore-Tutorial-Book-v3/chapter3/3multiprogramming.html

status-code-404 commented 2 years ago

请问我们在使用switch加载了s0-s11寄存器之后调用restore有重新加载了x5-x27这个过程,switch加载的寄存器数据不久被restore覆盖了么?

wyfcyx commented 2 years ago

请问我们在使用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会被覆盖,但正如之前所说这些寄存器的值目前本来就是无意义的,可以随意覆盖。

zhuiYeah commented 2 years ago

pub struct TaskManager { num_app: usize, inner: UPSafeCell, }

这里是否应该是UnSafeCell

zhuiYeah commented 2 years ago

是我搞错了 没问题了😂

JasonkayZK commented 2 years ago

为什么在多道程序中,我在 user/bin 目录下又创建了一个新的应用,比如:01write_bb.rs, 然后启动并加载之后就会报错了呢?

FOWind commented 2 years ago
let mut inner = self.inner.borrow_mut();

应该是

let mut inner = self.inner.exclusive_access();

吧。 Codebase 里是 exclusive_access

Dexterali commented 2 years ago

请问大家:这个"如果是应用出错也应该调用该接口,不过我们这里并没有实现,有兴趣的同学可以尝试"有同学实现了吗?我尝试实现,发现如果有两个应用出错(这里的两个出错应用我沿用的是ch2分支的03priv_inst.rs04store_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) }

如果是一个应用出错,则内核将正常运行。

ghost commented 1 year ago

为什么在mark_current_suspendedmark_current_exited中调用了self.inner.exclusive_access()不需要像ch2一样手动drop()呢?

wyfcyx commented 1 year ago

@lyingqi 因为这两个函数并没有通过__switch跨越函数调用边界,而是可以正常返回,于是编译器会在返回的时候帮助我们进行drop。

OccupyMars2025 commented 1 year ago

https://riscv-programming.org/book/riscv-book.html#pf26

lythesia commented 1 month ago

请问大家:这个"如果是应用出错也应该调用该接口,不过我们这里并没有实现,有兴趣的同学可以尝试"有同学实现了吗?我尝试实现,发现如果有两个应用出错(这里的两个出错应用我沿用的是ch2分支的03priv_inst.rs04store_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