diff --git a/framework/jinux-frame/src/vm/frame.rs b/framework/jinux-frame/src/vm/frame.rs index 89931667f..2cce294fb 100644 --- a/framework/jinux-frame/src/vm/frame.rs +++ b/framework/jinux-frame/src/vm/frame.rs @@ -359,6 +359,24 @@ impl VmFrame { PAGE_SIZE, ) } + + pub fn as_ptr(&self) -> *const u8 { + super::paddr_to_vaddr(self.start_paddr()) as *const u8 + } + + pub fn as_mut_ptr(&self) -> *mut u8 { + super::paddr_to_vaddr(self.start_paddr()) as *mut u8 + } + + pub fn copy_from_frame(&self, src: &VmFrame) { + if Arc::ptr_eq(&self.frame_index, &src.frame_index) { + return; + } + // Safety: src and dst is not overlapped. + unsafe { + core::ptr::copy_nonoverlapping(src.as_ptr(), self.as_mut_ptr(), PAGE_SIZE); + } + } } impl VmIo for VmFrame { diff --git a/services/libs/jinux-std/src/vm/vmo/mod.rs b/services/libs/jinux-std/src/vm/vmo/mod.rs index 5f8a739c1..a494eba77 100644 --- a/services/libs/jinux-std/src/vm/vmo/mod.rs +++ b/services/libs/jinux-std/src/vm/vmo/mod.rs @@ -216,12 +216,12 @@ impl VmoInner { if self.should_share_frame_with_parent(write_page) { return Ok(inherited_frame); } - + let frame = { let options = VmAllocOptions::new(1); VmFrameVec::allocate(&options)?.pop().unwrap() }; - frame.write_bytes(0, &*tmp_buffer)?; + frame.copy_from_frame(&inherited_frame); Ok(frame) }