C 在异构Linux系统中从共享内存创建虚拟FS
我正在开发一种测量设备,具有2个CPU和一个共享内存:C 在异构Linux系统中从共享内存创建虚拟FS,c,embedded-linux,mmap,C,Embedded Linux,Mmap,我正在开发一种测量设备,具有2个CPU和一个共享内存: =>[ CPU:0 RTOS/Measurements ] [ CPU: 1 Linux/User] \ / | \[ Shared Memory ]/ | struct HotData /measure
=>[ 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”,例如,并获取最新的度量值
挂载由正常的非特权应用程序/进程提供的虚拟文件系统。
(想想NFS,但它是本地的——而且它并不局限于NFS协议。现有的FUSE解决方案用于安装远程SFTP服务器,如果我记得的话,甚至还有一种将Wikipedia呈现为文件/目录结构的解决方案…)
有用于加载语言的绑定和库—有一个实例表明使用它实现虚拟文件系统是多么容易
听起来您可能正在使用C/C++,在这种情况下,您可能需要(官方示例代码链接)。这似乎是一个简单明了的问题。您可能希望了解一下(用户空间中的文件系统)。它是一个文件系统驱动程序(默认情况下随许多Linux发行版一起提供),允许您挂载由正常的非特权应用程序/进程提供的虚拟文件系统。
(想想NFS,但它是本地的——而且它并不局限于NFS协议。现有的FUSE解决方案用于安装远程SFTP服务器,如果我记得的话,甚至还有一种将Wikipedia呈现为文件/目录结构的解决方案…)
有用于加载语言的绑定和库—有一个实例表明使用它实现虚拟文件系统是多么容易
听起来您可能正在使用C/C++,在这种情况下,您可能需要(官方示例代码链接)。有一个看起来很简单的方法。最快的方法实际上不是做一个文件系统,而是做一个mmap(“/dev/mem,共享区域的物理地址)
;假设这是在I/O映射内存中。谢谢@HaltState,但是我如何从/dev/mem中公开不同的文件。就像我的示例/dev/mem[0:3]--映射到-->/dev/mem/xYou将不会有隔离-例如,您无法保护x对y对z。相反,当您映射/dev/mem时,您将一个4KB的物理空间页映射到用户空间。然后用户代码通过偏移量访问x、y和z。正确。更好的是,对于只读页,不需要隔离。但通过偏移量访问不是i对我的用户来说,这已经足够了。我如何将虚拟文件映射到这些偏移量?而不需要性能开销。最快的方法实际上是不做文件系统,而是做mmap(“/dev/mem,共享区域的物理地址)
;假设这是在I/O映射内存中。谢谢@HaltState,但是我如何从/dev/mem中公开不同的文件呢。就像我的示例/dev/mem[0:3]--映射到-->/dev/mem/xYou将不会有隔离-例如,您无法保护x与y与z。相反,当您映射/dev/mem时,您将一个4KB的物理空间页面映射到用户空间。然后,用户代码通过偏移量访问x、y和z.Correct。更好的是,对于只读页面,不需要隔离。但通过偏移量进行访问对我的用户来说不够直观。如何将虚拟文件映射到这些偏移?没有性能开销..谢谢@wally,但我认为fuse在性能方面有很大的开销。我认为它不适合我的嵌入式测量设备。如果FUSE的内核和用户模式之间的上下文切换对于您的嵌入式应用程序来说太昂贵,我担心您可能不得不求助于编写某种内核级功能。在这一点上,我不确定将数据显示为文件系统的开销是否会给您带来任何好处?谢谢@wally,但我认为fuse在性能方面会带来很大的开销。我认为它不适合我的嵌入式测量设备。如果FUSE的内核和用户模式之间的上下文切换对于您的嵌入式应用程序来说太昂贵,我担心您可能不得不求助于编写某种内核级功能。在这一点上,我不确定作为文件系统显示数据的开销是否会对您有任何好处?