mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-08 22:36:48 +00:00
fix(mm): 修复riscv64启动时的PageFault (#915)
* 修复riscv64启动时的PageFault * 优化代码结构
This commit is contained in:
parent
db7c782a9a
commit
a3571c8b79
@ -807,13 +807,15 @@ impl<Arch: MemoryManagementArch> EntryFlags<Arch> {
|
|||||||
/// - prot_flags: 页的保护标志
|
/// - prot_flags: 页的保护标志
|
||||||
/// - user: 用户空间是否可访问
|
/// - user: 用户空间是否可访问
|
||||||
pub fn from_prot_flags(prot_flags: ProtFlags, user: bool) -> Self {
|
pub fn from_prot_flags(prot_flags: ProtFlags, user: bool) -> Self {
|
||||||
let vm_flags = super::VmFlags::from(prot_flags);
|
if Arch::PAGE_FAULT_ENABLED {
|
||||||
// let flags: EntryFlags<Arch> = EntryFlags::new()
|
let vm_flags = super::VmFlags::from(prot_flags);
|
||||||
// .set_user(user)
|
Arch::vm_get_page_prot(vm_flags).set_user(user)
|
||||||
// .set_execute(prot_flags.contains(ProtFlags::PROT_EXEC))
|
} else {
|
||||||
// .set_write(prot_flags.contains(ProtFlags::PROT_WRITE));
|
EntryFlags::new()
|
||||||
let flags = Arch::vm_get_page_prot(vm_flags).set_user(user);
|
.set_user(user)
|
||||||
return flags;
|
.set_execute(prot_flags.contains(ProtFlags::PROT_EXEC))
|
||||||
|
.set_write(prot_flags.contains(ProtFlags::PROT_WRITE))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
|
@ -275,12 +275,6 @@ impl InnerAddressSpace {
|
|||||||
|
|
||||||
let len = page_align_up(len);
|
let len = page_align_up(len);
|
||||||
|
|
||||||
let vm_flags = VmFlags::from(prot_flags)
|
|
||||||
| VmFlags::from(map_flags)
|
|
||||||
| VmFlags::VM_MAYREAD
|
|
||||||
| VmFlags::VM_MAYWRITE
|
|
||||||
| VmFlags::VM_MAYEXEC;
|
|
||||||
|
|
||||||
// debug!("map_anonymous: len = {}", len);
|
// debug!("map_anonymous: len = {}", len);
|
||||||
|
|
||||||
let start_page: VirtPageFrame = self.mmap(
|
let start_page: VirtPageFrame = self.mmap(
|
||||||
@ -288,7 +282,7 @@ impl InnerAddressSpace {
|
|||||||
PageFrameCount::from_bytes(len).unwrap(),
|
PageFrameCount::from_bytes(len).unwrap(),
|
||||||
prot_flags,
|
prot_flags,
|
||||||
map_flags,
|
map_flags,
|
||||||
move |page, count, flags, mapper, flusher| {
|
move |page, count, vm_flags, flags, mapper, flusher| {
|
||||||
if allocate_at_once {
|
if allocate_at_once {
|
||||||
VMA::zeroed(page, count, vm_flags, flags, mapper, flusher, None, None)
|
VMA::zeroed(page, count, vm_flags, flags, mapper, flusher, None, None)
|
||||||
} else {
|
} else {
|
||||||
@ -359,12 +353,6 @@ impl InnerAddressSpace {
|
|||||||
|
|
||||||
let len = page_align_up(len);
|
let len = page_align_up(len);
|
||||||
|
|
||||||
let vm_flags = VmFlags::from(prot_flags)
|
|
||||||
| VmFlags::from(map_flags)
|
|
||||||
| VmFlags::VM_MAYREAD
|
|
||||||
| VmFlags::VM_MAYWRITE
|
|
||||||
| VmFlags::VM_MAYEXEC;
|
|
||||||
|
|
||||||
// debug!("map_anonymous: len = {}", len);
|
// debug!("map_anonymous: len = {}", len);
|
||||||
|
|
||||||
let binding = ProcessManager::current_pcb().fd_table();
|
let binding = ProcessManager::current_pcb().fd_table();
|
||||||
@ -388,7 +376,7 @@ impl InnerAddressSpace {
|
|||||||
PageFrameCount::from_bytes(len).unwrap(),
|
PageFrameCount::from_bytes(len).unwrap(),
|
||||||
prot_flags,
|
prot_flags,
|
||||||
map_flags,
|
map_flags,
|
||||||
move |page, count, flags, mapper, flusher| {
|
move |page, count, vm_flags, flags, mapper, flusher| {
|
||||||
if allocate_at_once {
|
if allocate_at_once {
|
||||||
VMA::zeroed(
|
VMA::zeroed(
|
||||||
page,
|
page,
|
||||||
@ -436,6 +424,7 @@ impl InnerAddressSpace {
|
|||||||
F: FnOnce(
|
F: FnOnce(
|
||||||
VirtPageFrame,
|
VirtPageFrame,
|
||||||
PageFrameCount,
|
PageFrameCount,
|
||||||
|
VmFlags,
|
||||||
EntryFlags<MMArch>,
|
EntryFlags<MMArch>,
|
||||||
&mut PageMapper,
|
&mut PageMapper,
|
||||||
&mut dyn Flusher<MMArch>,
|
&mut dyn Flusher<MMArch>,
|
||||||
@ -467,6 +456,12 @@ impl InnerAddressSpace {
|
|||||||
|
|
||||||
let page = VirtPageFrame::new(region.start());
|
let page = VirtPageFrame::new(region.start());
|
||||||
|
|
||||||
|
let vm_flags = VmFlags::from(prot_flags)
|
||||||
|
| VmFlags::from(map_flags)
|
||||||
|
| VmFlags::VM_MAYREAD
|
||||||
|
| VmFlags::VM_MAYWRITE
|
||||||
|
| VmFlags::VM_MAYEXEC;
|
||||||
|
|
||||||
// debug!("mmap: page: {:?}, region={region:?}", page.virt_address());
|
// debug!("mmap: page: {:?}, region={region:?}", page.virt_address());
|
||||||
|
|
||||||
compiler_fence(Ordering::SeqCst);
|
compiler_fence(Ordering::SeqCst);
|
||||||
@ -483,6 +478,7 @@ impl InnerAddressSpace {
|
|||||||
self.mappings.insert_vma(map_func(
|
self.mappings.insert_vma(map_func(
|
||||||
page,
|
page,
|
||||||
page_count,
|
page_count,
|
||||||
|
vm_flags,
|
||||||
EntryFlags::from_prot_flags(prot_flags, true),
|
EntryFlags::from_prot_flags(prot_flags, true),
|
||||||
&mut self.user_mapper.utable,
|
&mut self.user_mapper.utable,
|
||||||
flusher,
|
flusher,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user