К чему подключается адрес порта 0x80?

При отправке команды и чтении данных с определенного чипа, скажем, RTC, в разных документах говорится, что мы должны подождать некоторое время перед чтением с устройства, чтобы убедиться, что данные доступны. Многие фрагменты кода делают фиктивное чтение из порта 0x80. Я хотел узнать, к какому устройству подключено это адресное расположение, если оно есть. Я говорю об архитектуре ПК IA-32.


person phoxis    schedule 22.07.2011    source источник
comment
Использование в ядре Linux 4.2: github. com/torvalds/linux/blob/v4.2/arch/x86/boot/boot.h#L78   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 30.09.2015
comment
На что сопоставляется каждый порт: stackoverflow.com/questions/14194798/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 30.10.2015


Ответы (3)


Порт ввода-вывода 0x80 традиционно используется для POST-кодов. (POST = самотестирование при включении питания)

Пока система загружается, BIOS выводит серию отладочных кодов на порт ввода-вывода 0x80. Они предназначены для отладки незагружающейся системы.

В большинстве настольных ПК вы можете установить плату отладки кода POST, которая представляет собой небольшую плату слота PCI (или ISA), которая декодирует записи ввода-вывода в порт ввода-вывода 0x80 и отображает значение с помощью 7-сегментных светодиодов.

Доска почтового индекса PCI

Обычно POST-коды мигают очень быстро. Однако, если ваша система зависает во время загрузки, вы можете увидеть, какой был последний код POST, и использовать эту информацию для устранения неполадок в системе.

Этот сайт содержит список стандартных POST-кодов для большинства BIOS. Однако производители компьютеров/материнских плат могут вводить свои собственные POST-коды, поэтому список не является исчерпывающим на 100%.

После того, как система начала загружать операционную систему, POST-коды не очень важны. Тем не менее, некоторые поставщики ОС могут использовать платы кода POST в качестве инструмента отладки, особенно для мест в коде, где функция printf() может быть нецелесообразной (например, подпрограммы обслуживания прерываний).

Некоторые операционные системы будут использовать чтение и запись в порт ввода-вывода 0x80 в качестве механизма задержки. Если вам нужно подождать несколько микросекунд, пока что-то завершится, может быть нецелесообразно использовать полномасштабные таймеры sleep() или delay(), поэтому выполнение «фиктивного» чтения/записи на «безопасный» адрес ввода-вывода легковесное решение. Чтение и запись в 0x80 в основном гарантированно не повлияют на работу системы, поэтому это хороший выбор для таких фиктивных операций.

Вы обнаружите, что со многими старыми/более медленными периферийными устройствами (такими как ваш чип RTC) иногда необходимо подождать несколько мкс, чтобы операция записи ввода-вывода «вступила в силу». Фиктивный доступ к 0x80 — удобный способ сделать это.

Вы также можете найти код, который делает фиктивную запись в 0x80, чтобы «очистить» шину от любых электрических «эхо». На некоторых платформах можно записать значение в неиспользуемый/недействительный адрес ввода-вывода, прочитать обратно с этого адреса и увидеть значение, которое вы только что написали, даже если на самом деле по этому адресу нет аппаратного обеспечения. . Однако, если вы выполняете фиктивную запись на другой адрес между ними (скажем, порт ввода-вывода 0x80), вы можете защититься от этого.

person myron-semack    schedule 22.07.2011
comment
Добавление к ответу: intel.com/support/motherboards/desktop /sb/CS-025434.htm - person phoxis; 05.01.2013
comment
@phoxis Обратите внимание, что перечисленные вами коды уникальны для материнских плат Intel на основе их прошивки EFI. Этот список может не относиться к другим материнским платам. - person myron-semack; 07.01.2013
comment
Да, я хотел сказать, что мы можем использовать порт для фиктивных операций чтения и записи, чтобы ввести небольшую задержку. - person phoxis; 07.01.2013


введите здесь описание изображения

Вы можете писать (и читать) в (из) порт 0x80, используя этот код в драйвере ядра:

(Обратите внимание, что на некоторых ПК, таких как мой, в этом месте находится слово WORD, поэтому в него можно записать 16 бит.)

Пример драйвера для Windows:
__outword(0x80, 0x00A0);

Это также может быть использовано для отладки ядра в тех случаях, когда у вас нет системы отладки с двумя машинами и вы не можете использовать трассировки отладки по какой-либо причине (например, система зависает). Порт 80 может хранить для вас ваш последний отладочный код.

person Sharon Katz    schedule 10.10.2017