mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-08 14:16:47 +00:00
feat(mm): 修复mmap未延迟分配内存的问题 (#837)
* 20240524 3:40 * 20240527 0010 * 修复mmap未延迟分配内存的问题 * Revert "Merge branch 'patch-add-file-mapping' into patch-fix-mmap" This reverts commit 8eb687c60b43831d7e9614bca0af41e8f2175ae8, reversing changes made to 33e9f0b34f9dc35a47757137a29605e51052a26e.
This commit is contained in:
parent
3d4cd853a3
commit
de199e3c86
@ -401,7 +401,7 @@ unsafe extern "C" fn do_page_fault(regs: &'static TrapFrame, error_code: u64) {
|
||||
// panic!("Page Fault");
|
||||
CurrentIrqArch::interrupt_disable();
|
||||
let address = x86::controlregs::cr2();
|
||||
// crate::info!(
|
||||
// log::info!(
|
||||
// "fault address: {:#x}, error_code: {:#b}, pid: {}\n",
|
||||
// address,
|
||||
// error_code,
|
||||
|
@ -861,6 +861,11 @@ impl<Arch: MemoryManagementArch, F: FrameAllocator> PageMapper<Arch, F> {
|
||||
let phys: PhysAddr = self.frame_allocator.allocate_one()?;
|
||||
compiler_fence(Ordering::SeqCst);
|
||||
|
||||
unsafe {
|
||||
let vaddr = MMArch::phys_2_virt(phys).unwrap();
|
||||
MMArch::write_bytes(vaddr, 0, MMArch::PAGE_SIZE);
|
||||
}
|
||||
|
||||
let mut page_manager_guard: SpinLockGuard<'static, PageManager> =
|
||||
page_manager_lock_irqsave();
|
||||
if !page_manager_guard.contains(&phys) {
|
||||
|
@ -329,7 +329,7 @@ impl Syscall {
|
||||
prot_flags,
|
||||
map_flags,
|
||||
true,
|
||||
true,
|
||||
false,
|
||||
)?;
|
||||
return Ok(start_page.virt_address().data());
|
||||
}
|
||||
|
@ -1116,7 +1116,7 @@ impl LockedVMA {
|
||||
let before: Option<Arc<LockedVMA>> = guard.region.before(®ion).map(|virt_region| {
|
||||
let mut vma: VMA = unsafe { guard.clone() };
|
||||
vma.region = virt_region;
|
||||
|
||||
vma.mapped = false;
|
||||
let vma: Arc<LockedVMA> = LockedVMA::new(vma);
|
||||
vma
|
||||
});
|
||||
@ -1124,7 +1124,7 @@ impl LockedVMA {
|
||||
let after: Option<Arc<LockedVMA>> = guard.region.after(®ion).map(|virt_region| {
|
||||
let mut vma: VMA = unsafe { guard.clone() };
|
||||
vma.region = virt_region;
|
||||
|
||||
vma.mapped = false;
|
||||
let vma: Arc<LockedVMA> = LockedVMA::new(vma);
|
||||
vma
|
||||
});
|
||||
@ -1134,20 +1134,24 @@ impl LockedVMA {
|
||||
if let Some(before) = before.clone() {
|
||||
let virt_iter = before.lock().region.iter_pages();
|
||||
for frame in virt_iter {
|
||||
let paddr = utable.translate(frame.virt_address()).unwrap().0;
|
||||
let page = page_manager_guard.get_mut(&paddr);
|
||||
page.insert_vma(before.clone());
|
||||
page.remove_vma(self);
|
||||
if let Some((paddr, _)) = utable.translate(frame.virt_address()) {
|
||||
let page = page_manager_guard.get_mut(&paddr);
|
||||
page.insert_vma(before.clone());
|
||||
page.remove_vma(self);
|
||||
before.lock().mapped = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(after) = after.clone() {
|
||||
let virt_iter = after.lock().region.iter_pages();
|
||||
for frame in virt_iter {
|
||||
let paddr = utable.translate(frame.virt_address()).unwrap().0;
|
||||
let page = page_manager_guard.get_mut(&paddr);
|
||||
page.insert_vma(after.clone());
|
||||
page.remove_vma(self);
|
||||
if let Some((paddr, _)) = utable.translate(frame.virt_address()) {
|
||||
let page = page_manager_guard.get_mut(&paddr);
|
||||
page.insert_vma(after.clone());
|
||||
page.remove_vma(self);
|
||||
after.lock().mapped = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1490,12 +1494,6 @@ impl VMA {
|
||||
// 将VMA加入到anon_vma
|
||||
let page = page_manager_guard.get_mut(&paddr);
|
||||
page.insert_vma(r.clone());
|
||||
|
||||
// 清空内存
|
||||
unsafe {
|
||||
let vaddr = MMArch::phys_2_virt(paddr).unwrap();
|
||||
MMArch::write_bytes(vaddr, 0, MMArch::PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
// debug!("VMA::zeroed: done");
|
||||
return Ok(r);
|
||||
|
Loading…
x
Reference in New Issue
Block a user