内存映射的I / O地址从何而来?

QAH*_*QAH 5 osdev memory-mapping

我正在搞一些业余OS开发,并且对内存映射的I / O地址有些困惑。我了解整个内存映射的I / O概念,但是我试图弄清楚开发人员如何获得地址来操纵硬件。

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

提前致谢。

Ale*_*lex 4

我不能 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
....
Run Code Online (Sandbox Code Playgroud)