【问题标题】:Creating a Virtual FS from a Shared Memory in Heterogeneous Linux System在异构 Linux 系统中从共享内存创建虚拟 FS
【发布时间】:2021-04-11 09:47:44
【问题描述】:

我正在开发一个带有 2 个 CPU 和一个共享内存的测量设备:

=>[ CPU:0 RTOS/Measurements ]         [ CPU: 1 Linux/User]
                 \                   /          |   
                  \[ Shared Memory ]/           |
                     struct HotData              /measure
                       { int x;          ->              /x
                         char[20] y;     ->              /y
                         long z; };      ->              /z

目前,我有一个共享内存,CPU-0 在其中测量一些数据并循环更新结构“HotData”。我不想接触 CPU-0 上的代码以获得实时限制。另一方面,Linux 内核可以访问这个共享空间并读取最新的数据。

接下来,我想在 Linux 上创建一个“超轻量级”的虚拟文件系统来将这些数据字段映射到一个文件。因此,任何用户应用程序/脚本都可以轻松访问“/measure/x”并获得最新的测量结果。

  1. 将数据从共享物理地址映射到用户空间文件的最快(轻量级)方法是什么?
  2. 确定我必须实现 VFS 的打开/读取功能,是否有一个快速示例/项目可供参考?

【问题讨论】:

  • 最快的方法实际上是不做文件系统,而是做一个mmap("/dev/mem , physical address of shared region);假设这是在 I/O 映射内存中。
  • 感谢@HaltState,但我怎样才能从 /dev/mem 中公开不同的文件。就像在我的示例中一样 /dev/mem[0:3] -- 映射到 --> /dev/mem/x
  • 您不会有隔离 - 例如,您无法保护 x 与 y 与 z。相反,当您映射 /dev/mem 时,您将 4KB 的物理空间页面映射到用户空间。然后用户代码通过偏移量访问 x、y 和 z。
  • 正确。更好的是,对于只读页面,不需要隔离。但是对于我的用户来说,通过偏移量访问还不够直观。如何将虚拟文件映射到这些偏移量?没有性能开销..

标签: c embedded-linux mmap


【解决方案1】:

您可能希望查看FUSE(用户空间中的文件系统)。它是一个文件系统驱动程序(默认情况下与许多 Linux 发行版一起提供),它允许您 mount 一个由普通非特权应用程序/进程提供的虚拟文件系统。
(想想 NFS,但它是本地的 - 它不限于 NFS 协议。现有的 FUSE 解决方案可用于安装远程 SFTP 服务器,如果我记得的话,甚至还有一个将 Wikipedia 呈现为文件/目录结构的解决方案......)

有用于加载多种语言的绑定和库 - 有一个 example in Python,它显示了使用它实现虚拟文件系统是多么容易。

听起来你可能正在使用 C/C++,在这种情况下你可能想要libfuse(官方示例代码链接)。这似乎是一个简单的C tutorial over on Medium

【讨论】:

  • 谢谢@wally,但我认为保险丝在性能方面会带来很大的开销。我认为它不适合我的嵌入式测量设备。
  • 如果 FUSE 的内核和用户模式之间的上下文切换对于您的嵌入式应用程序来说过于昂贵,我担心您可能不得不求助于编写某种内核级功能。到那时,我不确定将数据显示为文件系统的开销通常会对您有什么好处吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 2023-04-03
  • 2016-11-30
  • 2012-04-03
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多