浏览代码

update 20240607 0200

MemoryShore 10 月之前
父节点
当前提交
d7211d086b

+ 7 - 3
kernel/src/filesystem/fat/fs.rs

@@ -120,7 +120,7 @@ pub struct FATInode {
     dname: DName,
 
     /// 页缓存
-    page_cache: PageCache,
+    page_cache: Arc<PageCache>,
 }
 
 impl FATInode {
@@ -218,7 +218,7 @@ impl LockedFATInode {
             },
             special_node: None,
             dname,
-            page_cache: PageCache::default(),
+            page_cache: Arc::new(PageCache::default()),
         })));
 
         inode.0.lock().self_ref = Arc::downgrade(&inode);
@@ -352,7 +352,7 @@ impl FATFileSystem {
             },
             special_node: None,
             dname: DName::default(),
-            page_cache: PageCache::default(),
+            page_cache: Arc::new(PageCache::default()),
         })));
 
         let result: Arc<FATFileSystem> = Arc::new(FATFileSystem {
@@ -1837,6 +1837,10 @@ impl IndexNode for LockedFATInode {
             .map(|item| item as Arc<dyn IndexNode>)
             .ok_or(SystemError::EINVAL)
     }
+
+    fn page_cache(&self) -> Option<Arc<PageCache>> {
+        Some(self.0.lock().page_cache.clone())
+    }
 }
 
 impl Default for FATFsInfo {

+ 6 - 7
kernel/src/filesystem/vfs/file.rs

@@ -124,22 +124,22 @@ impl FileMode {
 #[allow(dead_code)]
 #[derive(Debug)]
 pub struct PageCache {
-    map: HashMap<usize, Arc<Page>>,
+    map: RwLock<HashMap<usize, Arc<Page>>>,
 }
 
 impl PageCache {
     pub fn new() -> PageCache {
         Self {
-            map: HashMap::new(),
+            map: RwLock::new(HashMap::new()),
         }
     }
 
-    pub fn add_page(&mut self, offset: usize, page: Arc<Page>) {
-        self.map.insert(offset, page);
+    pub fn add_page(&self, offset: usize, page: Arc<Page>) {
+        self.map.write().insert(offset, page);
     }
 
     pub fn get_page(&self, offset: usize) -> Option<Arc<Page>> {
-        self.map.get(&offset).cloned()
+        self.map.read().get(&offset).cloned()
     }
 
     // pub fn get_pages(&self, start_pgoff: usize, end_pgoff: usize) -> Vec<Arc<Page>> {
@@ -693,9 +693,8 @@ impl FileDescriptorVec {
         self.get_file_by_fd(fd).ok_or(SystemError::EBADF)?;
 
         // 把文件描述符数组对应位置设置为空
-        let file = self.fds[fd as usize].take().unwrap();
+        self.fds[fd as usize].take().unwrap();
 
-        assert!(Arc::strong_count(&file) == 1);
         return Ok(());
     }
 

+ 2 - 2
kernel/src/filesystem/vfs/mod.rs

@@ -554,8 +554,8 @@ pub trait IndexNode: Any + Sync + Send + Debug + CastFromSync {
         return self.find("..");
     }
 
-    fn page_cache(&self) -> Option<PageCache> {
-        None
+    fn page_cache(&self) -> Option<Arc<PageCache>> {
+        panic!("function page_cache() has not yet been implemented");
     }
 }
 

+ 5 - 3
kernel/src/filesystem/vfs/mount.rs

@@ -22,8 +22,10 @@ use crate::{
 };
 
 use super::{
-    file::FileMode, syscall::ModeType, utils::DName, FilePrivateData, FileSystem, FileType,
-    IndexNode, InodeId, Magic, SuperBlock,
+    file::{FileMode, PageCache},
+    syscall::ModeType,
+    utils::DName,
+    FilePrivateData, FileSystem, FileType, IndexNode, InodeId, Magic, SuperBlock,
 };
 
 const MOUNTFS_BLOCK_SIZE: u64 = 512;
@@ -521,7 +523,7 @@ impl IndexNode for MountFSInode {
         return self.do_parent().map(|inode| inode as Arc<dyn IndexNode>);
     }
 
-    fn page_cache(&self) -> Option<super::file::PageCache> {
+    fn page_cache(&self) -> Option<Arc<PageCache>> {
         self.inner_inode.page_cache()
     }
 }

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

@@ -518,11 +518,7 @@ impl PageFaultHandler {
     ) -> VmFaultReason {
         let vma = pfm.vma();
         let vma_guard = vma.lock();
-        let file = vma_guard
-            .vm_file()
-            .expect("no vm_file in vma")
-            .upgrade()
-            .expect("struct file not exist");
+        let file = vma_guard.vm_file().expect("no vm_file in vma");
         let page_cache = file.inode().page_cache().unwrap();
 
         // 起始页地址
@@ -559,12 +555,8 @@ impl PageFaultHandler {
         log::info!("filemap_fault");
         let vma = pfm.vma();
         let vma_guard = vma.lock();
-        let file = vma_guard
-            .vm_file()
-            .expect("no vm_file in vma")
-            .upgrade()
-            .expect("struct file not exist");
-        let mut page_cache = file.inode().page_cache().unwrap();
+        let file = vma_guard.vm_file().expect("no vm_file in vma");
+        let page_cache = file.inode().page_cache().unwrap();
         let file_pgoff = pfm.file_pgoff.expect("no file_pgoff");
 
         if let Some(page) = page_cache.get_page(file_pgoff) {

+ 6 - 8
kernel/src/mm/ucontext.rs

@@ -383,8 +383,6 @@ impl InnerAddressSpace {
         // drop guard 以避免无法调度的问题
         drop(fd_table_guard);
 
-        let file = Arc::downgrade(&file.unwrap());
-
         // offset需要4K对齐
         if !offset & (MMArch::PAGE_SIZE - 1) == 0 {
             return Err(SystemError::EINVAL);
@@ -405,7 +403,7 @@ impl InnerAddressSpace {
                         flags,
                         mapper,
                         flusher,
-                        Some(file),
+                        file,
                         Some(pgoff),
                     )
                 },
@@ -421,7 +419,7 @@ impl InnerAddressSpace {
                         VirtRegion::new(page.virt_address(), count.data() * MMArch::PAGE_SIZE),
                         vm_flags,
                         flags,
-                        Some(file),
+                        file,
                         Some(pgoff),
                         false,
                     )))
@@ -1359,7 +1357,7 @@ pub struct VMA {
     user_address_space: Option<Weak<AddressSpace>>,
     self_ref: Weak<LockedVMA>,
 
-    vm_file: Option<Weak<File>>,
+    vm_file: Option<Arc<File>>,
     /// VMA映射的文件部分相对于整个文件的偏移页数
     file_pgoff: Option<usize>,
 
@@ -1386,7 +1384,7 @@ impl VMA {
         region: VirtRegion,
         vm_flags: VmFlags,
         flags: EntryFlags<MMArch>,
-        file: Option<Weak<File>>,
+        file: Option<Arc<File>>,
         pgoff: Option<usize>,
         mapped: bool,
     ) -> Self {
@@ -1411,7 +1409,7 @@ impl VMA {
         return &self.vm_flags;
     }
 
-    pub fn vm_file(&self) -> Option<Weak<File>> {
+    pub fn vm_file(&self) -> Option<Arc<File>> {
         return self.vm_file.clone();
     }
 
@@ -1592,7 +1590,7 @@ impl VMA {
         flags: EntryFlags<MMArch>,
         mapper: &mut PageMapper,
         mut flusher: impl Flusher<MMArch>,
-        file: Option<Weak<File>>,
+        file: Option<Arc<File>>,
         pgoff: Option<usize>,
     ) -> Result<Arc<LockedVMA>, SystemError> {
         let mut cur_dest: VirtPageFrame = destination;