rust-based-os-comp2022 icon indicating copy to clipboard operation
rust-based-os-comp2022 copied to clipboard

lab0 关于 shutdown 和 panic 的实现中存在可能的循环调用的问题

Open x14ngch3n opened this issue 2 years ago • 2 comments

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 函数能够正常停机?

x14ngch3n avatar Jul 09 '22 05:07 x14ngch3n

两个函数都是单独设计的吧,只不过都用到了对方而已,panic在处理错误后调用关机代码,关机代码在遇到调用 sbi 关机函数失败后用 panic 打印失败信息。如果形成循环,那只能说硬件或者 sbi 的关机代码出了问题,这些问题内核也没法解决。

traversalnat avatar Jul 09 '22 07:07 traversalnat

两个函数都是单独设计的吧,只不过都用到了对方而已,panic在处理错误后调用关机代码,关机代码在遇到调用 sbi 关机函数失败后用 panic 打印失败信息。如果形成循环,那只能说硬件或者 sbi 的关机代码出了问题,这些问题内核也没法解决。

是啊是啊,我就是觉得如果关机代码失败的情况下,会导致循环,只能等它又成功关机才行。不过确实是内核解决不了的,应该和 sbi_call 底层的逻辑有关系

x14ngch3n avatar Jul 09 '22 07:07 x14ngch3n