共享内存 posix 提供一套 , XSI(systemv) 提供一套
共享内存的实现 有很多种
1.posix mmap && open mmap
共享文件映射mmap(/dev/shm/xxx) 也用到了 shmem_vm_ops ,封装出了 posix 共享内存
2.XSI(systemv)
3.memfd_create和fd跨进程共享
4.dma-buf
共享内存实现方案有多种,posix共享内存是其中的一种
posix共享内存是一种通信方式,其基于 mmap 和 (文件系统shmem)
内存文件系统shmem 提供 fd 和 tmpfs 所有文件共享的 file_operations
mmap 提供 访问 fd 对应的 内存 的 技术
————————————————
版权声明:本文为CSDN博主「__pop_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https:
mmap(do_mmap) /dev/shm/xxx
get_unmapped_area & mmap_region中的 file->f_op->mmap file_operations中的shmem_get_unmapped_area&shmem_mmap
do_fault中do_read_fault(读) do_share_fault(写)调用的 vma->vma_ops->fault() shmem_fault
————————————————
版权声明:本文为CSDN博主「__pop_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https:
tmpfs
mmap
共享内存探讨
- 基于 CONFIG_SHMEM=n & CONFIG_TMPFS=n 配置下的 tmpfs
file_operations ramfs_file_operations
.get_unmapped_area = ramfs_mmu_get_unmapped_area,
.mmap = generic_file_mmap,
vma->vm_ops = &generic_file_vm_ops;
.fault = filemap_fault,
page = find_get_page(mapping, offset);
vmf->page = page;
.map_pages = filemap_map_pages
alloc_set_pte(vmf, page)
- 基于 CONFIG_SHMEM=y & CONFIG_TMPFS=n 配置下的 tmpfs
file_operations shmem_file_operations
.get_unmapped_area = shmem_get_unmapped_area,
.mmap = shmem_mmap
vma->vm_ops = &shmem_vm_ops;
.fault = shmem_fault,
shmem_getpage_gfp
.map_pages = filemap_map_pages,
alloc_set_pte(vmf, page)
- 基于 CONFIG_SHMEM=y & CONFIG_TMPFS=y 配置下的 tmpfs
与 基于 CONFIG_SHMEM=y & CONFIG_TMPFS=n 配置下的 tmpfs 一致
总结
共享内存 会用到 shmem_vm_ops
shmem_vm_ops 会 根据 tmpfs 的配置不同 重定位到 shmem_vm_ops 或者 generic_file_vm_ops
扩展
/dev/zero 和 共享匿名映射 也会用到 shmem_vm_ops