我正在搞乱一些业余爱好者OS开发,我对内存映射I / O地址有点困惑。我理解整个内存映射I / O概念,但我试图弄清楚开发人员如何获取操作硬件的地址。
是硬件供应商指定的地址,还是所有计算机的某种标准地址?例如,用于文本打印的VGA存储器从地址0xB8000开始。是每个x86机器的标准吗?如果是这样,谁设定了这个标准?例如,如果我想与以太网卡通信,我怎么知道它用于通信的地址或端口?
提前致谢。
答案 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表。