【发布时间】:2011-07-08 17:41:39
【问题描述】:
我有一个可以访问外部 SPI 内存的 char 设备,我想 mmap() 外部内存,以便我可以从程序中访问它,就像它是普通内存一样。
如果我在 char 设备文件上使用通常的 mmap() 页面重映射实现,它只会让我看到设备内存区域,而不是它的虚拟 char 文件...
有什么诀窍可以让我这样做吗?
TIA
【问题讨论】:
标签: linux linux-device-driver mmap
我有一个可以访问外部 SPI 内存的 char 设备,我想 mmap() 外部内存,以便我可以从程序中访问它,就像它是普通内存一样。
如果我在 char 设备文件上使用通常的 mmap() 页面重映射实现,它只会让我看到设备内存区域,而不是它的虚拟 char 文件...
有什么诀窍可以让我这样做吗?
TIA
【问题讨论】:
标签: linux linux-device-driver mmap
如果字符设备驱动程序提供了mmap 实现,它就可以工作。可能有一个很好的理由:
内存访问指令在总线上创建内存事务。 SPI 内存不能以这种方式寻址(尽管 SPI 控制器可能使用内存映射 I/O,但这是针对其自己的寄存器级接口,而不是内存内容)。我想你可以构建一个带有内存总线接口的 SPI 内存控制器,但你会失去 SPI 标准的设备独立性。
模拟一个内存区域是可能的(抓取一页内存,将其标记为不可访问,并处理访问冲突(SIGBUS 和 SIGSEGV),但这会非常低效。有时你会发现虚拟机这样做,但是性能很差。
【讨论】:
听起来您需要某种驱动程序,将内存区域访问转换为通过面向字符的接口发送的命令。这可能是一个非常简单的块设备驱动程序。
【讨论】: