共享内存机制与实现详解
源码路径:
rk3588/kernel-6.1/ipc/shm.c
文档目录:linuxDoc/ipc/
目录
一、原理
SysV 共享内存将 同一物理页 映射到多个进程地址空间:
shmget:按 key 创建段,指定 size(只增不减)shmat:attach,指定地址/标志(SHM_RDONLY等)shmdt:detachshmctl:IPC_RMID、STAT、锁定/解锁(SHM_LOCK)等
不自动同步读写,需应用自配信号量或其它同步。
二、数据结构
| 结构 | 说明 |
|---|---|
struct shmid_kernel |
kern_ipc_perm + shm_file + shm_nattch + 段大小 |
struct shm_file_data |
关联 shm id、ns、vm 列表 |
shm_ids(ns) → ipc_namespace->ids[IPC_SHM_IDS]。
三、实现要点
3.1 文件与 VMA
- 段对应 特殊 shmem 文件(
shm_file_operations) shmat→do_shmat:创建mmapVMA,shm_vm_ops(shm_open/shm_close/shm_fault)- 支持 HugeTLB 变体(
shm_file_operations_huge)
3.2 生命周期
shm_nattch计数;IPC_RMID 后若 attach 仍为 0 才真正销毁shm_rmid_forcedsysctl:强制 RMID 行为(孤儿段清理shm_destroy_orphaned)- 进程退出:
exit_shm遍历 detach
3.3 限额
| 字段 | sysctl |
|---|---|
shm_ctlmax |
shmmax 单段最大 |
shm_ctlall |
shmall 页总数上限 |
shm_ctlmni |
shmmni 段数量 |
shm_tot 跟踪已用页。
四、与内存子系统交互
- 实际页面由 shmem/tmpfs 回退机制分配(见
linuxDoc/mm中 shmem) shm_fault:缺页填充mempolicy:shm_set_policy/shm_get_policy- RK3588 编解码:大缓冲区更常用 DMA-BUF / ion;SysV shm 多见于遗留 IPC
五、系统调用
| syscall | 说明 |
|---|---|
shmget |
ksys_shmget |
shmat / shmdt |
兼容 COMPAT 地址 |
shmctl |
old_shmctl 兼容旧结构 |
正在加载留言…