diff --git a/core/ksyscall/Cargo.toml b/core/ksyscall/Cargo.toml index abc551edf99834ffb1e572a8ba7e934cf534f6b8..6f3817fbc7f0294a8cc6b787c1d9c29b80a96d51 100644 --- a/core/ksyscall/Cargo.toml +++ b/core/ksyscall/Cargo.toml @@ -20,6 +20,7 @@ tee_ta_sign = ["tee_task_iface?/tee_ta_sign"] ebpf = ["dep:posix-bpf", "posix-bpf/ebpf", "posix-fs/ebpf"] [dependencies] +kalloc.workspace = true kaddr_layout.workspace = true kfd_objects.workspace = true kfutex.workspace = true diff --git a/core/ksyscall/src/sys.rs b/core/ksyscall/src/sys.rs index 8f658a808a11c6f398dc400696e76d65e515cc4e..343f833b1b938ddd4cbaa61b36f161866969149c 100644 --- a/core/ksyscall/src/sys.rs +++ b/core/ksyscall/src/sys.rs @@ -11,6 +11,7 @@ use kbuild_config::ARCH; use kerrno::KResult; +use khal::mem; use kprocess::{current_user_process, current_user_process_fs_context}; use kvfs::{Filename, NodePermission}; use linux_raw_sys::{ @@ -99,6 +100,13 @@ pub fn sys_sysinfo(info: UserPtr) -> KResult { }; kinfo.procs = kprocess::system_view::process_count() as _; kinfo.mem_unit = 1; + + let alloc = kalloc::global_allocator(); + let avail = alloc.available_pages(); + let total_pages = alloc.used_pages() + avail; + kinfo.totalram = total_pages.saturating_mul(mem::PAGE_SIZE_4K) as _; + kinfo.freeram = avail.saturating_mul(mem::PAGE_SIZE_4K) as _; + info.write_vm(kinfo)?; Ok(0) } diff --git a/mm/filemap/src/shared.rs b/mm/filemap/src/shared.rs index ba8bffabd6bdd18e1600dde0ed44e74eaca01b47..6660aa9d44263603bd4eb8ebf6cc11980bf87251 100644 --- a/mm/filemap/src/shared.rs +++ b/mm/filemap/src/shared.rs @@ -339,9 +339,9 @@ impl FileSharedRuntime { range: VirtAddrRange, policy: MsyncPolicy, ) -> KResult { - if policy.has_invalidate() { - return Err(KError::OperationNotSupported); - } + // MS_ASYNC (and MS_INVALIDATE) are no-ops at the VMA level — + // Linux never actually evicts or zaps pages for MS_INVALIDATE + // because the page cache is globally coherent. if !policy.is_sync() { return Ok(MsyncRuntimeResult::Synced); } diff --git a/mm/memspace/src/aspace.rs b/mm/memspace/src/aspace.rs index 5b5bfa60f93a1f1e639d9c0c4b66bf5b0fd9db36..f12d3d52450e4d1845dc4747d6c651504ad19d67 100644 --- a/mm/memspace/src/aspace.rs +++ b/mm/memspace/src/aspace.rs @@ -1208,9 +1208,6 @@ impl MmSpace { if size == 0 { return Ok(()); } - if policy.has_invalidate() { - return Err(KError::OperationNotSupported); - } let range = VirtAddrRange::from_start_size(start, size); let overlapped_vmas = self.vmas.collect_overlapping(range); @@ -1223,6 +1220,8 @@ impl MmSpace { } let overlap = VirtAddrRange::new(cursor.max(vma.start()), range.end.min(vma.end())); if !overlap.is_empty() { + // TODO: when mlock is implemented, check VM_LOCKED and + // return EBUSY for MS_INVALIDATE as Linux does. let runtime = self.runtime_for_vma(&vma).ok_or(KError::BadAddress)?; runtime.msync(&vma, overlap, policy)?; } diff --git a/posix/mm/docs/security.md b/posix/mm/docs/security.md index e2827877d333d7c518322d45ca5142d861248f8f..4d9165141c5ee20e037353f8ce3887295bbc388d 100644 --- a/posix/mm/docs/security.md +++ b/posix/mm/docs/security.md @@ -90,7 +90,7 @@ | `munmap` 范围非法 | 长度为 0 或下游地址空间拒绝 | 返回错误 | 不修改地址空间 | | `mprotect` grow flag 不支持 | `PROT_GROWSDOWN` 或 `PROT_GROWSUP` | 返回错误 | protect 失败,不修改 PTE/VMA | | `MADV_DONTNEED` 范围非法 | 地址未映射、未页对齐、或 `addr + len` 溢出 | 返回错误 | advice 失败,不修改对象 | -| `msync` flag 不支持 | unknown flags、`MS_ASYNC | MS_SYNC`、或 `MS_INVALIDATE` | 返回错误 | sync 失败,不修改对象 | +| `msync` flag 不支持 | unknown flags 或 `MS_ASYNC | MS_SYNC` 组合 | 返回错误 | sync 失败,不修改对象 | | shared file writeback 失败 | VFS `AddressSpaceOperations::writepages()` 失败 | 返回错误,dirty bit 保留 | syscall 失败,调用者可重试 | ## 故障管理