2

Я использую Linux (Ubuntu). Для связи с устройствами ввода-вывода используются адреса портов ввода-вывода. Например, 0x378 - это адрес для параллельного порта.

Является ли адрес порта ввода-вывода фактическим адресом ОЗУ? Если это не так, где он находится?

3 ответа3

3

В корне IBM PC, в котором использовался микропроцессор 8088, для ОЗУ и ввода-вывода использовались отдельные адресные комнаты. Процессор 8088 поддерживал 20-битные адреса при доступе к ОЗУ, но использовал только 16-битные адреса для доступа к вводу-выводу. На процессоре был дополнительный вывод для сигнализации адресации RAM или IO.

Эта процедура называется сопоставлением портов ввода-вывода и все еще используется фактическими процессорами X64.

Таким образом, адрес 0x378 для параллельного порта не представляет адрес в ОЗУ.

1

Давайте представим, что процессор имеет только 4 контакта (бит) для адресации устройств. Это означает, что он может выбрать до 16 устройств, от 0000 до 1111.

Теперь подумайте, что адреса ОЗУ имеют значения от 0000 до 0111 (8 адресов, очень ограниченное ОЗУ), оставляя только 8 (от 1000 до 1111) для других устройств (жесткий диск, последовательный порт, порт USB, Ethernet, Wifi и т.д.).

То же самое происходит в очень больших масштабах на реальных процессорах, у них есть место для адресации всего оборудования, ограниченного физическими выводами на процессоре. Когда процессор запускается, BIOS распознает установленное оборудование и назначает адресное пространство для каждого из них.

В более старых системах, таких как DOS и Windows 3.1, он обычно устанавливался вручную с помощью файлов конфигурации, таких как autoexec.bat и config.sys, или с помощью DIP-переключателей и перемычек непосредственно на оборудовании. Современные системы делают это динамически с помощью таких механизмов, как PCI и PCI Express.

1

Это зависит не от ОС, а от процессора. И ответ зависит от семейства процессоров.

На x86 (AMD/Intel) ответ НЕТ. Пример порта, который вы приводите, типичен для компьютеров x86, и по длине (16 бит) видно, что это не адрес ОЗУ 32 или 64 бита. В x86 есть специальные инструкции для связи с портами ввода-вывода, и эти инструкции ввода-вывода знают, что адреса ввода-вывода 16-битные.

На чипах ARM, которые вы можете найти в своем телефоне, адреса портов ввода-вывода находятся в том же диапазоне адресов, что и ОЗУ (но, очевидно, по разным адресам). Чип ARM использует один и тот же тип инструкций для чтения портов ввода-вывода и памяти, поэтому в обоих случаях вам нужен 32-битный адрес.

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