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 232 forks source link

rCore-Tutorial-Book-v3/chapter1/8answer #128

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/chapter1/8answer.html

xiaoxiangmoe commented 2 years ago

编程题1 中,Rust 的 std::fs::read_dir 不包括 ...。和 C 的实现好像匹配不上。

OccupyMars2025 commented 1 year ago

https://github.com/riscv-non-isa/riscv-sbi-doc/blob/master/riscv-sbi.adoc#system-reset-extension-eid-0x53525354-srst

HangX-Ma commented 1 year ago

@一楼 用 std::process::Command 调用带参数的 ls 命令即可

starccy commented 1 year ago

@xiaoxiangmoe 输出的结果数组中手动添加 ... /doge

Scallions commented 7 months ago

/没有.. 😂

gitwillsky commented 7 months ago

"应用程度对内存的访问需要通过 MMU" -> 应用程序

Phixsura commented 5 months ago

pub fn sleep(mills_second: u64) { // Qemu 的mtime寄存器的时钟频率为10MHz,每次增加0.1微妙(100纳秒)1比10_000_000 // 入参数为毫秒为1:10_000 let nano_duration = mills_second.checked_mul(10_000).expect("Overflow in time calculation"); let start_time = unsafe { get_current_time() }; // 计算唤醒时间,同时注意处理可能的溢出 let wake_time = start_time.checked_add(nano_duration).expect("Overflow in wake time calculation"); // 使用SBI调用设置唤醒时间

[allow(deprecated)]

sbi_rt::legacy::set_timer(wake_time);
println!("Wake time = {}", wake_time);
loop {
    if unsafe { get_current_time() } > wake_time {
        break;
    }

    unsafe {
        asm!("wfi")
    }
}

} const MTIME_ADDR: const u64 = 0x200BFF8 as const u64; // 假定的mtime地址,根据你的具体硬件来更改

unsafe fn get_current_time() -> u64 { return *MTIME_ADDR; }

WindDevil commented 3 months ago

第三题的实现可以参看:"https://www.cnblogs.com/chenhan-winddevil/p/18292661" ,建议完成第三章的学习之后再完成.

ejacky commented 2 months ago

0x10742 在 flap 函数内。根据 flap 函数的开头可知,这个函数的栈帧大小是 16 个字节,所以调用>者处的栈指针应该是 sp + 16 = 0x40007f1320。调用 flap 的调用者返回地址保存在栈上 8(sp) ,可>以读出来是 0x10750 ,还在 flap 函数内

这句里 8(sp) 不是 0x40007f1328 吗?

lythesia commented 1 month ago

0x10742 在 flap 函数内。根据 flap 函数的开头可知,这个函数的栈帧大小是 16 个字节,所以调用>者处的栈指针应该是 sp + 16 = 0x40007f1320。调用 flap 的调用者返回地址保存在栈上 8(sp) ,可>以读出来是 0x10750 ,还在 flap 函数内

这句里 8(sp) 不是 0x40007f1328 吗?

@ejacky 这里的意思是调用者的栈指针sp + 16, 而调用者的返回地址保存在栈指针-8, 所以是sp + 16 - 8 = sp + 8, 即0x40007f1318