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


8

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. Ist es virtueller Speicher? Wäre es möglich, von einem Anwenderprogramm aus auf diese Speicheradressen zuzugreifen, um beispielsweise in die serielle Schnittstelle zu schreiben? Vielleicht mit Assembler?


1
Die Adressen in /proc/ioportssind überhaupt keine Speicheradressen, sondern Portadressen.
David Schwartz

3
ioportssind Adressen, die Geräteregistern zugeordnet sind. iomemsind Adressen, die physischen Speichern und Geräteregistern zugeordnet sind. X86 verwendet sowohl Ports als auch Mem-Adressen, um E / A auszuführen. Einige Prozessorarchitekturen (z. B. ARM) verwenden nur speicherabgebildete E / A.
Sägemehl

Antworten:


10

Auf welche Speicheradressen wird hier Bezug genommen. Ist es virtueller Speicher?

Ein Teil des Entwurfs des ersten IBM-PCs bestand darin, einige Speicheradressen für andere Zwecke als den tatsächlichen Speicher (wie er von Programmen und Daten verwendet wird) zu verwenden.

Im ersten IBM PC könnten Sie bis zu 640 KB RAM haben, aber die Chips könnten bis zu 1024 KB Speicher adressieren. Das Schreiben in Speicheradressen über 640 (und weniger als 1024) würde jedoch tatsächlich verwendet, um nicht mit RAM zu kommunizieren aber mit Geräten wie Plug-in-Grafikadaptern.

Dieses Konzept wird manchmal als speicherabgebildete E / A- oder speicherabgebildete Hardwaregeräte bezeichnet.

PC-Speicherkarte

E / A-Ports sind eine andere Art von adressierbarer Ressource in der IBM PC-Architektur. In den frühen Tagen haben Sie solche Adressen physisch auf Plug-in-Karten (ISA) konfiguriert, indem Sie "Jumper" verwendet haben, um die Adressierungsstifte auf der Karte zu verbinden. Sie können die Software auch so konfigurieren, dass übereinstimmende E / A-Adressen verwendet werden.

Eine alte ISA-Pararllel-Port-Karte

Die weiße Beschriftung links auf der Karte beschreibt, welche Jumperpositionen welche IO-Port-Adressen usw. angeben.

Heutzutage werden Adressierungsdetails beim Start des Systems von den Karten und dem Host-Computer dynamisch ausgehandelt und zugewiesen. Wir müssen sie nicht mehr konfigurieren.

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). Im Gegensatz dazu verhindern moderne Betriebssysteme im geschützten Modus, dass solche Vorgänge von einem Benutzerprogramm erfolgreich ausgeführt werden.


"Daher das Konzept der speicherabgebildeten Hardwaregeräte" - Sie scheinen dem IBM PC das Konzept der speicherabgebildeten HW zuzuschreiben. IIRC Der DEC PDP-8-Minicomputer um die 1960er Jahre hatte speicherabgebildete E / A.
Sägemehl

@sawdust: Ich habe diese Interpretation nicht beabsichtigt, ich werde sie zur Verdeutlichung umschreiben.
RedGrittyBrick

Was bedeuten die blauen Zahlen im Adressraumdiagramm? In meiner Mathematik entspricht 0xA000: 0000 2684354K anstelle von 640K.
Johannes Schaub - Litb

Es scheint, als wären sie Little-Endian-gerenderte Adressen für 16-Bit-Wörter. Der korrekte Zahlenwert ist "0x000A: 0000". Ich weiß nicht, warum geben sie die Adressen in Form einer In-Memory-Darstellung an?
Johannes Schaub - litb

Hm, was auch verwirrend ist, ist, dass die Bytes selbst auch bitumgekehrt angezeigt zu werden scheinen. Denn normale Little-Endian-Darstellung für diesen Wert wäre 0x00A0:0000. Warum wird es nicht als dargestellt 0x0A00:0000?
Johannes Schaub - litb

5

/proc/ioports listet Bereiche von E / A-Portadressen auf.

/proc/iomem listet Bereiche von physischen Speicheradressen auf.

Sie können durch Zuordnen direkt von einem Benutzerprogramm aus auf physische Speicheradressen zugreifen /dev/mem, möchten dies aber wahrscheinlich nicht. Sie können mit einem Benutzerprogramm direkt auf E / A-Ports zugreifen ioperm, möchten dies aber wahrscheinlich nicht. Im Allgemeinen möchten Sie wirklich im Kernel-Modus sein, um diese Art von Dingen auszuführen, da Sie beispielsweise Interrupts deaktivieren müssen.


0

Es ist physisch, aber einige von ihnen sind linear dem virtuellen Speicher zugeordnet.


@ David Natürlich. Mapping in das physische Gedächtnis macht nicht viel Sinn :-)
artistoex
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.