内存映射IO - 它是如何完成的?

时间:2012-03-11 11:25:48

标签: operating-system linux-kernel kernel device-driver

我已经了解了端口映射IO和内存映射IO之间的区别,但我无法弄清楚在现代操作系统(windows或linux)中如何实现内存映射Io

我所知道的是,物理内存的一部分被保留用于与硬件通信,并且有一个MMIO单元负责处理总线通信和其他与内存相关的内容

驱动程序如何与底层硬件通信?驱动程序将使用哪些功能?在使用它们之前,与视频卡通信的地址是固定的还是某种“协议”?

我还是很困惑

3 个答案:

答案 0 :(得分:34)

你问题中的以下陈述是错误的:

What I know is that a part of the physical memory is reserved to communicate with the hardware

物理内存的一部分保留用于与硬件通信。物理内存和内存映射IO映射到的物理地址空间的一部分是。这种内存布局是永久性的,但是用户程序不会直接看到它 - 而是会遇到它们自己的虚拟地址空间,内核可以决定映射到哪里,物理内存和IO范围

您可能希望阅读以下文章,我认为这些文章包含大多数问题的答案:

答案 1 :(得分:2)

您是在询问内存映射文件还是内存映射端口-IO?

内存映射文件是通过将页面分页并拦截这些地址的页面错误来完成的。这完全由操作系统通过文件系统管理器和页面错误处理程序之间的协商来完成。

内存映射端口-IO在CPU级别通过将地址线重载为端口IO线来完成,这允许写入内存作为端口IO转换到QPI总线上。这一切都是由处理器与主板交互完成的。操作系统需要做的唯一另一件事就是告诉MMU不要通过PAE必须写入和无缓存位来进行读写操作。

答案 2 :(得分:2)

http://en.wikipedia.org/wiki/Memory-mapped_I/O

http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/IO/mapped.html

基本上它只是一种访问数据的形式,就好像你是从内存中保存/读取一样。但硬件将窥探地址总线,当它看到目标地址为他时,它将只接收数据总线上的数据。