From b466adff52899049a738e7f8a331a43efaf11dff Mon Sep 17 00:00:00 2001 From: LoGin Date: Wed, 3 Dec 2025 01:01:57 +0800 Subject: [PATCH] =?UTF-8?q?feat(tty):=20=E4=B8=BATTY=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0page=5Fcache=E6=96=B9=E6=B3=95=E5=B9=B6?= =?UTF-8?q?=E5=A4=84=E7=90=86=E6=97=A0=E9=A1=B5=E9=9D=A2=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E7=9A=84=E6=83=85=E5=86=B5=20(#1428)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在TTY设备中实现page_cache方法,返回None以表明字符设备不需要页面缓存 - 在页面错误处理中增加对无页面缓存情况的处理,避免panic并返回VM_FAULT_SIGBUS Signed-off-by: longjin --- kernel/src/driver/tty/tty_device.rs | 5 +++++ kernel/src/mm/fault.rs | 24 ++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) 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();