DragonOS/docs/kernel/ipc/ipc_namespace.md

57 lines
2.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# IPC Namespace
:::{note}
Author: longjin <longjin@dragonos.org>
:::
本页描述 DragonOS 对 IPC 命名空间IPC namespace的当前支持状态与后续计划。目标是对用户暴露与 Linux 一致的语义,并在 DragonOS 现有框架上逐步完善。
## 已支持功能
- IpcNamespace 对象与 NsProxy 集成:
- 新增 `IpcNamespace` 并接入 `NsProxy`,每个任务通过 `nsproxy.ipc_ns` 访问所属 IPC 命名空间。
- 命名空间的创建/继承遵循 `clone/unshare` 语义:
- 未包含 `CLONE_NEWIPC` 时继承父命名空间;
- 包含 `CLONE_NEWIPC` 时创建独立 IPC 命名空间;
-`CLONE_SYSVSEM` 互斥,行为与 Linux 一致。
- SysV SHM共享内存按命名空间隔离
- 将原全局 `SHM_MANAGER` 重构为 per-ns `ShmManager`,所有 `shmget/shmat/shmdt/shmctl` 均在 `current.nsproxy.ipc_ns` 下生效。
- `shmat`/`shmdt`VMA 记录 `ShmId`,解除映射时精确维护 `map_count``IPC_RMID` 后当 `SHM_DEST && map_count==0` 即完成物理回收。
- 基本语义与错误码对齐:`IPC_CREAT|IPC_EXCL`、`ENOENT`、拒绝 `SHM_HUGETLB` 等。
- 基础测试用例:(在 `test_ipc_ns_shm.rs` 中)
- `unshare(CLONE_NEWIPC)` 后父/子命名空间的 key 不可见;
- 跨命名空间相同 key 不冲突;
- `IPC_RMID` 后可重新创建同 key
- 输出 PASS/FAIL 与汇总结果。
## 暂未实现/计划中
- `/proc/[pid]/ns/ipc``setns`
- 暂缓,仅规划只读占位与最简 `setns` 路径;后续版本补齐权限校验与切换时序。
- SysV IPC 其它子系统:
- `msg/sem` 框架尚未纳入;`sem` 的 UNDO 列表与 `unshare/setns` 的协同需在引入时同步实现。
- POSIX mqueue
- 尚未提供 per-ns mqueuefs 内核挂载、限额与 sysctl。
- 权限与配额:
- `ipcperms()`、`ns_capable(user_ns, CAP_IPC_OWNER)`
- ucounts/RLIMIT 与 `/proc/sys/kernel/shm*` 等 per-ns sysctl。
## 兼容性与注意事项
- 当前阶段仅对 SysV SHM 提供命名空间隔离;其它 IPC 类型仍按全局语义工作。
- 代码按模块化方式演进:后续加入 `msg/sem/mqueue` 时,保持对用户侧语义的稳定与一致。
## 参考
- 代码位置:
- `kernel/src/process/namespace/ipc_namespace.rs`
- `kernel/src/process/namespace/nsproxy.rs`
- `kernel/src/ipc/syscall/` 内的 `sys_shm*`
- `kernel/src/mm/ucontext.rs`VMA 与 SHM 计数维护)