【问题标题】:Clarifying who decides memory mappings and port IO mappings明确谁决定内存映射和端口 IO 映射
【发布时间】:2012-04-02 10:37:11
【问题描述】:

我研究了一些关于端口映射 IO 和内存映射 IO 的知识,并弄清楚了第一个是如何工作的(不是第二个),所以如果你对内存映射 IO 的执行方式有很好的解释(我听说它是​​关于由操作系统拦截页面错误以将它们重新路由到设备)请告诉我。

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

我仍然对操作系统硬件通信有很多困惑..

【问题讨论】:

    标签: linux-kernel driver device-driver kernel


    【解决方案1】:

    内存映射由硬件制造商决定,并固定在总线上。它们无法更改,必须从硬件规范中读取正确的映射。

    一些可插拔总线(如 PCI)通过为其设备提供自己的地址空间来工作。他们可以根据 I/O 检测设备的存在及其需求,并在此保留空​​间内为其分配范围。然后 CPU 可以使用 PCI 寄存器通过自己的空间访问它,或者通过 DMA 更有效地访问它。更多详情请查看此页面:http://tldp.org/LDP/tlk/dd/pci.html

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

    【讨论】:

    • 请注意,USB 主机控制器通常确实使用内存映射 I/O 来生成这些命令。另请注意:使用outb 的示例是基于端口的I/O,它是不同于内存映射I/O 的特殊x86 功能。这是一个遗留问题,这些映射是完全硬连线的。
    • 好点我忘了提。 int/outb 不使用内存映射,而是自己的 16 位地址空间。除了 x86 上的基本配置外,这是非常遗留的东西,现在不那么使用了。再一次映射是静态决定的,尽管一些非常旧的 ISA 卡(声音冲击器、重力超声...)允许您使用跳线更改它们使用的 I/O 端口(如 IRQ 和 DMA)。 PCI 和它的自动配置使这个无用(而且 PCI 也使用自己的地址空间)。
    猜你喜欢
    • 2015-08-09
    • 2011-04-22
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2017-11-26
    相关资源
    最近更新 更多