2012-03-08 28 views
2

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

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

在此先感谢。

回答

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 
.... 
+0

您是否碰巧知道在线或在某本书上列出的端口的确切列表? – QAH 2012-03-08 05:42:09

+0

如果您下载最新的Linux内核,某些体系结构的设备会在'arch/XXX/mach-XXX'目录中声明它们的设备。此外,QEMU在回购协议的'hw /'目录中手动声明了大量映射,尽管我不确定这些映射是否具有权威性或现实性。有关更多信息,请查看各种总线协议,如PCI或SCSI,以查看它们是否具有映射发现功能。 – Alex 2012-03-08 05:51:05

+0

也,只是所以我不会错误地把你扔掉,它是iomem,而不是ioports。我的错。 – Alex 2012-03-08 06:15:03

1

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

对于任何巴士上没有的东西,例如: ps/2控制器,检测非常困难,涉及解析ACPI表。

相关问题