ipc/ 进程间通信机制与原理详解
源码路径:
rk3588/kernel-6.1/ipc/
内核版本:Linux 6.1(RK3588 / ARM64)
文档目录:linuxDoc/ipc/
内核 IPC 子系统实现两类机制:System V IPC(信号量、消息队列、共享内存)与 POSIX 消息队列(mqueue 文件系统)。现代应用更多使用 管道、Unix socket、memfd、io_uring,但 SysV/POSIX mq 仍广泛用于遗留服务、数据库与 容器命名空间隔离。
目录
一、子系统职责
| 机制 | 用户 API | 内核实现 |
|---|---|---|
| 信号量 | semget semop semctl |
sem.c |
| 消息队列 | msgget msgsnd msgrcv msgctl |
msg.c + msgutil.c |
| 共享内存 | shmget shmat shmdt shmctl |
shm.c |
| 旧接口 | ipc(call, …) |
syscall.c(部分 arch 仍保留) |
| POSIX mq | mq_open mq_timedsend … |
mqueue.c(mqueue fs) |
| 隔离 | unshare -i / Docker |
namespace.c + IPC_NS |
二、架构关系
三、统一 ID 与权限模型
3.1 IPC ID 编码(util.h)
- index(低 15 位,或扩展模式 24 位)+ sequence(防 id 重用 UAF)
ipc_addid/ipc_rmid管理idr;ipc_findkey走rhashtable
3.2 创建路径 ipcget
- IPC_PRIVATE:直接
getnew - IPC_CREAT | key:
ipcget_public查表或创建 - 权限:
ipcperms+ LSMsecurity_*_associate
3.3 锁(util.c 头注释)
- RCU 查找
kern_ipc_perm - 每对象
kern_ipc_perm.lock做修改类操作 ids->rwsem:创建/删除/遍历 id 集、/proc/sysvipc
四、与 RK3588 关系
- 无平台补丁;ARM64 使用独立 syscall(
semop等),一般不依赖旧ipc() - 嵌入式若裁掉
SYSVIPC可缩小内核,但 glibc/部分中间件 可能仍需要 - 容器/Android 命名空间 依赖
IPC_NS时本目录为必需
详见 07。
功能组专题
| 编号 | 文档 |
|---|---|
| 01 | SysV-IPC公共框架与ID管理机制与实现详解.md |
| 02 | 信号量机制与实现详解.md |
| 03 | SysV消息队列机制与实现详解.md |
| 04 | 共享内存机制与实现详解.md |
| 05 | POSIX消息队列机制与实现详解.md |
| 06 | 命名空间sysctl与兼容层机制与实现详解.md |
| 07 | RK3588平台关联与使用场景详解.md |
正在加载留言…