Welche Art von Speicheradressen werden von proc/ioports und proc/iomem angezeigt?

Welche Art von Speicheradressen werden von proc/ioports und proc/iomem angezeigt?

Dies ist die Ausgabe von 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

und die Ausgabe von 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

Ich verstehe nicht, auf welche Speicheradressen hier Bezug genommen wird. Handelt es sich um virtuellen Speicher? Wäre es möglich, von einem Benutzerprogramm aus auf diese Speicheradressen zuzugreifen, um beispielsweise in die serielle Schnittstelle zu schreiben? Vielleicht mit Assembler?

Antwort1

auf welche Speicheradressen wird hier Bezug genommen. Handelt es sich um virtuellen Speicher?

Ein Teil des Designs des ersten IBM PCs bestand darin, einige Speicheradressen für andere Dinge als den eigentlichen Speicher (wie ihn Programme und Daten verwenden) zu verwenden.

Beim ersten IBM PC waren bis zu 640 KB RAM möglich, die Chips konnten jedoch bis zu 1024 KB Speicher adressieren. Das Schreiben auf Speicheradressen über 640 (und unter 1024) diente allerdings nicht der Kommunikation mit dem RAM, sondern mit Geräten wie Plug-in-Grafikadaptern.

Dieses Konzept wird manchmal als „Memory-Mapped IO“ oder „Memory-Mapped Hardware Devices“ bezeichnet.

PC-Speicherzuordnung

IO-Ports sind eine weitere Art adressierbarer Ressourcen in der IBM PC-Architektur. Früher konfigurierte man solche Adressen physisch auf Plug-in-Karten (ISA-Karten), indem man „Jumper“ verwendete, um Adressierungsstifte auf der Platine zu verbinden. Man konnte auch Software konfigurieren, um passende IO-Adressen zu verwenden.

Eine alte ISA-Parallelportkarte

Die weiße Beschriftung auf der linken Seite der Karte beschreibt, welche Jumperpositionen welche IO-Port-Adressen usw. ergeben.

Heutzutage werden die Adressdaten beim Systemstart dynamisch zwischen den Karten und dem Host-Rechner ausgehandelt und vergeben. Eine Konfiguration durch uns ist nicht mehr nötig.

Wäre es möglich, von einem Anwenderprogramm aus auf diese Speicheradressen zuzugreifen, um beispielsweise in die serielle Schnittstelle zu schreiben? Vielleicht mit Assembler?

Ich glaube schon, vorausgesetzt, Sie verwenden ein Betriebssystem, das dies zulässt (z. B. PC-DOS, ein Real-Mode-Betriebssystem). Moderne Betriebssysteme im geschützten Modus verhindern dagegen, dass solche Vorgänge von einem Benutzerprogramm aus erfolgreich ausgeführt werden.

Antwort2

/proc/ioportslistet Bereiche von E/A-Portadressen auf.

/proc/iomemlistet Bereiche physischer Speicheradressen auf.

Sie können von einem Benutzerprogramm aus direkt auf physische Speicheradressen zugreifen, indem Sie zuweisen /dev/mem, aber das möchten Sie wahrscheinlich nicht. Sie können von einem Benutzerprogramm aus direkt auf E/A-Ports zugreifen, indem Sie zuweisen ioperm, aber das möchten Sie wahrscheinlich nicht. Im Allgemeinen sollten Sie sich für diese Art von Aufgaben wirklich im Kernelmodus befinden, da Sie beispielsweise Interrupts deaktivieren müssen.

Antwort3

Es ist physisch, aber einige davon werden linear dem virtuellen Speicher zugeordnet.

verwandte Informationen