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

标签 osdev memory-mapping

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

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

提前致谢。

最佳答案

我不是 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
....

关于osdev - 内存映射 I/O 地址从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9613178/

相关文章:

c++ - 将共享内存与 CreateFileMapping 和 MapViewofFile 一起使用的问题

opencl - 如何使用 OpenCL 以零拷贝直接写入 linux 帧缓冲区?

c++ - va_arg 不递增 C++

gcc - 有没有办法在 gnu 汇编常量中使用数学表达式?

c - Linux内核代码中的内存映射数据文件

c - 如何正确地字节移位一大块数据?

elasticsearch - 使用 Lucene 目录作为主文件存储有哪些缺点?

c - Gnu Make >$* 和 $* 的意思

assembly - 发布与 Debug模式下局部堆栈变量的代码生成

assembly - INT 0x13/AH = 0x02 适用于软盘镜像,但不适用于在闪存驱动器上刻录