rCore-Tutorial-Book-v3 icon indicating copy to clipboard operation
rCore-Tutorial-Book-v3 copied to clipboard

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

Open utterances-bot opened this issue 2 years ago • 11 comments

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

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

utterances-bot avatar Jun 14 '22 08:06 utterances-bot

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

status-code-404 avatar Jun 14 '22 08:06 status-code-404

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

wyfcyx avatar Jun 14 '22 22:06 wyfcyx

pub struct TaskManager { num_app: usize, inner: UPSafeCell<TaskManagerInner>, }

这里是否应该是UnSafeCell

zhuiYeah avatar Aug 09 '22 06:08 zhuiYeah

是我搞错了 没问题了😂

zhuiYeah avatar Aug 09 '22 06:08 zhuiYeah

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

JasonkayZK avatar Aug 11 '22 13:08 JasonkayZK

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

应该是

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

吧。 Codebase 里是 exclusive_access

FOWind avatar Oct 18 '22 08:10 FOWind

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

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

Dexterali avatar Nov 12 '22 12:11 Dexterali

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

ghost avatar Apr 03 '23 17:04 ghost

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

wyfcyx avatar Apr 04 '23 01:04 wyfcyx

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

OccupyMars2025 avatar May 13 '23 23:05 OccupyMars2025