2012-03-16 158 views
1

我研究了一下端口映射IO和内存映射IO,并且我找出了第一个工作原理(不是第二个工作原理),所以如果你有一些很好的解释内存(我听说它是​​关于通过操作系统拦截页面错误将它们重新路由到设备)请让我知道。澄清谁决定内存映射和端口IO映射

无论如何,我的问题是:与内部实时时钟(RTS)通信使用I/O端口映射,您需要使用outb(byte_selected,0x70)和0x70端口上的类似函数..谁决定0x70港口?我怎么知道他们在哪里宣布?那么内存映射IO呢?谁决定哪些地址与哪些设备相关联?如果我将自己的设备添加到系统中,它的内存将如何映射?

我还有一个关于OS-HW通信很混乱..

回答

1

内存映射由硬件制造商决定的,在公共汽车上硬连接。它们不能被改变,必须从硬件规格中读取正确的映射。

一些类似PCI的可插拔总线通过为自己的设备拥有自己的地址空间而工作。他们可以根据I/O检测设备的存在及其需求,并将它们分配到此保留空间内。然后CPU可以使用PCI寄存器通过自己的空间访问它,或者通过DMA更高效地访问它。有关更多详细信息,请参见此页:http://tldp.org/LDP/tlk/dd/pci.html

请注意,并非所有设备都使用映射I/O - 例如,USB设备不使用内存I/O,只通过定义良好的USB命令与主机通信。

+1

但请注意,USB主控制器通常会使用内存映射I/O来生成这些命令。另请注意:使用'outb'的示例是基于端口的I/O,它是一种特殊的x86特性,它与内存映射I/O不同。这是一件遗留的事情,而这些映射完全是硬连线的。 – pmdj 2012-03-17 17:07:57

+0

伟大的一点我忘了提及。 int/outb不使用内存映射,而是使用自己的16位地址空间。这是非常遗传的东西,除了x86上的基本配置外,现在还没有如此使用。再次映射是静态决定的,尽管一些非常旧的ISA卡(声卡,重力超声...)允许您使用跳线来更改它们使用的I/O端口(如IRQ和DMA)。 PCI及其自动配置使其无用(并且PCI也使用其自己的地址空间)。 – Gnurou 2012-03-18 03:28:17