Как стать автором
Обновить

Комментарии 21

Чисто технически команда OUT выдает на шину адреса номер порта, а на шину данных сами данные. И адреса портов это не память, поэтому адрес порта может увеличиваться на единицу, а данные могут быть любого размера.Там нет никакого инкремента адреса, поэтому непонятно откуда взялся порт 84, точнее ваше предположение скорее всего неправильно насчет этого порта. Возможно баг в самом устройстве. Да и непонятно как устройство дожно на это все реагировать. Вообще было бы интересно докопаться до истинной причины.
впоследствии это место оформили так:
out 83h,al
mov al,0
out 84h,al ; подсказка свыше
Я уже открыл документацию по контроллеру. Хотя по документации номер порта четный — это адрес, а нечетный — счетчик. А у вас нечетные порты — адрес. возможно четные — количество. Там возможно специально сделали, чтобы за одну команду можно было грузить как адрес так и количество. Или это баг, превратившийся в фичу. :)
впоследствии это место оформили так:
out 83h,al
mov al,0
out 84h,al; подсказка свыше


Что то сомневаюсь, скорее всего так:
out 83h,al; запись первого байта — мл. часть адреса
mov al,0
out 83h,al; запись второго байта — ст. часть адреса

Цитата из даташита:


Собственно out dx,ax мог сработать если система была на 8088, там шина данных восьмибитная и ввод/вывод 16-ти бит шел в два захода.
у меня 2 гипотезы:
1) эта запись вызывала задержку на шине, которая для чего то была необходима — проверка — записать в какой-то другой порт.
2) это мало документированная фича для работы с адресами выше 16МБ, где адрес 24-бита уже недостаточно.
docs.freebsd.org/doc/3.4-RELEASE/usr/share/doc/handbook/dma.html
A new implementation of the 8237, called the 82374, allows 16 bits of page register to be specified, allows access to the entire 32 bit address space, without the use of bounce buffers.
НЛО прилетело и опубликовало эту надпись здесь
Судя по тому, что про порт 84h ничего не известно в документации, то возможной причиной могло быть разница в задержке выполнения инструкции? То есть out dx, ax выполняется дольше, и за счет этого дальнейший код не отрабатывает раньше положенного.
Коллеги, начиная с адреса 80H в архитектуре PC сидит «страничный регистр». Контроллеры DMA i8237A в AT-шке сидят на адресах 00H (совместим с XT-шкой) и C0H (есть только в AT, обслуживает DMA 4..7). Проблема в том, что i8237A может обслуживать только сегмент 64К. Для переключения сегментов (в этом месте используют термин «страница») нужен регистр страниц. В IBM PC AT 5170 он сделан на микросхеме 74LS612, а в IBM PC XT 5160 — на микросхеме 74LS670. В чипсетах — их функциональные копии.
wiki.osdev.org/DMA
aodfaq.wikidot.com/pc-dma-addressing
и книжки Mindshare «ISA System archeticture» и «EISA System architecture» в помощь.

А почему это DMA устаревшая технология? Живее всех живых.

И как часто вы её встречаете?
Вы не поверите, но весь дисковый обмен в Вашем компьютере идет через DMA
Не только дисковый. Сетевая карта, звук идут через DMA. Пересылки данных между основной памятью и видеопамятью идут через DMA.

Сейчас даже в 8-битные микроконтроллеры встраивают контроллеры DMA.

Пракически любые задачи предполагающие асинхронный обмен данными с IO, например, компилируютсятся в инструкции с использованием этой технологии.


То есть большая часть всех callbacks или случаев использования async/await в коде

А вот это уже мимо. Использовать или не использовать DMA — решает ОС (и, как правило, решает использовать); это решение не зависит от используемого API.

Лично лицом к лицу — не встречаю. У меня производительности не хватает на осцилографе отслеживать всё, что по PCI-E летает.


А внутри компьютера — практически всё. И вне компьютера тоже (RDMA).

Автор, скажите, а что это была за система? Часом не Arvid?
Нет. Это была специализированная система передачи данных по формату телетекста.
тв информ?
Теперь, в эпоху Интернета, доступа к электронным библиотекам и компьютерным форумам, наверное, несложно докопаться, что именно делала запись нуля в неведомый мне порт 84Н. Но это уже неинтересно

действительно, кому на хабре могут быть интересны технические подробности

А откуда вдруг вообще взялся порт 84h?
Обе команды — что out 83h, al, что out 83h, ax — выводят в один и тот же порт 83h, только первая выводит байт, а вторая — слово. Что находится в верхнем байте на шине данных, когда выводится один байт — надо смотреть в документацию (но судя по тому, что явный вывод целого AX дал рабочий вариант, а без него — нет) — там явно какой-то мусор (может, защёлкнутый байт от предыдущей команды)

Насколько помню, без явной команды out 84h,al и al=0 так ничего и не работало.
Задержки (первое, на что подумали) не влияли. И out 84,al могло быть впереди out 83h,al — работало нормально, как и обращение наоборот.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории