Browse Source

update 20240606 1800

MemoryShore 10 months ago
parent
commit
f1ad5b35ea

+ 6 - 0
kernel/src/filesystem/fat/fs.rs

@@ -13,6 +13,7 @@ use alloc::{
 };
 
 use crate::driver::base::device::device_number::DeviceNumber;
+use crate::filesystem::vfs::file::PageCache;
 use crate::filesystem::vfs::utils::DName;
 use crate::filesystem::vfs::{Magic, SpecialNodeData, SuperBlock};
 use crate::ipc::pipe::LockedPipeInode;
@@ -117,6 +118,9 @@ pub struct FATInode {
 
     /// 目录名
     dname: DName,
+
+    /// 页缓存
+    page_cache: PageCache,
 }
 
 impl FATInode {
@@ -214,6 +218,7 @@ impl LockedFATInode {
             },
             special_node: None,
             dname,
+            page_cache: PageCache::default(),
         })));
 
         inode.0.lock().self_ref = Arc::downgrade(&inode);
@@ -347,6 +352,7 @@ impl FATFileSystem {
             },
             special_node: None,
             dname: DName::default(),
+            page_cache: PageCache::default(),
         })));
 
         let result: Arc<FATFileSystem> = Arc::new(FATFileSystem {

+ 8 - 3
kernel/src/filesystem/vfs/file.rs

@@ -122,15 +122,14 @@ impl FileMode {
 }
 
 #[allow(dead_code)]
+#[derive(Debug)]
 pub struct PageCache {
-    inode_ref: Weak<dyn IndexNode>,
     map: HashMap<usize, Arc<Page>>,
 }
 
 impl PageCache {
-    pub fn new(inode_ref: Weak<dyn IndexNode>) -> PageCache {
+    pub fn new() -> PageCache {
         Self {
-            inode_ref,
             map: HashMap::new(),
         }
     }
@@ -154,6 +153,12 @@ impl PageCache {
     // }
 }
 
+impl Default for PageCache {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
 pub trait PageCacheOperations: IndexNode {
     fn write_page(&self, page: Page);
     fn read_ahead(&self);

+ 4 - 0
kernel/src/filesystem/vfs/mount.rs

@@ -520,6 +520,10 @@ impl IndexNode for MountFSInode {
     fn parent(&self) -> Result<Arc<dyn IndexNode>, SystemError> {
         return self.do_parent().map(|inode| inode as Arc<dyn IndexNode>);
     }
+
+    fn page_cache(&self) -> Option<super::file::PageCache> {
+        self.inner_inode.page_cache()
+    }
 }
 
 impl FileSystem for MountFS {

+ 4 - 1
kernel/src/mm/fault.rs

@@ -449,6 +449,7 @@ impl PageFaultHandler {
     }
 
     pub unsafe fn do_fault_around(pfm: PageFaultMessage, mapper: &mut PageMapper) -> VmFaultReason {
+        log::info!("do_fault_around");
         if mapper.get_table(*pfm.address(), 0).is_none() {
             mapper
                 .allocate_table(*pfm.address(), 0)
@@ -456,7 +457,9 @@ impl PageFaultHandler {
         }
         let vma = pfm.vma();
         let vma_guard = vma.lock();
-        let vma_region = vma_guard.region();
+        let vma_region = *vma_guard.region();
+        drop(vma_guard);
+
         // 缺页在VMA中的偏移量
         let vm_pgoff = (*pfm.address() - vma_region.start()) >> MMArch::PAGE_SHIFT;
 

+ 1 - 1
kernel/src/mm/page.rs

@@ -106,7 +106,7 @@ bitflags! {
         const PG_SWAPBACKED = 1 << 19;
     }
 }
-
+#[derive(Debug)]
 /// 物理页面信息
 pub struct Page {
     /// 映射计数