作为输出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 或内存映射硬件设备。
IO 端口是 IBM PC 架构中的另一种可寻址资源。早期,您会使用“跳线”连接板上的寻址引脚,在插入式 (ISA) 卡上物理配置此类地址。您也可以配置软件以使用匹配的 IO 地址。
卡片左侧的白色字母描述了哪些跳线位置提供哪些 IO 端口地址等。
如今,寻址细节在系统启动时由卡和主机动态协商和分配。我们不再需要配置它们。
是否有可能从用户程序访问这些内存地址,例如写入串行端口?也许使用汇编程序?
我相信是的,假设您使用的操作系统允许这样做(例如 PC-DOS,实模式操作系统)。相反,现代的保护模式操作系统将阻止用户程序成功执行此类操作。
答案2
/proc/ioports
列出 I/O 端口地址的范围。
/proc/iomem
列出物理内存地址的范围。
您可以通过映射直接从用户程序访问物理内存地址/dev/mem
,但您可能不想这样做。 您可以使用直接从用户程序访问 I/O 端口ioperm
,但您可能不想这样做。 通常,您确实希望在内核模式下执行这些操作,因为您需要执行诸如禁用中断之类的操作。
答案3
它是物理的,但其中一些线性映射到虚拟内存。