【问题标题】:Linux: create mmap()able virtual file (e.g. SPI memory)Linux:创建 mmap()able 虚拟文件(例如 SPI 内存)
【发布时间】:2011-07-08 17:41:39
【问题描述】:

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

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

有什么诀窍可以让我这样做吗?

TIA

【问题讨论】:

    标签: linux linux-device-driver mmap


    【解决方案1】:

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

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

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

    【讨论】:

    • 一个 mmap 接口可能如果可以合理地缓存数据就有意义。但话又说回来,使用普通的 read()/write() 可能同样有效
    • SPI 总线上的内存实际上是一个寄存器组,所以我想我宁愿将它作为用户空间中的数组来访问,而不是 lseek() 到处乱跑
    • @Metiu:重要的是内存总线上的 SPI 控制器,而不是 SPI 连接内存中的寄存器。
    【解决方案2】:

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

    【讨论】:

    • 所以你是说我可以 mmap() 一个 blkdev,这会向我发送 cmds 而不是仅仅尝试去内存页面?
    • 是的,但您必须实现该块设备。本的回答比我的要全面得多。把功劳给他。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2021-07-25
    相关资源
    最近更新 更多