共享内存性能并保护其他进程

时间:2015-06-13 15:38:07

标签: linux security shared-memory

我正在尝试实现一个JIT编译器(我有非常讨厌的爱好)。

我希望有一个主进程保留一些持久变量,第二个进程(刚刚编译)可以进行一些计算,并且可以访问和写入持久变量。

第二个进程可以更改并重新编译,但持久性变量必须在第二个进程的两次执行之间保持相同。

我的第一个问题是:共享内存是否适合它? (另外在性能方面,因为我希望执行尽可能快。)

我的第二个问题是:如果我使用shm_overview.7中描述的共享内存,在我看来,任何其他具有相同uid的进程都可以访问它。我该怎样预防呢?我希望只有上述两个进程才能访问此共享内存。

3 个答案:

答案 0 :(得分:6)

您可能考虑的另一种架构是动态加载。而不是2个过程,你只有第一个过程;它使用dlopen()加载新编译的代码。它调用此“库”的入口点,并且代码可以访问包括持久变量在内的所有空间。返回时,您卸载库,准备下一次“运行”。

创建这样一个可加载的库并调用它非常简单,并且比执行整个新进程更快。权限没有问题,因为您的唯一进程决定加载和运行的内容。

答案 1 :(得分:3)

  1. 是的,共享内存是适合此的工具。 它会像文件一样(看大图) 流程可以读取和写入,但区别在于:

    • 共享内存效率更高,
    • 共享内存将无法在重新启动后继续存在。
  2. 我不知道限制共享内存段的任何铁定方式 仅选择进程,排除具有相同UID的其他进程。 一般来说,如果你拥有一些东西,你可以完全控制它, 具有相同UID的进程具有相同的访问权限 * 。 但是,如果您使用shmget创建共享内存段 使用IPC_PRIVATE作为密钥, 找不到相关的流程会有些困难。 它只能通过 id (标识符)访问, 其中shmget返回。对于其他一些查找id的过程, 它需要运行ipcs并解析输出。然而, 你需要一种方法让id可用于你的第二个过程 (即时编译的那个); 也许作为参数或环境变量 _______________
    * 除了因不同GID或群组成员身份导致的访问权限差异外

答案 2 :(得分:2)

  

我希望只有上述两个进程才能访问它   共享内存。

这不太可能。除非您使用一些额外的安全框架(grsecuritySELinux及其朋友),否则标准UNIX环境定义的权限使得使用相同UID运行的另一个进程可以完全控制您的进程,包括停止/重启,查杀,跟踪,检查和修改完整的进程内存。因此,即使您设法以某种方式隐藏共享内存与标准SHM访问,您也无法完全阻止其他进程干扰。