我正在处理一些使用 Linux 的 RTAI 扩展编写的旧实时控制系统代码。我看到有四种不同的机制用于跨进程边界创建和共享内存。
1)RTAI共享内存(rt_shm_alloc & rt_shm_free):这使用一个unsigned long全局唯一值作为访问共享内存的key。在幕后(至少从用户空间),它使用字符设备上的 ioctl 来生成内存,然后使用 mmap 使其可用。
2) System V(ftok、shmget、shmat、shmctl 等):它使用 ftok 生成一个键,该键与索引值一起用于查找和映射内存块。我没有尝试查看它是如何实际实现的,但我假设它在幕后某处使用 mmap。
3) Posix 共享内存(shm_open、mmap、shm_unlink 等):这需要一个字符串(对内容有一些限制)并提供一个文件句柄,可用于映射链接的内存块。这似乎支持使用虚拟文件系统。
4)直接使用mmap和字符驱动ioctl调用某些内核模块提供了直接支持使用mmap创建和共享内存块的接口。
所有这些机制似乎都显式或隐式地使用 mmap 来更改虚拟内存子系统以设置和管理共享内存。
问题是:如果使用其中一个系统共享一块内存,有没有办法设置一个别名来访问其他系统中的相同内存。
一个用例:
我有两个 I/O 子系统。第一个是使用 linux 内核驱动程序实现的,并将其当前 I/O 状态导出到使用 RTAI 共享内存机制创建的一块共享内存中。第二种是基于etherlab ethercat master,它使用自定义内核模块,直接使用ioctl和mmap创建共享内存块。
我有大约 40 个其他系统需要访问某些 I/O 字段,但并不真正需要知道数据来自哪个 I/O 子系统。
我想要的是一种以单一连贯方式打开和访问不同类型共享内存的方法,将底层实现细节与用户隔离开来。 这样的机制存在吗?
我已经更改了 ethercat 堆栈以使用 RTAI 共享内存机制来解决此实例,但这只是一个临时解决方案(阅读:hack)。