SysV IPC 公共框架与 ID 管理机制与实现详解
源码路径:rk3588/kernel-6.1/ipc/util.c、util.h
文档目录:linuxDoc/ipc/
目录
一、原理
三类 SysV IPC 共享 同一套标识与权限框架,避免三套重复逻辑:
- 用户通过 key(
ftok 生成)或 IPC_PRIVATE 创建对象
- 内核返回 int id(含 sequence)
- 对象共性字段在
struct kern_ipc_perm(uid/gid/cuid/cgid、mode、key、seq)
二、实现方式
2.1 struct ipc_ids
| 成员 |
作用 |
ipcs_idr |
按 id 索引对象 |
key_ht |
rhashtable 按 key 快速查找 |
rwsem |
保护 idr 增删与 proc 遍历 |
seq |
分配下一 sequence |
2.2 创建合并逻辑 ipcget
1 2
| int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids, struct ipc_ops *ops, struct ipc_params *params)
|
ipcget_new:无匹配 key 时 ops->getnew(newary / newque / newseg)
ipcget_public:存在 key 时权限检查 + more_checks
2.3 ipc_addid / ipc_rmid
- 分配 idr 槽位,写入 sequence,插入 key 哈希
- 删除时
ipc_rmid + ipc_rcu_putref 延迟释放(RCU)
2.4 struct ipc_ops
各子系统实现:
| 回调 |
信号量 |
消息 |
共享内存 |
getnew |
newary |
newque |
newseg |
associate |
security_sem_associate |
… |
… |
more_checks |
— |
— |
shm_more_checks(size) |
三、关键接口
| 函数 |
作用 |
ipc_init_ids |
初始化某类 ids |
ipc_lock / ipc_unlock |
单对象自旋锁 |
ipcperms |
对照 current 与 ipcp->mode |
ipc_parse_version |
IPC_64 / IPC_OLD cmd 解析 |
kernel_to_ipc64_perm |
导出到用户 msqid_ds 等 |
ID 上限:IPCMNI 32768;CONFIG_SYSVIPC_SYSCTL 可扩展 index 位(ipc_mni_shift)。
四、proc 与热插拔
ipc_init:proc_mkdir("sysvipc"),各子系统注册 sem、msg、shm seq_file
- 内存热插拔 notifier:调整
msgmni 等(低内存缩放)
五、调试
1 2 3 4
| ls /proc/sysvipc/ ipcs -a cat /proc/sys/kernel/sem cat /proc/sys/kernel/msgmax
|
附录
| 符号 |
文件 |
ipc_init |
util.c ~90 |
ipc_findkey |
~172 |
下一篇:02 信号量
正在加载留言…