При отправке команды и чтении данных с определенного чипа, скажем, RTC, в разных документах говорится, что мы должны подождать некоторое время перед чтением с устройства, чтобы убедиться, что данные доступны. Многие фрагменты кода делают фиктивное чтение из порта 0x80
. Я хотел узнать, к какому устройству подключено это адресное расположение, если оно есть. Я говорю об архитектуре ПК IA-32.
К чему подключается адрес порта 0x80?
Ответы (3)
Порт ввода-вывода 0x80 традиционно используется для POST-кодов. (POST = самотестирование при включении питания)
Пока система загружается, BIOS выводит серию отладочных кодов на порт ввода-вывода 0x80. Они предназначены для отладки незагружающейся системы.
В большинстве настольных ПК вы можете установить плату отладки кода POST, которая представляет собой небольшую плату слота PCI (или ISA), которая декодирует записи ввода-вывода в порт ввода-вывода 0x80 и отображает значение с помощью 7-сегментных светодиодов.
Обычно POST-коды мигают очень быстро. Однако, если ваша система зависает во время загрузки, вы можете увидеть, какой был последний код POST, и использовать эту информацию для устранения неполадок в системе.
Этот сайт содержит список стандартных POST-кодов для большинства BIOS. Однако производители компьютеров/материнских плат могут вводить свои собственные POST-коды, поэтому список не является исчерпывающим на 100%.
После того, как система начала загружать операционную систему, POST-коды не очень важны. Тем не менее, некоторые поставщики ОС могут использовать платы кода POST в качестве инструмента отладки, особенно для мест в коде, где функция printf() может быть нецелесообразной (например, подпрограммы обслуживания прерываний).
Некоторые операционные системы будут использовать чтение и запись в порт ввода-вывода 0x80 в качестве механизма задержки. Если вам нужно подождать несколько микросекунд, пока что-то завершится, может быть нецелесообразно использовать полномасштабные таймеры sleep() или delay(), поэтому выполнение «фиктивного» чтения/записи на «безопасный» адрес ввода-вывода легковесное решение. Чтение и запись в 0x80 в основном гарантированно не повлияют на работу системы, поэтому это хороший выбор для таких фиктивных операций.
Вы обнаружите, что со многими старыми/более медленными периферийными устройствами (такими как ваш чип RTC) иногда необходимо подождать несколько мкс, чтобы операция записи ввода-вывода «вступила в силу». Фиктивный доступ к 0x80 — удобный способ сделать это.
Вы также можете найти код, который делает фиктивную запись в 0x80, чтобы «очистить» шину от любых электрических «эхо». На некоторых платформах можно записать значение в неиспользуемый/недействительный адрес ввода-вывода, прочитать обратно с этого адреса и увидеть значение, которое вы только что написали, даже если на самом деле по этому адресу нет аппаратного обеспечения. . Однако, если вы выполняете фиктивную запись на другой адрес между ними (скажем, порт ввода-вывода 0x80), вы можете защититься от этого.
Эти фиктивные чтения реализуют задержку; из мини-HOWTO по программированию портов ввода/вывода Linux< /а>эм>:
Макросы
inb_p()
,outb_p()
,inw_p()
иoutw_p()
в остальном работают так же, как и выше, но они делают дополнительную короткую (около одной микросекунды) задержку после доступа к порту; вы можете сделать задержку около четырех микросекунд с помощью#define REALLY_SLOW_IO
перед тем, как вы#include <asm/io.h>
.Эти макросы обычно (если вы
#define SLOW_IO_BY_JUMPING
, что, вероятно, менее точно) используют вывод порта на порт0x80
для их задержки, поэтому вам нужно сначала предоставить доступ к порту0x80
сioperm()
(выводы на порт0x80
не должны влиять на какую-либо часть системы). ). Чтобы узнать о более универсальных методах отсрочки, читайте дальше.
Вы можете писать (и читать) в (из) порт 0x80, используя этот код в драйвере ядра:
(Обратите внимание, что на некоторых ПК, таких как мой, в этом месте находится слово WORD, поэтому в него можно записать 16 бит.)
Пример драйвера для Windows:
__outword(0x80, 0x00A0);
Это также может быть использовано для отладки ядра в тех случаях, когда у вас нет системы отладки с двумя машинами и вы не можете использовать трассировки отладки по какой-либо причине (например, система зависает). Порт 80 может хранить для вас ваш последний отладочный код.