我们的应用程序依赖于可加载为 .so 文件的外部第 3 方提供的配置(包括自定义驾驶/决策功能)。
独立地,它使用一块共享内存与外部 CGI 模块合作,其中几乎所有的易失性状态都被保存下来,以便外部模块可以读取它并在适用的情况下对其进行修改。
问题是 CGI 模块也需要来自 .so 的大量永久配置数据,并且主应用程序在两个内存区域之间执行大量完全不必要的复制以使数据可用。这个想法是让整个共享对象加载到共享内存中,并使其直接可供 CGI 使用。问题是:如何?
- dlopen 和 dlsym 不提供任何工具来指定加载 SO 文件的位置。
- 我们尝试了 shmat()。它似乎只在某些外部 CGI 实际尝试访问共享内存之前才有效。然后指向的区域看起来就像从未共享过一样私密。也许我们做错了什么?
- 在每个需要它的脚本中加载 .so 是不可能的。结构的庞大规模与调用频率有关(一些脚本每秒调用一次以生成实时更新),而这是一个嵌入式应用程序,使其无法运行。
- 简单地将 .so 放入 shm 中的 memcpy() 也不好——一些结构和所有函数都通过指针相互连接。