proc/ioports 和 proc/iomem 显示的是什么类型的内存地址?

proc/ioports 和 proc/iomem 显示的是什么类型的内存地址?

作为输出cat proc/ioports

0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-0060 : keyboard
0064-0064 : keyboard
0070-0071 : rtc0
0080-008f : dma page reg
00a0-00a1 : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : 0000:00:0f.1
  0170-0177 : pata_via
01f0-01f7 : 0000:00:0f.1
  01f0-01f7 : pata_via
0290-0297 : pnp 00:07
02f8-02ff : serial
0376-0376 : 0000:00:0f.1
  0376-0376 : pata_via
0378-037a : parport0
037b-037f : parport0
03e0-03e7 : pnp 00:08
03f2-03f2 : floppy
03f4-03f5 : floppy
03f6-03f6 : 0000:00:0f.1
  03f6-03f6 : pata_via
03f7-03f7 : floppy
0400-041f : pnp 00:08
  0400-0407 : vt596_smbus
04d0-04d1 : pnp 00:08
0778-077a : parport0
0800-087f : pnp 00:08
  0800-0803 : ACPI PM1a_EVT_BLK
  0804-0805 : ACPI PM1a_CNT_BLK
  0808-080b : ACPI PM_TMR
  0810-0815 : ACPI CPU throttle
  0820-0823 : ACPI GPE0_BLK
0cf8-0cff : PCI conf1
d000-d0ff : 0000:00:11.5
  d000-d0ff : VIA8237
d400-d41f : 0000:00:10.3
  d400-d41f : uhci_hcd
d480-d49f : 0000:00:10.2
  d480-d49f : uhci_hcd
d800-d81f : 0000:00:10.1
  d800-d81f : uhci_hcd
d880-d89f : 0000:00:10.0

输出如下cat /proc/iomem

00000000-0000ffff : reserved
00010000-0009fbff : System RAM
0009fc00-0009ffff : reserved
000a0000-000bffff : Video RAM area
000c0000-000cf7ff : Video ROM
000e0000-000fffff : reserved
  000f0000-000fffff : System ROM
00100000-bffbffff : System RAM
  01000000-01538f03 : Kernel code
  01538f04-017c217f : Kernel data
  01877000-0194dfff : Kernel bss
bffc0000-bffcdfff : ACPI Tables
bffce000-bffeffff : ACPI Non-volatile Storage
bfff0000-bfffffff : reserved
cff00000-dfefffff : PCI Bus 0000:01
  d0000000-d7ffffff : 0000:01:00.0
e0000000-efffffff : PCI MMCONFIG 0000 [bus 00-ff]
  e0000000-efffffff : pnp 00:0d
f0000000-f7ffffff : 0000:00:00.0
fca00000-feafffff : PCI Bus 0000:01
  fd000000-fdffffff : 0000:01:00.0
  feae0000-feafffff : 0000:01:00.0
febc0000-febdffff : 0000:00:0d.0
  febc0000-febdffff : e1000
febf0000-febf7fff : 0000:00:0a.0
  febf0000-febf7fff : 0000:00:0a.0
febfbc00-febfbcff : 0000:00:10.4
  febfbc00-febfbcff : ehci_hcd
fec00000-fec00fff : reserved
  fec00000-fec003ff : IOAPIC 0
fecc0000-fecc03ff : IOAPIC 1
fee00000-fee00fff : Local APIC
  fee00000-fee00fff : pnp 00:09
ff7c0000-ffffffff : reserved
  fff80000-ffffffff : pnp 00:0e

我不明白这里指的是哪些内存地址。是虚拟内存吗?是否可以从用户程序访问这些内存地址,例如写入串行端口?也许使用汇编程序?

答案1

这里指的是哪些内存地址。是虚拟内存吗?

第一台 IBM PC 的设计部​​分是将一些内存地址用于实际内存以外的其他用途(程序和数据使用的内存)。

在第一台 IBM PC 中,您可以拥有最多 640 KB 的 RAM,但芯片可以寻址最多 1024 KB 的内存,但是写入高于 640(且小于 1024)的内存地址实际上不是用于与 RAM 通信,而是用于与插入式图形适配器等设备通信。

这个概念有时被称为内存映射 IO 或内存映射硬件设备。

PC内存映射

IO 端口是 IBM PC 架构中的另一种可寻址资源。早期,您会使用“跳线”连接板上的寻址引脚,在插入式 (ISA) 卡上物理配置此类地址。您也可以配置软件以使用匹配的 IO 地址。

旧的 ISA 并行端口卡

卡片左侧的白色字母描述了哪些跳线位置提供哪些 IO 端口地址等。

如今,寻址细节在系统启动时由卡和主机动态协商和分配。我们不再需要配置它们。

是否有可能从用户程序访问这些内存地址,例如写入串行端口?也许使用汇编程序?

我相信是的,假设您使用的操作系统允许这样做(例如 PC-DOS,实模式操作系统)。相反,现代的保护模式操作系统将阻止用户程序成功执行此类操作。

答案2

/proc/ioports列出 I/O 端口地址的范围。

/proc/iomem列出物理内存地址的范围。

您可以通过映射直接从用户程序访问物理内存地址/dev/mem,但您可能不想这样做。 您可以使用直接从用户程序访问 I/O 端口ioperm,但您可能不想这样做。 通常,您确实希望在内核模式下执行这些操作,因为您需要执行诸如禁用中断之类的操作。

答案3

它是物理的,但其中一些线性映射到虚拟内存。

相关内容