【问题标题】:Device driver in virtual memory system虚拟内存系统中的设备驱动程序
【发布时间】:2012-08-15 23:12:15
【问题描述】:

假设有一个设备使用内存映射 I/O,即有一个特定范围的物理内存分配给这个设备

如果不使用虚拟内存系统,那么通过对相应物理地址进行读/写操作来操作设备是非常简单的

如果有虚拟内存系统呢?

设备驱动程序需要知道分配给该设备的特定物理内存范围,但是如果它应该使用虚拟地址而不是物理地址,它如何访问该地址范围?

【问题讨论】:

    标签: driver device linux-device-driver virtual-memory memory-mapping


    【解决方案1】:

    在内存映射 IO 设备的情况下,该设备共享的任何物理地址都可以使用 ioremap() API [1] 映射到内核虚拟内存。

    因此,在您的情况下,我们可以使用 ioremap() 映射物理地址 0x1234 以获取其内核虚拟地址并开始向该地址写入数据。

    [1]http://lxr.gwbnsh.net.cn/linux/arch/cris/mm/ioremap.c

    【讨论】:

    • 在编写内存映射 I/O 设备驱动程序时,这实际上是一种方式吗?
    • 是的。看看这个为 TI OMAP 芯片组编写的串行驱动程序,您可以看到 UART 物理地址范围是如何重新映射到 VM 的。 lxr.free-electrons.com/source/drivers/tty/serial/…
    【解决方案2】:

    好久没做过了,但我的回忆是,当你映射一块物理内存时,你的用户空间中的地址对应的是那块物理内存。写入用户空间地址就是写入物理内存。

    【讨论】:

    • 我认为我不太明白你的意思。我的意思是,例如,我的程序想通过串口发送一个字符,因此调用了一些 serial_sendchar() 例程,它是串行设备驱动程序的一部分。假设为了通过串口发送一个字符,我们必须将此字符写入物理地址 0x1234。我的问题是如果应该使用虚拟地址,serial_sendchar() 例程如何写入该特定地址?如果它必须写入特定的物理地址,那么它应该绕过虚拟到物理的转换,不是吗?
    猜你喜欢
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多