Linux kernel 澄清谁决定内存映射和端口IO映射

Linux kernel 澄清谁决定内存映射和端口IO映射,linux-kernel,driver,device-driver,kernel,Linux Kernel,Driver,Device Driver,Kernel,我研究了一些端口映射IO和内存映射IO,并了解了第一种IO的工作原理(还没有第二种),因此,如果您对内存映射IO的执行方式有很好的解释(我听说是操作系统拦截页面错误以将其重新路由到设备),请告诉我 无论如何,我的问题是:与内部实时时钟(RTS)通信使用I/O端口映射,您需要在0x70端口上使用outb(字节_selected,0x70)和类似函数。。谁决定了0x70端口?我怎样才能知道它们是在哪里申报的?那么内存映射IOs呢?谁决定哪些地址与哪些设备关联?如果我将自己的设备添加到系统中,它的内存

我研究了一些端口映射IO和内存映射IO,并了解了第一种IO的工作原理(还没有第二种),因此,如果您对内存映射IO的执行方式有很好的解释(我听说是操作系统拦截页面错误以将其重新路由到设备),请告诉我

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


关于操作系统硬件通信,我仍然有很多困惑。

内存映射由硬件制造商决定,并在总线上硬连线。它们不能进行任何更改,必须从硬件规范中读取正确的映射

一些可插拔总线(如PCI)通过为其设备提供自己的地址空间来工作。它们可以检测设备的存在及其在I/O方面的需求,并在此保留空间内为设备分配范围。然后,CPU可以使用PCI寄存器通过自己的空间访问它,或者通过DMA更有效地访问它。有关更多详细信息,请参阅本页:


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

注意,USB主机控制器通常使用内存映射I/O来生成这些命令。另请注意:使用
outb
的示例是基于端口的I/O,这是一种特殊的x86功能,不同于内存映射I/O。这是一个遗留问题,而且这些映射完全是硬连接的。我忘了提这一点。int/outb不使用内存映射,而是使用自己的16位地址空间。这是非常传统的东西,除了x86上的基本配置之外,现在不再使用。虽然一些非常旧的ISA卡(sound blaster、gravis超声波…)允许您使用跳线更改它们使用的I/O端口(以及IRQ和DMA),但映射仍然是静态决定的。PCI及其自动配置使得这一点毫无用处 (PCI也使用自己的地址空间)。