I / O内存映射

时间:2016-02-16 05:31:56

标签: io cpu hardware bios bus

我正在审核I / O的基本要素,虽然我认为我理解了大部分内容,但我仍然对如何将物理地址或单独端口映射到各个设备感到困惑。计算机是否在系统启动时轮询总线,逐个地为设备分配地址,或者是否存在已加载到内存中的固定地址?如果这是通过BIOS完成的,那么这个内存布局信息如何传递给操作系统?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

(之前已经提出并回答了这个问题,你应该先搜索一下)

取决于平台,你不是具体的

某些系统,这些系统中的一些外设,由芯片/系统设计人员硬编码。

对于pci(e),如此定义,您枚举搜索连接外围设备的总线,这些外围设备配置空间(由外围设备供应商根据需要定义)表示它们的数量和大小需要。对于x86 pc,bios执行此枚举而不是操作系统。对于其他平台,它依赖于该平台,它可能是引导加载程序或操作系统。但有人必须占用可用空间(基本上硬盘主要用于知道平台和已经使用的平台的平台)并将其分开。对于x86来说,它曾经只是一个在32位日内被分割的演出,并且仍然在一些系统上发生,但对于64位系统,bioses打开高达2gig的每一个,并且可以将它放在高地址空间中为了避免ram(想知道为什么你的带有4gig dram的32位系统只有3gig可用?)。自然平坦的记忆空间只是一种幻觉,pci外围设备要求的窗户可以是小窗户进入他们的空间,例如带有大量内存的显卡。你使用csrs来移动窗户,有点像站在你的房子里看着一个小窗户,身体并排移动,通过窗户看到更多的东西,但只有窗户的大小在任何时候。

同样适用于usb,它被列举,搜索总线并且外围设备应答。与usb虽然它没有映射到主机的地址空间。

操作系统如何查找此信息在很大程度上取决于系统类型。在x86上使用bios有一种已知的获取信息的方法,我认为你也可以在dos中获得相同的信息(是的dos仍然被大量使用)。对于非pcie或usb,操作系统驱动程序必须找到外围设备或者只知道平台是否一致(pc中串行端口的地址),或者有办法在不损害其他设备或崩溃的情况下找到它们。在某些情况下,操作系统本身就进行了枚举。或引导加载程序,如果这是枚举发生的地方。但是在各种平台之上的每个引导加载程序和操作系统的组合可能各自都有自己不同的解决方案,没有理由期望它们是相同的。

好吧你确实说过bios并且有一个bios标签,暗示着x86系统。 bios在启动时执行pci / pcie枚举,如果你没有设置你的BIOS知道你的操作系统是64位,它可能需要从你的较低4Gig空间的pcie设备(如果你设置为64位,但是安装一个32位操作系统,然后由于其他原因你在那里遇到麻烦)。我不记得了,但是会假设有操作系统可以使用的bios调用来找出bios做了什么,不应该很难找到这些信息。以这种方式不可发现的任何东西都可能是遗留的和硬编码的,或者使用遗留技术来发现(在一系列地址中搜索bios的总线样式等)。 pcie / usb供应商和产品ID信息告诉驱动程序有什么,并且他们将硬编码的偏移量放入这些空间以完成与外围设备通信所需的地址。