内存映射的I / O地址来自何处?

时间:2012-03-08 05:09:00

标签: osdev memory-mapping

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

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

我不确定谁设置地址,但据我所知,硬件供应商可以设置他们想要的内存映射。

对于它的价值,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
....

答案 1 :(得分:1)

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

对于不在任何总线上的东西,例如。 ps / 2控制器,检测很困难,涉及解析ACPI表。