소스 검색

Merge remote-tracking branch 'origin/master' into feat-dynamic-link

longjin 2 일 전
부모
커밋
8dd72e8ccd
4개의 변경된 파일53개의 추가작업 그리고 23개의 파일을 삭제
  1. 1 0
      kernel/src/arch/x86_64/mm/fault.rs
  2. 20 3
      kernel/src/filesystem/page_cache.rs
  3. 6 3
      kernel/src/mm/fault.rs
  4. 26 17
      kernel/src/mm/page.rs

+ 1 - 0
kernel/src/arch/x86_64/mm/fault.rs

@@ -277,6 +277,7 @@ impl X86_64MMArch {
                         flags
                     );
                     log::error!("fault rip: {:#x}", regs.rip);
+
                     let pid = ProcessManager::current_pid();
                     let mut info =
                         SigInfo::new(Signal::SIGSEGV, 0, SigCode::User, SigType::Kill(pid));

+ 20 - 3
kernel/src/filesystem/page_cache.rs

@@ -1,4 +1,7 @@
-use core::cmp::min;
+use core::{
+    cmp::min,
+    sync::atomic::{AtomicUsize, Ordering},
+};
 
 use alloc::{
     sync::{Arc, Weak},
@@ -21,22 +24,27 @@ use crate::{
 };
 use crate::{libs::align::page_align_up, mm::page::PageType};
 
+static PAGE_CACHE_ID: AtomicUsize = AtomicUsize::new(0);
 /// 页面缓存
 #[derive(Debug)]
 pub struct PageCache {
+    id: usize,
     inner: SpinLock<InnerPageCache>,
     inode: Lazy<Weak<dyn IndexNode>>,
 }
 
 #[derive(Debug)]
 pub struct InnerPageCache {
+    #[allow(unused)]
+    id: usize,
     pages: HashMap<usize, Arc<Page>>,
     page_cache_ref: Weak<PageCache>,
 }
 
 impl InnerPageCache {
-    pub fn new(page_cache_ref: Weak<PageCache>) -> InnerPageCache {
+    pub fn new(page_cache_ref: Weak<PageCache>, id: usize) -> InnerPageCache {
         Self {
+            id,
             pages: HashMap::new(),
             page_cache_ref,
         }
@@ -318,8 +326,10 @@ impl Drop for InnerPageCache {
 
 impl PageCache {
     pub fn new(inode: Option<Weak<dyn IndexNode>>) -> Arc<PageCache> {
+        let id = PAGE_CACHE_ID.fetch_add(1, Ordering::SeqCst);
         Arc::new_cyclic(|weak| Self {
-            inner: SpinLock::new(InnerPageCache::new(weak.clone())),
+            id,
+            inner: SpinLock::new(InnerPageCache::new(weak.clone(), id)),
             inode: {
                 let v: Lazy<Weak<dyn IndexNode>> = Lazy::new();
                 if let Some(inode) = inode {
@@ -330,6 +340,13 @@ impl PageCache {
         })
     }
 
+    /// # 获取页缓存的ID
+    #[inline]
+    #[allow(unused)]
+    pub fn id(&self) -> usize {
+        self.id
+    }
+
     pub fn inode(&self) -> Option<Weak<dyn IndexNode>> {
         self.inode.try_get().cloned()
     }

+ 6 - 3
kernel/src/mm/fault.rs

@@ -268,6 +268,7 @@ impl PageFaultHandler {
     ///
     /// ## 返回值
     /// - VmFaultReason: 页面错误处理信息标志
+    #[inline(never)]
     pub unsafe fn do_fault(pfm: &mut PageFaultMessage) -> VmFaultReason {
         if !pfm.flags().contains(FaultFlags::FAULT_FLAG_WRITE) {
             Self::do_read_fault(pfm)
@@ -291,6 +292,7 @@ impl PageFaultHandler {
     ///
     /// ## 返回值
     /// - VmFaultReason: 页面错误处理信息标志
+    #[inline(never)]
     pub unsafe fn do_cow_fault(pfm: &mut PageFaultMessage) -> VmFaultReason {
         let mut ret = Self::filemap_fault(pfm);
 
@@ -350,6 +352,7 @@ impl PageFaultHandler {
     ///
     /// ## 返回值
     /// - VmFaultReason: 页面错误处理信息标志
+    #[inline(never)]
     pub unsafe fn do_shared_fault(pfm: &mut PageFaultMessage) -> VmFaultReason {
         let mut ret = Self::filemap_fault(pfm);
 
@@ -410,6 +413,7 @@ impl PageFaultHandler {
     ///
     /// ## 返回值
     /// - VmFaultReason: 页面错误处理信息标志
+    #[inline(never)]
     pub unsafe fn do_wp_page(pfm: &mut PageFaultMessage) -> VmFaultReason {
         let address = pfm.address_aligned_down();
         let vma = pfm.vma.clone();
@@ -537,7 +541,7 @@ impl PageFaultHandler {
         let to_pte = min(
             from_pte + fault_around_page_number,
             min(
-                1 << MMArch::PAGE_SHIFT,
+                MMArch::PAGE_ENTRY_NUM,
                 pte_pgoff + (vma_pages_count - vm_pgoff),
             ),
         );
@@ -586,7 +590,7 @@ impl PageFaultHandler {
                     .expect("file_page_offset is none"))
                 << MMArch::PAGE_SHIFT);
 
-        for pgoff in start_pgoff..=end_pgoff {
+        for pgoff in start_pgoff..end_pgoff {
             if let Some(page) = page_cache.lock_irqsave().get_page(pgoff) {
                 let page_guard = page.read_irqsave();
                 if page_guard.flags().contains(PageFlags::PG_UPTODATE) {
@@ -642,7 +646,6 @@ impl PageFaultHandler {
             drop(buffer);
 
             let page = page_cache.lock_irqsave().get_page(file_pgoff);
-
             pfm.page = page;
         }
         ret

+ 26 - 17
kernel/src/mm/page.rs

@@ -82,12 +82,16 @@ impl PageManager {
     }
 
     pub fn get(&mut self, paddr: &PhysAddr) -> Option<Arc<Page>> {
-        page_reclaimer_lock_irqsave().get(paddr);
+        if let Some(p) = page_reclaimer_lock_irqsave().get(paddr) {
+            return Some(p);
+        }
         self.phys2page.get(paddr).cloned()
     }
 
     pub fn get_unwrap(&mut self, paddr: &PhysAddr) -> Arc<Page> {
-        page_reclaimer_lock_irqsave().get(paddr);
+        if let Some(p) = page_reclaimer_lock_irqsave().get(paddr) {
+            return p;
+        }
         self.phys2page
             .get(paddr)
             .unwrap_or_else(|| panic!("Phys Page not found, {:?}", paddr))
@@ -348,8 +352,11 @@ impl PageReclaimer {
         let inode = page_cache.inode().clone().unwrap().upgrade().unwrap();
 
         for vma in guard.vma_set() {
-            let address_space = vma.lock_irqsave().address_space().unwrap();
-            let address_space = address_space.upgrade().unwrap();
+            let address_space = vma.lock_irqsave().address_space().and_then(|x| x.upgrade());
+            if address_space.is_none() {
+                continue;
+            }
+            let address_space = address_space.unwrap();
             let mut guard = address_space.write();
             let mapper = &mut guard.user_mapper.utable;
             let virt = vma.lock_irqsave().page_address(page_index).unwrap();
@@ -380,19 +387,21 @@ impl PageReclaimer {
             MMArch::PAGE_SIZE
         };
 
-        inode
-            .write_direct(
-                page_index * MMArch::PAGE_SIZE,
-                len,
-                unsafe {
-                    core::slice::from_raw_parts(
-                        MMArch::phys_2_virt(paddr).unwrap().data() as *mut u8,
-                        len,
-                    )
-                },
-                SpinLock::new(FilePrivateData::Unused).lock(),
-            )
-            .unwrap();
+        if len > 0 {
+            inode
+                .write_direct(
+                    page_index * MMArch::PAGE_SIZE,
+                    len,
+                    unsafe {
+                        core::slice::from_raw_parts(
+                            MMArch::phys_2_virt(paddr).unwrap().data() as *mut u8,
+                            len,
+                        )
+                    },
+                    SpinLock::new(FilePrivateData::Unused).lock(),
+                )
+                .unwrap();
+        }
 
         // 清除标记
         guard.remove_flags(PageFlags::PG_DIRTY);