luodeb / Starry

An experimental modular OS written in Rust.
http://rcore-os.cn/arceos/
Apache License 2.0
1 stars 2 forks source link

执行bin/python3.11 lib/python3.11/test/test_pydoc.py 会出现Page fault address VA:0x162d938 not found in memory set错误 #14

Open 475079076 opened 5 months ago

475079076 commented 5 months ago

郭老师提示:可以关注一下 clone 这个系统调用 上午那个用例最终原因应该是使用到了 vfork ,musl传入的vfork 是 CLONE_VM| CLONE_VFORK(实际我们没有实现) 当前我看了arceos的clone 流程 这种标志会导致创建一个 和父进程共享内存的子进程,如果子进程退出 清空memset 父进程在访问内存 都会出现 mem not found in memset 在还不支持vfork的情况下 我觉得可以先hack一下musl的flags,把vfork 当做 fork,使用和fork一样的 flags

guoweikang commented 5 months ago

diff --git a/ulib/axstarry/src/syscall_task/imp/task.rs b/ulib/axstarry/src/syscall_task/imp/task.rs index 281dec0c..e8ee87a2 100644 --- a/ulib/axstarry/src/syscall_task/imp/task.rs +++ b/ulib/axstarry/src/syscall_task/imp/task.rs

@@ -182,7 +182,10 @@ pub fn syscall_clone(args: [usize; 6]) -> SyscallResult {
         tls = args[3];
         ctid = args[4];
     }
-    let clone_flags = CloneFlags::from_bits((flags & !0x3f) as u32).unwrap();
+    let mut clone_flags = CloneFlags::from_bits((flags & !0x3f) as u32).unwrap();
+    if clone_flags.contains(CloneFlags::CLONE_VFORK) {
+        clone_flags |= !CloneFlags::CLONE_VM; 
+    }

     let stack = if user_stack == 0 {
         None
guoweikang commented 5 months ago

关于 下面错误的原因 44e8ff434863a69ad46a7f30df50d8f

1712647261144 我们可以看到,pagefault的内存地址 位于 oldmem内存空间

通过走读当前memremap的实现 ,发现会有一个从 old_mem 复制内存到 new mem的过程 ,也就是会访问oldmem空间

这里需要考虑: 如果old_mem 分配完以后的某段内存中并没有人访问过(没有触发pagefault) 也就是还没有分配内存的话,就可能出现这个问题, 因此 临时修改方案为: old_mem 也主动分配物理内存 这样就不会有pagefault

1712647412830

但是 后续更加完善的方案应该是这样的: memremap 需要考虑 oldmem 没有分配物理内存的情况(也没有使用) 没有分配物理内存的地址空间 其实不需要执行copy动作,这样是更加完善的方案