К чему подключается адрес порта 0x80? - PullRequest
9 голосов
/ 22 июля 2011

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

Ответы [ 3 ]

14 голосов
/ 23 июля 2011

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

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

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

PCI Post Code board

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

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

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

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

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

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

3 голосов
/ 10 октября 2017

enter image description here

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

(Обратите внимание, что на некоторых компьютерах, таких как мой, в этом месте есть СЛОВО, поэтому в него можно записать 16 бит).

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

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

2 голосов
/ 22 июля 2011

это должна быть задержка;например, прочитайте

> The inb_p(), outb_p(), inw_p(), and outw_p() macros work otherwise
> identically to the ones above, but they do an additional short (about
> one microsecond) delay after the port access; you can make the delay
> about four microseconds with #define REALLY_SLOW_IO before you
> #include <asm/io.h>. These macros normally (unless you #define
> SLOW_IO_BY_JUMPING, which is probably less accurate) use a port output
> to port 0x80 for their delay, so you need to give access to port 0x80
> with ioperm() first (outputs to port 0x80 should not affect any part
> of the system). For more versatile methods of delaying, read on.

из здесь

...