Какие типы адресов памяти отображаются в 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 КБ ОЗУ, но чипы могли адресовать до 1024 КБ памяти, однако запись в адреса памяти выше 640 (и ниже 1024) фактически использовалась для связи не с ОЗУ, а с такими устройствами, как подключаемые графические адаптеры.

Эту концепцию иногда называют отображенным в памяти вводом-выводом или аппаратными устройствами с отображением в памяти.

Карта памяти ПК

Порты ввода-вывода — еще один тип адресуемых ресурсов в архитектуре IBM PC. Раньше вы физически настраивали такие адреса на платах расширения (ISA), используя «перемычки» для соединения адресных контактов на плате. Вы также могли настроить программное обеспечение для использования соответствующих адресов ввода-вывода.

Старая карта ISA с параллельным портом

Белые буквы на левой стороне платы описывают, какие положения перемычек соответствуют каким адресам портов ввода-вывода и т. д.

В настоящее время детали адресации согласовываются и назначаются динамически картами и хост-компьютером при запуске системы. Нам больше не нужно их настраивать.

Можно ли получить доступ к этим адресам памяти из пользовательской программы, например, для записи в последовательный порт? Может быть, с помощью ассемблера?

Я полагаю, что да, предполагая, что вы используете операционную систему, которая это допускает (например, PC-DOS, ОС реального режима). Напротив, современные ОС защищенного режима предотвратят успешное выполнение таких операций из пользовательской программы.

решение2

/proc/ioportsперечисляет диапазоны адресов портов ввода-вывода.

/proc/iomemперечисляет диапазоны адресов физической памяти.

Вы можете получить доступ к физическим адресам памяти напрямую из пользовательской программы с помощью отображения /dev/mem, но вы, вероятно, не хотите этого делать. Вы можете получить доступ к портам ввода-вывода напрямую из пользовательской программы с помощью ioperm, но вы, вероятно, не хотите этого делать. Как правило, вы действительно хотите находиться в режиме ядра, чтобы делать такие вещи, потому что вам нужно делать такие вещи, как отключение прерываний.

решение3

Они физические, но некоторые из них линейно отображаются в виртуальную память.

Связанный контент