rust-based-os-comp2022
rust-based-os-comp2022 copied to clipboard
lab0 关于 shutdown 和 panic 的实现中存在可能的循环调用的问题
lab0 在 sbi.rs 中实现了 shutdown 方法来停机,该方法的代码如下:
pub fn shutdown() -> ! {
sbi_call(SBI_SHUTDOWN, 0, 0, 0);
panic!("It should shutdown!");
}
我理解正常情况下在执行完 sbi_call 后,程序已经停机,所以 panic! 是用于处理停机失败的情况的。但根据 lang_items.rs 中实现的 panic 方法,代码如下:
#[panic_handler]
fn panic(info: &PanicInfo) -> ! {
if let Some(location) = info.location() {
println!(
"Panicked at {}:{} {}",
location.file(),
location.line(),
info.message().unwrap()
);
} else {
println!("Panicked: {}", info.message().unwrap());
}
shutdown()
}
发现调用 panic! 宏时也调用了 shutdown,这会不会存在一个循环调用的问题,从而导致不能停机?或者说是这样的循环调用是特意设计的,直到 shutdown 函数能够正常停机?
两个函数都是单独设计的吧,只不过都用到了对方而已,panic在处理错误后调用关机代码,关机代码在遇到调用 sbi 关机函数失败后用 panic 打印失败信息。如果形成循环,那只能说硬件或者 sbi 的关机代码出了问题,这些问题内核也没法解决。
两个函数都是单独设计的吧,只不过都用到了对方而已,panic在处理错误后调用关机代码,关机代码在遇到调用 sbi 关机函数失败后用 panic 打印失败信息。如果形成循环,那只能说硬件或者 sbi 的关机代码出了问题,这些问题内核也没法解决。
是啊是啊,我就是觉得如果关机代码失败的情况下,会导致循环,只能等它又成功关机才行。不过确实是内核解决不了的,应该和 sbi_call 底层的逻辑有关系