rcore-os / rCore-Tutorial-v3

Let's write an OS which can run on RISC-V in Rust from scratch!
https://rcore-os.github.io/rCore-Tutorial-Book-v3/index.html
GNU General Public License v3.0
1.58k stars 452 forks source link

请教一个问题,ch4中为什么需要修改user test啊?最近遇到的问题可能与这个有关。 #132

Closed Sober7135 closed 8 months ago

Sober7135 commented 8 months ago

https://github.com/rcore-os/rCore-Tutorial-v3/blob/e2c2949d612b737fb93bcf2d7a7d6244e6e397c9/user/src/bin/00power_3.rs#L9C28-L9C28 很久之前的一个commit(8ee3671269ccbebcc962ef61ec30c3dd525b6d93),这里将数组变为static mut并且放在了全局,但是我发现现在的ch4使用原来的版本也能运行

最近我也写ch4,我自己实现的(并没有完全按找教程写)有一个很奇怪的问题。将数组放在全局不会报错,但是放在main函数内会。

另外,下面这段代码,在release却可以运行。。

#[no_mangle]
fn main() -> i32 {
    let mut s: [u64; 100] = [0; 100];
    for i in 1..100 {
        s[i] = i as u64;
        println!("{}", s[i]);
    }
    0
}

总之非常疑惑,debug了半天发现了原来ch4的user test改了,我不知道是我写的有问题,还是说出现这些错误是意料之中于是修改了user test(然后后面的commit又修正了这个问题(?))由于那个commit太久远,编译不了(大概是因为依赖的git库的依赖太新了),也没办法验证我的想法,所以消耗一下公共资源过来询问一下

wyfcyx commented 8 months ago

数组放在main函数里面的话是开在栈上的,全局声明的话是在.bss或者.data段里面,唯一的区别只有这个。可以看看是不是爆栈(应该不会,整个数组只有800字节,距离一个4K页还有很远)了,或者sp寄存器维护出问题了?

另外,在最新版的tutorial上,将用例的数组修改为main函数内声明,也是能正常跑的。

Sober7135 commented 8 months ago

感谢回复!感觉可能不是sp的问题,毕竟ch3跑的好好的。。。anyway我再debug一下!

BTW,还有几个问题顺便问一下

wyfcyx commented 8 months ago

1.copy_data确实只需要&PageTable就行了,后面改 2.当self.0usize::MAX的时候,self.0+PAGE_SIZE就溢出了,所以至少这样写还有问题

Sober7135 commented 8 months ago

感谢!