mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-09 11: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");
|
// panic!("Page Fault");
|
||||||
CurrentIrqArch::interrupt_disable();
|
CurrentIrqArch::interrupt_disable();
|
||||||
let address = x86::controlregs::cr2();
|
let address = x86::controlregs::cr2();
|
||||||
// crate::info!(
|
// log::info!(
|
||||||
// "fault address: {:#x}, error_code: {:#b}, pid: {}\n",
|
// "fault address: {:#x}, error_code: {:#b}, pid: {}\n",
|
||||||
// address,
|
// address,
|
||||||
// error_code,
|
// error_code,
|
||||||
|
@ -861,6 +861,11 @@ impl<Arch: MemoryManagementArch, F: FrameAllocator> PageMapper<Arch, F> {
|
|||||||
let phys: PhysAddr = self.frame_allocator.allocate_one()?;
|
let phys: PhysAddr = self.frame_allocator.allocate_one()?;
|
||||||
compiler_fence(Ordering::SeqCst);
|
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> =
|
let mut page_manager_guard: SpinLockGuard<'static, PageManager> =
|
||||||
page_manager_lock_irqsave();
|
page_manager_lock_irqsave();
|
||||||
if !page_manager_guard.contains(&phys) {
|
if !page_manager_guard.contains(&phys) {
|
||||||
|
@ -329,7 +329,7 @@ impl Syscall {
|
|||||||
prot_flags,
|
prot_flags,
|
||||||
map_flags,
|
map_flags,
|
||||||
true,
|
true,
|
||||||
true,
|
false,
|
||||||
)?;
|
)?;
|
||||||
return Ok(start_page.virt_address().data());
|
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 before: Option<Arc<LockedVMA>> = guard.region.before(®ion).map(|virt_region| {
|
||||||
let mut vma: VMA = unsafe { guard.clone() };
|
let mut vma: VMA = unsafe { guard.clone() };
|
||||||
vma.region = virt_region;
|
vma.region = virt_region;
|
||||||
|
vma.mapped = false;
|
||||||
let vma: Arc<LockedVMA> = LockedVMA::new(vma);
|
let vma: Arc<LockedVMA> = LockedVMA::new(vma);
|
||||||
vma
|
vma
|
||||||
});
|
});
|
||||||
@ -1124,7 +1124,7 @@ impl LockedVMA {
|
|||||||
let after: Option<Arc<LockedVMA>> = guard.region.after(®ion).map(|virt_region| {
|
let after: Option<Arc<LockedVMA>> = guard.region.after(®ion).map(|virt_region| {
|
||||||
let mut vma: VMA = unsafe { guard.clone() };
|
let mut vma: VMA = unsafe { guard.clone() };
|
||||||
vma.region = virt_region;
|
vma.region = virt_region;
|
||||||
|
vma.mapped = false;
|
||||||
let vma: Arc<LockedVMA> = LockedVMA::new(vma);
|
let vma: Arc<LockedVMA> = LockedVMA::new(vma);
|
||||||
vma
|
vma
|
||||||
});
|
});
|
||||||
@ -1134,20 +1134,24 @@ impl LockedVMA {
|
|||||||
if let Some(before) = before.clone() {
|
if let Some(before) = before.clone() {
|
||||||
let virt_iter = before.lock().region.iter_pages();
|
let virt_iter = before.lock().region.iter_pages();
|
||||||
for frame in virt_iter {
|
for frame in virt_iter {
|
||||||
let paddr = utable.translate(frame.virt_address()).unwrap().0;
|
if let Some((paddr, _)) = utable.translate(frame.virt_address()) {
|
||||||
let page = page_manager_guard.get_mut(&paddr);
|
let page = page_manager_guard.get_mut(&paddr);
|
||||||
page.insert_vma(before.clone());
|
page.insert_vma(before.clone());
|
||||||
page.remove_vma(self);
|
page.remove_vma(self);
|
||||||
|
before.lock().mapped = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(after) = after.clone() {
|
if let Some(after) = after.clone() {
|
||||||
let virt_iter = after.lock().region.iter_pages();
|
let virt_iter = after.lock().region.iter_pages();
|
||||||
for frame in virt_iter {
|
for frame in virt_iter {
|
||||||
let paddr = utable.translate(frame.virt_address()).unwrap().0;
|
if let Some((paddr, _)) = utable.translate(frame.virt_address()) {
|
||||||
let page = page_manager_guard.get_mut(&paddr);
|
let page = page_manager_guard.get_mut(&paddr);
|
||||||
page.insert_vma(after.clone());
|
page.insert_vma(after.clone());
|
||||||
page.remove_vma(self);
|
page.remove_vma(self);
|
||||||
|
after.lock().mapped = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1490,12 +1494,6 @@ impl VMA {
|
|||||||
// 将VMA加入到anon_vma
|
// 将VMA加入到anon_vma
|
||||||
let page = page_manager_guard.get_mut(&paddr);
|
let page = page_manager_guard.get_mut(&paddr);
|
||||||
page.insert_vma(r.clone());
|
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");
|
// debug!("VMA::zeroed: done");
|
||||||
return Ok(r);
|
return Ok(r);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user