Ver código fonte

update20240620 1726

MemoryShore 10 meses atrás
pai
commit
7fd7c6e63c

+ 26 - 1
kernel/src/arch/x86_64/mm/mod.rs

@@ -29,7 +29,7 @@ use crate::{
 
 use crate::mm::kernel_mapper::KernelMapper;
 use crate::mm::page::{EntryFlags, PageEntry, PAGE_1G_SHIFT};
-use crate::mm::{MemoryManagementArch, PageTableKind, PhysAddr, VirtAddr};
+use crate::mm::{MemoryManagementArch, PageTableKind, PhysAddr, VirtAddr, VmFlags};
 
 use system_error::SystemError;
 
@@ -327,6 +327,28 @@ impl MemoryManagementArch for X86_64MMArch {
         pkru::pkru_allows_pkey(pkru::vma_pkey(vma), write)
     }
 
+    fn protection_map() -> [usize; 16] {
+        let mut map = [0; 16];
+        map[VmFlags::VM_NONE] = Self::PAGE_NONE;
+        map[VmFlags::VM_READ] = Self::PAGE_READONLY;
+        map[VmFlags::VM_WRITE] = Self::PAGE_COPY;
+        map[VmFlags::VM_WRITE | VmFlags::VM_READ] = Self::PAGE_COPY;
+        map[VmFlags::VM_EXEC] = Self::PAGE_READONLY_EXEC;
+        map[VmFlags::VM_EXEC | VmFlags::VM_READ] = Self::PAGE_READONLY_EXEC;
+        map[VmFlags::VM_EXEC | VmFlags::VM_WRITE] = Self::PAGE_COPY_EXEC;
+        map[VmFlags::VM_EXEC | VmFlags::VM_WRITE | VmFlags::VM_READ] = Self::PAGE_COPY_EXEC;
+        map[VmFlags::VM_SHARED] = Self::PAGE_NONE;
+        map[VmFlags::VM_SHARED | VmFlags::VM_READ] = Self::PAGE_READONLY;
+        map[VmFlags::VM_SHARED | VmFlags::VM_WRITE] = Self::PAGE_SHARED;
+        map[VmFlags::VM_SHARED | VmFlags::VM_WRITE | VmFlags::VM_READ] = Self::PAGE_SHARED;
+        map[VmFlags::VM_SHARED | VmFlags::VM_EXEC] = Self::PAGE_READONLY_EXEC;
+        map[VmFlags::VM_SHARED | VmFlags::VM_EXEC | VmFlags::VM_READ] = Self::PAGE_READONLY_EXEC;
+        map[VmFlags::VM_SHARED | VmFlags::VM_EXEC | VmFlags::VM_WRITE] = Self::PAGE_SHARED_EXEC;
+        map[VmFlags::VM_SHARED | VmFlags::VM_EXEC | VmFlags::VM_WRITE | VmFlags::VM_READ] =
+            Self::PAGE_SHARED_EXEC;
+        map
+    }
+
     const PAGE_NONE: usize =
         Self::ENTRY_FLAG_PRESENT | Self::ENTRY_FLAG_ACCESSED | Self::ENTRY_FLAG_GLOBAL;
 
@@ -361,6 +383,9 @@ impl MemoryManagementArch for X86_64MMArch {
 
     const PAGE_READONLY_EXEC: usize =
         Self::ENTRY_FLAG_PRESENT | Self::ENTRY_FLAG_USER | Self::ENTRY_FLAG_ACCESSED;
+
+    const PAGE_READ: usize = 0;
+    const PAGE_READ_EXEC: usize = 0;
 }
 
 impl X86_64MMArch {

+ 13 - 7
kernel/src/mm/fault.rs

@@ -364,14 +364,20 @@ impl PageFaultHandler {
     /// - VmFaultReason: 页面错误处理信息标志
     #[allow(dead_code, unused_variables)]
     pub unsafe fn do_shared_fault(pfm: PageFaultMessage, mapper: &mut PageMapper) -> VmFaultReason {
-        panic!(
-            "do_shared_fault has not yet been implemented, 
-        fault message: {:?}, 
-        pid: {}\n",
-            pfm,
-            crate::process::ProcessManager::current_pid().data()
-        );
+        // panic!(
+        //     "do_shared_fault has not yet been implemented,
+        // fault message: {:?},
+        // pid: {}\n",
+        //     pfm,
+        //     crate::process::ProcessManager::current_pid().data()
+        // );
         // TODO https://code.dragonos.org.cn/xref/linux-6.6.21/mm/memory.c#do_shared_fault
+
+        let mut ret = Self::filemap_fault(pfm.clone(), mapper);
+
+        ret = ret.union(Self::finish_fault(pfm, mapper));
+
+        ret
     }
 
     /// 处理被置换页面的缺页异常

+ 9 - 18
kernel/src/mm/mod.rs

@@ -667,25 +667,16 @@ pub trait MemoryManagementArch: Clone + Copy + Debug {
     const PAGE_READONLY: usize;
     const PAGE_READONLY_EXEC: usize;
 
+    const PAGE_READ: usize;
+    const PAGE_READ_EXEC: usize;
+
+    /// 获取保护标志的映射表
+    ///
+    ///
+    /// ## 返回值
+    /// - `[usize; 16]`: 长度为16的映射表
     fn protection_map() -> [usize; 16] {
-        let mut map = [0; 16];
-        map[VmFlags::VM_NONE] = Self::PAGE_NONE;
-        map[VmFlags::VM_READ] = Self::PAGE_READONLY;
-        map[VmFlags::VM_WRITE] = Self::PAGE_COPY;
-        map[VmFlags::VM_WRITE | VmFlags::VM_READ] = Self::PAGE_COPY;
-        map[VmFlags::VM_EXEC] = Self::PAGE_READONLY_EXEC;
-        map[VmFlags::VM_EXEC | VmFlags::VM_READ] = Self::PAGE_READONLY_EXEC;
-        map[VmFlags::VM_EXEC | VmFlags::VM_WRITE] = Self::PAGE_COPY_EXEC;
-        map[VmFlags::VM_EXEC | VmFlags::VM_WRITE | VmFlags::VM_READ] = Self::PAGE_COPY_EXEC;
-        map[VmFlags::VM_SHARED] = Self::PAGE_NONE;
-        map[VmFlags::VM_SHARED | VmFlags::VM_READ] = Self::PAGE_READONLY;
-        map[VmFlags::VM_SHARED | VmFlags::VM_WRITE] = Self::PAGE_SHARED;
-        map[VmFlags::VM_SHARED | VmFlags::VM_WRITE | VmFlags::VM_READ] = Self::PAGE_SHARED;
-        map[VmFlags::VM_SHARED | VmFlags::VM_EXEC] = Self::PAGE_READONLY_EXEC;
-        map[VmFlags::VM_SHARED | VmFlags::VM_EXEC | VmFlags::VM_READ] = Self::PAGE_READONLY_EXEC;
-        map[VmFlags::VM_SHARED | VmFlags::VM_EXEC | VmFlags::VM_WRITE] = Self::PAGE_SHARED_EXEC;
-        map[VmFlags::VM_SHARED | VmFlags::VM_EXEC | VmFlags::VM_WRITE | VmFlags::VM_READ] =
-            Self::PAGE_SHARED_EXEC;
+        let map = [0; 16];
         map
     }
 

+ 4 - 0
kernel/src/mm/page.rs

@@ -191,6 +191,10 @@ impl Page {
     pub fn phys_frame(&self) -> &PhysPageFrame {
         &self.phys_frame
     }
+
+    pub fn lock(&self) {
+        //TODO 使用读写锁包装Page结构体保证多进程的修改互斥操作
+    }
 }
 
 #[derive(Debug)]