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 或記憶體映射硬體設備。

電腦記憶體映射

IO 連接埠是 IBM PC 架構中的另一個可尋址資源。在早期,您可以使用「跳線」連接板上的尋址引腳,在插入式 (ISA) 卡上實際配置此類位址。您也可以將軟體設定為使用符合的 IO 位址。

舊的 ISA 並行連接埠卡

卡片左側的白色字母描述了哪些跳線位置給出了哪些 IO 連接埠位址等。

如今,位址細節是在系統啟動時由卡片和主機動態協商和分配的。我們不再需要配置它們。

是否可以從使用者程式存取這些記憶體位址,例如寫入序列埠?也許使用彙編程式?

我相信是這樣,假設您使用的是允許它的作業系統(例如 PC-DOS,實模式作業系統)。相較之下,現代的保護模式作業系統將阻止使用者程式成功執行此類操作。

答案2

/proc/ioports列出 I/O 連接埠位址範圍。

/proc/iomem列出物理記憶體位址的範圍。

您可以透過映射直接從使用者程式存取實體記憶體位址/dev/mem,但您可能不想這樣做。您可以使用 直接從使用者程式存取 I/O 端口ioperm,但您可能不想這樣做。一般來說,您確實希望在核心模式下執行這些操作,因為您需要執行諸如禁用中斷之類的操作。

答案3

它是物理的,但其中一些線性映射到虛擬記憶體。

相關內容