¿Qué tipo de direcciones de memoria son las que muestran proc/ioports y proc/iomem?

¿Qué tipo de direcciones de memoria son las que muestran proc/ioports y proc/iomem?

Siendo la salida de 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

y la salida de 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

No entiendo a qué direcciones de memoria se hace referencia aquí. ¿Es memoria virtual? ¿Sería posible acceder a estas direcciones de memoria desde un programa de usuario para, por ejemplo, escribir en el puerto serie? ¿Quizás usando ensamblador?

Respuesta1

a qué direcciones de memoria se hace referencia aquí. ¿Es memoria virtual?

Parte del diseño de la primera PC IBM fue utilizar algunas direcciones de memoria para cosas distintas a la memoria real (del tipo utilizado por programas y datos).

En la primera PC IBM, podía tener hasta 640 KB de RAM, pero los chips podían direccionar hasta 1024 KB de memoria; sin embargo, escribir en direcciones de memoria superiores a 640 (y menores a 1024) en realidad se usaría para comunicarse, no con la RAM. pero con dispositivos como adaptadores gráficos enchufables.

Este concepto a veces se denomina E/S asignada en memoria o dispositivos de hardware asignados en memoria.

mapa de memoria de la computadora

Los puertos IO son otro tipo de recurso direccionable en la arquitectura de PC de IBM. Al principio, dichas direcciones se configuraban físicamente en tarjetas enchufables (ISA) mediante el uso de "puentes" para conectar los pines de direccionamiento en la placa. También puede configurar el software para utilizar direcciones IO coincidentes.

Una antigua tarjeta de puerto paralelo ISA

Las letras blancas a la izquierda de la tarjeta describen qué posiciones de puente dan qué direcciones de puerto IO, etc.

Hoy en día, las tarjetas y la computadora host negocian y asignan dinámicamente los detalles de direccionamiento a medida que se inicia el sistema. Ya no tenemos que configurarlos.

¿Sería posible acceder a estas direcciones de memoria desde un programa de usuario para, por ejemplo, escribir en el puerto serie? ¿Quizás usando ensamblador?

Creo que sí, suponiendo que esté utilizando un sistema operativo que lo permita (por ejemplo, PC-DOS, un sistema operativo en modo real). Por el contrario, los sistemas operativos modernos en modo protegido impedirán que dichas operaciones se realicen correctamente desde un programa de usuario.

Respuesta2

/proc/ioportsenumera rangos de direcciones de puertos de E/S.

/proc/iomemenumera rangos de direcciones de memoria física.

Puede acceder a direcciones de memoria física directamente desde un programa de usuario mediante el mapeo /dev/mem, pero probablemente no quiera hacerlo. Puede acceder a los puertos de E/S directamente desde un programa de usuario con ioperm, pero probablemente no quiera hacerlo. Generalmente, realmente desea estar en modo kernel para hacer este tipo de cosas porque necesita hacer cosas como deshabilitar las interrupciones.

Respuesta3

Es físico, pero algunos de ellos están asignados linealmente a la memoria virtual.

información relacionada