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