diff --git a/kernel/src/driver/tty/tty_device.rs b/kernel/src/driver/tty/tty_device.rs index 4d83a4281..3a086ace0 100644 --- a/kernel/src/driver/tty/tty_device.rs +++ b/kernel/src/driver/tty/tty_device.rs @@ -408,6 +408,11 @@ impl IndexNode for TtyDevice { Ok(()) } + fn page_cache(&self) -> Option> { + // TTY设备是字符设备,不需要页面缓存 + None + } + fn close(&self, data: SpinLockGuard) -> Result<(), SystemError> { let (tty, _flags) = if let FilePrivateData::Tty(tty_priv) = &*data { (tty_priv.tty(), tty_priv.flags) diff --git a/kernel/src/mm/fault.rs b/kernel/src/mm/fault.rs index c11216487..5b7d6f708 100644 --- a/kernel/src/mm/fault.rs +++ b/kernel/src/mm/fault.rs @@ -609,7 +609,17 @@ impl PageFaultHandler { let vma = pfm.vma(); let vma_guard = vma.lock_irqsave(); let file = vma_guard.vm_file().expect("no vm_file in vma"); - let page_cache = file.inode().page_cache().unwrap(); + let page_cache = match file.inode().page_cache() { + Some(cache) => cache, + None => { + // 文件没有页面缓存,可能是不支持内存映射的设备文件 + log::warn!( + "filemap_map_pages: file has no page cache, inode type: {}", + crate::libs::name::get_type_name(&file.inode()) + ); + return VmFaultReason::VM_FAULT_SIGBUS; + } + }; let mapper = &mut pfm.mapper; // 起始页地址 @@ -650,7 +660,17 @@ impl PageFaultHandler { let vma = pfm.vma(); let vma_guard = vma.lock_irqsave(); let file = vma_guard.vm_file().expect("no vm_file in vma"); - let page_cache = file.inode().page_cache().unwrap(); + let page_cache = match file.inode().page_cache() { + Some(cache) => cache, + None => { + // 文件没有页面缓存,可能是不支持内存映射的设备文件 + log::warn!( + "filemap_fault: file has no page cache, inode type: {}", + crate::libs::name::get_type_name(&file.inode()) + ); + return VmFaultReason::VM_FAULT_SIGBUS; + } + }; let file_pgoff = pfm.file_pgoff.expect("no file_pgoff"); let mut ret = VmFaultReason::empty();