Linux:创建mmap()可访问的虚拟文件(例如SPI内存)

Linux:创建mmap()可访问的虚拟文件(例如SPI内存),linux,linux-device-driver,mmap,Linux,Linux Device Driver,Mmap,我有一个可以访问外部SPI内存的char设备,我想对外部内存进行mmap(),这样我就可以像访问普通内存一样从程序中访问它 如果我在char设备文件上使用通常的mmap()页面重新映射实现,它只允许我查看设备内存区域,而不是它的虚拟char文件 有什么窍门可以让我这么做吗 TIA听起来您需要某种驱动程序,将内存区域访问转换为通过面向字符的接口发送的命令。这可能是一个非常直接的块设备驱动程序。如果字符设备驱动程序提供了mmap实现,它就可以工作了。可能有一个很好的理由不这样做: 内存访问指令在总线

我有一个可以访问外部SPI内存的char设备,我想对外部内存进行mmap(),这样我就可以像访问普通内存一样从程序中访问它

如果我在char设备文件上使用通常的mmap()页面重新映射实现,它只允许我查看设备内存区域,而不是它的虚拟char文件

有什么窍门可以让我这么做吗


TIA

听起来您需要某种驱动程序,将内存区域访问转换为通过面向字符的接口发送的命令。这可能是一个非常直接的块设备驱动程序。

如果字符设备驱动程序提供了
mmap
实现,它就可以工作了。可能有一个很好的理由不这样做:

内存访问指令在总线上创建内存事务。SPI内存不能以这种方式寻址(尽管SPI控制器可能使用内存映射I/O,这是用于其自己的寄存器级接口,而不是内存内容)。我想,您可以构建一个带有内存总线接口的SPI内存控制器,但是您将失去与SPI标准无关的设备


模拟内存区域是可能的(抓取一页内存,将其标记为无访问,并处理访问冲突(SIGBUS和SIGSEGV),但这将是非常低效的。有时您会发现虚拟机正在这样做,但性能非常差。

如果可以合理地缓存数据,mmap的接口可能是有意义的。但同样,使用普通的read()/write()也可能同样有效SPI总线上的内存实际上是一个寄存器库,所以我想我更愿意在用户空间中作为数组来访问它,而不是lseek()ingaround@Metiu:计数的是内存总线上的SPI控制器,而不是SPI连接内存中的寄存器一个blkdev,这将向我发送CMD,而不是仅仅尝试进入内存页?是的,但你必须实现该阻止设备。Ben的答案比我的答案更全面。请相信他。