0

假定有使用存储器映射I/O即,存在分配给该设备设备驱动

如果不使用虚拟存储器系统的物理存储器中的特定范围,那么它是一个设备通过使用相应物理地址完成的读/写操作来操作设备非常简单

如果存在虚拟内存系统会怎么样?

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

回答

1

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

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

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

+0

实际上是在内存映射I/O设备驱动程序写入时如何完成的一种方式? – mangusta 2012-08-16 07:51:52

+0

是的。查看为TI OMAP芯片组编写的串行驱动程序,您可以看到UART物理地址范围如何重新映射到VM。 http://lxr.free-electrons.com/source/drivers/tty/serial/omap-serial.c#L1496 – 2012-08-16 08:46:35

0

我已经做了很长一段时间,但我的回忆是,当你映射一块物理内存时,用户空间中的地址与该物理内存相对应。写入用户空间地址是写入物理内存。

+0

我不认为我完全理解你的意思。我说的是,例如,我的程序想通过串口发送一个字符,并因此调用一些serial_sendchar()例程,它是串口设备驱动程序的一部分。假定为了通过串口发送字符,我们必须将这个字符写入物理地址0x1234。我的问题是,如果它应该使用虚拟地址,serial_sendchar()例程如何写入该特定地址?如果它必须写入特定的物理地址,那么它应该绕过虚拟到物理的转换,不是吗? – mangusta 2012-08-15 23:47:23