SysV IPC 公共框架与 ID 管理机制与实现详解

SysV IPC 公共框架与 ID 管理机制与实现详解

源码路径rk3588/kernel-6.1/ipc/util.cutil.h
文档目录linuxDoc/ipc/


目录


一、原理

三类 SysV IPC 共享 同一套标识与权限框架,避免三套重复逻辑:

  • 用户通过 keyftok 生成)或 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->getnewnewary / 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 对照 currentipcp->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_initproc_mkdir("sysvipc"),各子系统注册 semmsgshm 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 信号量

文章互动

阅读 --

留言

0 条留言

正在加载留言…