1

Тема: АГАТ, ты Plug and Play ?

Навеяно:

Агат аппаратно является p'n'p-машиной, никаких конфликтов прерываний или адресов у него не возникает, т.к. каждый слот имеет собственное адресное пространство (а прерываний вообще всего два на всю систему и те редко используются), но некоторым программам лень проверять конфигурацию (или у них есть ошибки в механнике p'n'p) и они предполагают, что работают на стандартном Агате:

Есть ярые поклонники этой теории, а есть серьёзные противники. А как на самом деле, Plug and Play или нет?

2

Re: АГАТ, ты Plug and Play ?

Сложность тут в том, что "Plug and Play" - это такой "народный" термин. Нет у него точного определения, поэтому каждый понимает под "Plug and Play" что-то свое. Отсюда и споры.

На мой взгляд, Агат "Plug and Play" машиной не является. Объясню почему.

1. Вообще, можно просто заглянуть в статью "Plug and Play" на википедии. Там, в качестве примера машины без "Plug and Play", приведен Apple ][. Агат не слишком отличается от Apple ][ в том, что касается плат расширения. Но статья довольно фиговая, поэтому идем дальше.

2. "Plug and Play" - это, вообще-то, название, использовавшееся компаниями Compaq, Phoenix и Intel для BIOS IBM PC-совместимых компьютеров. Сразу возникает вопрос, а Агат-то тут каким боком?
Это как раз тот случай, когда термин начал жить своей жизнью и применяться не по назначению.

3. Если попытаться разобраться, а что вообще такое "Plug and Play", то получается, что это название системы автоматического конфигурирования плат расширения для IBM PC. И, по хорошему, вопрос должен был бы звучать так:
Агат содержит систему автоматического конфигурирования плат расширения или нет?
Но это очень длинно и нудно :)

4. Чтобы понять, на что должен быть похож "настоящий" "Plug and Play", надо понять, в каких компьютерах система автоматического конфигурирования плат расширения была и с чем нужно сравнивать?
Такая система была в машинах IBM PS/2 с шиной MCA, в Макинтошах с шиной NuBus, в IBM PC с шиной PCI.

5. Что из себя представляет система автоматического конфигурирования плат расширения?

а) набор четких правил, как проектировать платы расширения. То есть, спецификация.

б) способ, позволяющий однозначно опознать платы расширения. Обычно это служебное ПЗУ, которое иногда подключается к специально выделенным контактам на плате. В результате BIOS, читая это ПЗУ, легко может определить, в какие разъемы установлены платы, какого типа эти платы (в спецификации указаны возможные классы устройств, например, контроллеры дисков, сетевые карты, модемы, звуковые платы и т.д.), какие платам нужны ресурсы (диапазоны адресов, диапазоны портов ввода-вывода, прерывания, запросы DMA).

в) наличие на плате расширения специальных регистров, позволяющих настраивать плату на определенные диапазоны адресов, портов ввода-вывода, прерываний, запросов DMA.

г) наличие поддержки в BIOS. Эта поддержка состоит в том, что при включении машины BIOS находит все платы расширения и распределяет между ними адреса, порты ввода-вывода, линии запроса прерываний и DMA. А потом вызывает их загрузочные ПЗУ. В результате машина начинает загрузку операционной системы с уже настроенными устройствами.

В результате, хотя BIOS ничего не знает про конкретные платы, он может от них получить всю нужную информацию и правильно их настроить.

6. Что из пункта 5 есть в Агате?

а) Спецификация есть, но не полная.

Хотя в техническом описании Агата есть много информации по шине, я не видел документов, которые бы описывали, как правильно писать код загрузочных ПЗУ и как пользоваться идентификаторами плат. Также неизвестно, что делает Монитор с платами расширения.


б) Способа однозначно опознать платы расширения нет.

Это можно было бы делать с помощью ПЗУ, но тут у Агата разброд и шатания. ПЗУ может быть, может не быть, и вообще, вместо него могут быть какие-то регистры. И чтобы понять, что это за плата, каждая Агатовская операционка обязательно содержит код для определения устройств.

Этот код пытается выяснять, есть ПЗУ или нет, и когда ему кажется, что ПЗУ нет, он что-то вслепую записывает в регистры платы и смотрит, как она на это реагирует. Это плохо, потому что когда мы что-то пишем в регистры платы, мы меняем ее состояние. Хорошо, если плата - это просто модуль ОЗУ. А если там станок с ЧПУ подключен и он неожиданно включится во время определения устройств?

Кроме того, такой код обязан знать про все возможные платы расширения. Иначе он какие-то платы не найдет, а какие-то неправильно настроит.

Кстати, такие же проблемы были у компьютеров с шиной ISA. Для Windows была создана целая система Legacy Plug and Play, которая так же тыкалась по регистрам. Всё это глючило и все ругали криворуких программистов Microsoft. Хотя надо было ругать инженеров IBM, которые не придумали способ опознавать платы :)

Но даже если ПЗУ на Агатовской плате расширения есть, то из него мало что можно узнать об устройстве. Например, ПЗУ контроллера 140К на семерке вообще никакой информации о самом контроллере не содержит. На девятке появилась система идентификаторов, по которой кое что можно понять. Но она используется своеобразно. Например, сетевая плата прикидывается контроллером НГМД.

Ну и никакой информации о нужных плате ресурсах из идентификатора получить нельзя.


в) Специальных регистров, позволяющих настраивать плату на определенные диапазоны адресов ввода-вывода у Агата нет

Мне сейчас возразят, что у каждого устройства в Агате диапазоны адресов жестко заданы, конфликтов между устройствами быть не может, поэтому и настраивать ничего не нужно.

Это не совсем так. Во-первых, не все слоты у Агата равноценны. Платы ДопОЗУ просто могут конфликтовать с основным ОЗУ при установке в неправильный слот.

Во-вторых, кроме адресов ввода-вывода есть адреса памяти, которые жестко заданы в платах расширения и изменить их нельзя. Например, к ПсевдоПЗУ можно обращаться только по адресам $D000-$FFFF. Перетащить его в какую-то другую область нельзя.

Во-третьих, устройств, которые могут вызвать конфликт, немного и эти устройства чаще всего в одном экземпляре.

Ну, например, представим Агат-7 с двумя модулями ПсевдоПЗУ. Оба используют диапазон адресов $D000-$FFFF. Теперь включим оба модуля. Из какого модуля будут читаться данные?

Либо возьмем плату принтера и плату цветовых палитр и загружаемого знакогенератора. Обе используют диапазон $C800-$CFFF, но по разному. Поэтому возможна ситуация, когда эта область будет выбрана у обеих плат. Точно не знаю, что получится, но вроде бы должны быть какие-то глюки на экране во время печати.

Наконец, предположим, что кто-то сделал для девятки графический адаптер, который использует адреса $8000-$BFFF и блокирует основное ОЗУ. Что будет с софтом, который работает со встроенным диспетчером памяти? Софт будет переключать страницы, думая, что там разные области ОЗУ, а адаптер будет подсовывать свое ОЗУ. Все сломается.

Кстати, если бы регистры для настройки в Агате были, то, например, в семерочном ПсевдоПЗУ не было бы никаких перемычек. Можно было бы все настроить программно.

Ну и отдельная проблема у Агата - прерывания. Линия запроса маскируемого прерывания одна. А теперь предположим, что у нас есть ЯЗС, плата Communication Extension for AGAT 7/9 и сетевая плата. Включаем прерывания на всех картах, а также штатные прерывания. Вызывается обработчик прерывания. Как определить, кто сгенерировал прерывание?

Контроллера прерываний нет. Никакого штатного механизма нет. Остается только дергать подряд все устройства и проверять, стоит там запрос прерывания или нет. Если, конечно, у платы есть порт, за который можно подергать.


г) Поддержки в BIOS, а точнее в ПЗУ Монитора почти никакой.

Как уже написал выше, любая Агатовская операционка обязана знать всё про все устройства. Монитор почти ничего не настраивает в платах расширения и ничем операционке не помогает.

Семерка вообще стартует с выключенными модулями ДопОЗУ и ПсевдоПЗУ. Монитор девятки вроде бы умеет настраивать модули ДопОЗУ при включении.

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