【问题标题】:Where do memory mapped I/O addreses come from?内存映射的 I/O 地址从何而来?
【发布时间】:2012-03-25 16:06:56
【问题描述】:

我在搞一些业余爱好者的操作系统开发,我对内存映射的 I/O 地址有点困惑。我了解整个内存映射 I/O 的概念,但我试图弄清楚开发人员如何获取地址来操作硬件。

这些地址是硬件供应商指定的,还是所有计算机的某种标准地址?例如,用于文本打印的 VGA 内存从地址 0xB8000 开始。这是每台 x86 机器的标准吗?如果是这样,谁制定了这个标准?例如,如果我想与以太网卡通信,我如何知道它用于通信的地址或端口?

提前致谢。

【问题讨论】:

    标签: osdev memory-mapping


    【解决方案1】:

    我不能 100% 确定谁设置了地址,但据我所知,硬件供应商可以根据需要设置内存映射。

    不管怎样,Linux 让您可以通过 cat /proc/iomem 查看内存当前在您机器上的映射情况:

    00000000-0000ffff : reserved
    00010000-0009f3ff : System RAM
    0009f400-0009ffff : reserved
    000a0000-000bffff : PCI Bus 0000:00
      000a0000-000bffff : Video RAM area
    000c0000-000c7fff : Video ROM
    000ca000-000cbfff : reserved
      000ca000-000cafff : Adapter ROM
    000cc000-000cffff : PCI Bus 0000:00
    000d0000-000d3fff : PCI Bus 0000:00
    000d4000-000d7fff : PCI Bus 0000:00
    000d8000-000dbfff : PCI Bus 0000:00
    000dc000-000fffff : reserved
      000f0000-000fffff : System ROM
    00100000-3fedffff : System RAM
      01000000-01536143 : Kernel code
      01536144-017c007f : Kernel data
      01875000-0194bfff : Kernel bss
    3fee0000-3fefefff : ACPI Tables
    ....
    

    【讨论】:

    • 您是否碰巧知道在线或某本书中列出的端口的最终列表?
    • 如果您下载最新的 linux 内核,某些架构的设备会在 arch/XXX/mach-XXX 目录中声明。此外,QEMU 在 repo 的 hw/ 目录中手动声明了大量映射,尽管我不确定这些映射是否具有权威性或现实性。有关更多信息,请查看各种总线协议(如 PCI 或 SCSI),看看它们是否具有映射发现功能。
    • 另外,为了不让你误会,它是 iomem,而不是 ioports。我的错。
    • 只是把我的两分钱投入... 在 x86 系统上,许多这些 MMIO 地址是由 BIOS 在引导时设置的,尽管有些是由约定(传统 VGA 地址范围)规定的。使用设备可能意味着从 PCI 配置空间获取 MMIO 地址,但是您可以从 BIOS 提供的 ACPI 表(尤其是从 DSDT)中获取相当完整的资源映射。很抱歉将此作为评论而不是答案,但您似乎不久前接受了这个!
    【解决方案2】:

    您可以通过一些硬件检测机制获得端口,例如 PCI 总线扫描、usb 和 ACPI。 例如,如果您在 PCI 上找到支持的显示卡,则查询其 BAR(基地址寄存器)并获得物理地址和/或 IO 端口基址和/或 IRQ 编号。 NIC 和其他卡也一样。

    对于不在任何公共汽车上的东西,例如。 ps/2 控制器,检测难度很大,需要解析 ACPI 表。

    【讨论】:

      猜你喜欢
      • 2019-02-19
      • 2016-05-27
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      • 2011-12-15
      • 2011-01-19
      • 2012-03-02
      • 2017-05-17
      相关资源
      最近更新 更多