我有一个用户空间"平台"分叉不同的过程。所有这些进程开始执行平台plat_init()
函数,然后运行一些其他应用程序代码(这不是我的。即我无法更改此代码)。
在某些时间点,这些进程中的一些可以执行plat_shared_mem_alloc()
来分配共享内存。此函数返回句柄H(每次调用时为每个共享内存块分配一个句柄)。可以调用另一个函数plat_get_shared_memory_address(H)
来检索H的地址(在进程虚拟空间中)。
H可以发送到其他Linux进程(使用通常的IPC)。
我希望任何进程调用plat_get_shared_memory_address(H)
来返回相同的地址(对于相同的句柄H)。
换句话说,我想在使用它的所有进程中将共享物理内存映射到相同的虚拟地址,无论映射何时完成。
我认为plat_shared_mem_alloc()
可以调用shm_open(
)来创建一个"文件"在文件系统中,我知道mmap()
有MAP_FIXED
标志来强制映射的虚拟地址。
但是没有任何保证如果进程P1在地址 A 处映射共享内存句柄,那么相同的地址 A 将在另一个进程P2地址空间中可用。在调用plat_get_shared_memory_address(H)
之前,P2的应用程序代码已经在地址 A 上映射了一些内容,而mmap()
将失败。
所以我想在plat_init()调用期间阻塞每个进程中的一些地址空间(我知道第一个)。并在mmap()
需要时使用一些地址空间。
换句话说,是否有一个系统调用阻塞(保留)进程的某个虚拟地址空间(此时没有分配任何内存),所以我可以在以后根据需要在同一地址映射事物在我的不同过程中?