7

Будучи выводом команды 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

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

3 ответа3

10

какие адреса памяти упоминаются здесь. Это виртуальная память?

Часть дизайна первого IBM PC состояла в том, чтобы использовать некоторые адреса памяти для вещей, отличных от фактической памяти (типа, используемого программами и данными)

На первом IBM PC вы могли иметь до 640 КБ ОЗУ, но чипы могли адресовать до 1024 КБ памяти, однако запись в адреса памяти выше 640 (и менее 1024) фактически использовалась бы для связи не с ОЗУ но с такими устройствами, как подключаемые графические адаптеры.

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

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

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

Старая пара-портовая карта ISA

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

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

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

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

5

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

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

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .