Библиотека Интернет Индустрии I2R.ru |
|||
|
Бывают ли "железные" PCI модемы и нужны ли им драйверы под Windows?Эта статья продолжает цикл, начатый нами ранее, призванный познакомить заинтересованных читателей с малоизвестными особенностями работы модемов. В ней мы попробуем рассказать об особенностях реализации последовательных портов у модемов вообще, и об особенностях реализации внутренних модемов нового поколения, предназначенных для работы на шине PCI. Сначала о том, как работают классические внешние модемы. Если у Вас внешний модем, то Вы подключаете его к компьютеру через разъем последовательного порта ("COM"-порта). При этом модем - снаружи, порт - внутри. Будем считать для простоты, что внутри порт подключен к шине ISA. Во времена 386-ых машин так и было на самом деле: внутри компьютера, в разъеме ISA-шины стояла карта "multi I/O", на которой был реализован, среди прочего, COM порт. Разъем от порта выходил на корпус компьютера, туда и включался внешний модем. Каждый COM-порт, с точки зрения программ внутри компьютера, представляется набором последовательно расположенных регистров-портов в пространстве ввода-вывода процессора, к которым программы имеют доступ для чтения/записи передаваемых данных, конфигурации параметров COM-порта, чтения состояния порта. Поскольку эти регистры-порты располагаются друг за другом в фиксированной последовательности, обычно говорят только об адресе первого из них, т.е., базовом адресе для всего блока регистров. Он называется "базовым адресом COM порта". Кроме того, каждый COM-порт может генерировать одно прерывание для центрального процессора, предназначенное для сигнализации программе о том, что порт завершил исполнение той или иной операции. В компьютере может присутствовать несколько COM-портов, при этом для их бесконфликтной работы необходимо, чтобы они использовали разные адреса портов в пространстве ввода-вывода и разные линии прерываний. До создания технологии "Plug'n'Play" ответственность за правильную конфигурацию адресов портов и линий прерываний целиком лежала на пользователе, устанавливавшего новую плату в компьютер. Базовый адрес COM порта задавался переключателями на мультикарте, и был, как правило, выбором 1 из 4 стандартных адресов для портов COM1..COM4, соответственно: 3F8h, 2F8h, 3E8h, 2E8h. Поскольку, согласно спецификации, устройства на ISA шине, работающие в пространстве ввода-вывода, могут, в целях упрощения, проверять лишь младшие 10 разрядов адреса (хотя, на самом деле, ничто не мешает им проверять все 16 разрядов), эти же порты откликались и по адресам типа 13F8h, 23F8h, E3F8h и т.п. Это приводило к конфликтам с некоторыми видеоадаптерами, например, популярного семейства S3, поскольку те использовали в собственных нуждах именно старшие зеркальные отображения от адреса 2E8h, принадлежащего COM4. Когда мы создавали наш ISA-модем, мы сделали проверку всех 16 разрядов адреса, и многолетняя практика показала, что конфликтов не возникает ни с чем. Мы не встречали такой материнской платы, на которой бы при работе с портами на шину выдавалось лишь 10 битов адреса, поэтому можно со значительной степенью уверенности утверждать, что такая рекомендация - это лишь некое послабление разработчикам периферийных устройств. Номер линии прерывания порта также задавался переключателями, и, как правило, выбор был небольшим. По умолчанию считается, что прерывания порты COM1..COM4 используют соответственно 4,3,4,3. То есть, COM2 и COM4 разделяют IRQ3, а COM1 и COM3 разделяют IRQ4. Поскольку во времена, когда PS/2 мышек еще не было, и мышка обычно подключалась к COM1, модем можно было поставить или на COM2 или на COM4 или выбрать для него нестандартное прерывание, что понимали далеко не все программы. Характерно, что даже сегодня, если Вы загляните в настройки Setup'а Вашей материнской платы, то выбор возможных адресов и прерываний для COM портов, расположенных на плате, будет все тем же самым. Теперь рассмотрим, что мы имеем с внутренними ISA модемами. Сделаны они весьма оригинально - как сумма внешнего модема и мультикарты! То есть, на модемной плате собран сам модем, затем его COM порт, которым он бы во внешнем исполнении подключался к мультикарте, как описано выше, а затем "кусок" мультикарты, выходящей на шину ISA, с еще одним портом. Причем на некоторых модемах это сделано совершенно дословно: например старые, 14400 Спортстеры, были сделаны именно как внешний Спортстер, и классический последовательный порт, выходящий на шину ISA. Если плату такого модема условно разрезать, и поставить в разрыв буферы-переходники на 12 вольт, то ее модемную часть можно легко подключить к обычной мультикарте, а к оставшейся портовой части можно подключить мышку. И то и другое будет работать! Такой подход имеет несомненный плюс - полную совместимость. Поскольку на модеме стоит "честный" последовательный порт, то ведет он себя в точности так же, как и мультикарта. Включая задержки, ошибки, определение скорости и т.п. А недостатков - два. Во-первых, это довольно дорогое решение, а во-вторых - максимальная скорость ограничивается 115200 бит/с. С некоторых пор производители модемов начали ставить вместо двух портов один двунаправленный эмулятор порта. То есть, с точки зрения машины он выглядит как порт, а с точки зрения модема - неважно как, поскольку это внутреннее дело производителя модема. Главная особенность такого порта - неограниченная скорость обмена. Если не принимать специальных мер, можно получить скорость работы такого порта килобайт 500 в секунду вместо 11 килобайт для классического порта. Поскольку именно такой эмулятор мы и поставили на наш внутренний модем HTS Express Xs12, то могу по своему опыту сказать, что не все тут так просто. С одной стороны, такой порт - это истинное счастье для тех, кто любит обновлять прошивки в модеме, кто ходит по Интернету, и для тех, кому требуются всякие дополнительные возможности вроде сбора онлайн-статистики. Но, с другой стороны, выяснилось, что качество драйверов известной фирмы, написавшей все популярные ныне операционные системы, оставляет желать лучшего. Например, у DOS окна под Win98 просто "крышу срывает", если из модема с огромной скоростью приходит всего какой-нибудь килобайт текстового сообщения. То, что получает пользователь в своей терминальной программе, есть лишь жалкие остатки того, что посылал ему модем. Некоторые FOSSIL-драйверы при работе под DOS теряют данные, если они идут с такой скоростью, поскольку неправильно работают с аппаратным управлением потоком - они забывают, что надо проверить состояние сигнала CTS перед посылкой очередного байта и спокойно засылают в модем десятки килобайт того, что лежит у них в буфере, несмотря ни на какие попытки модема этому сопротивляться. Были отмечены проблемы с Linux'ом, но подробности нам неизвестны, поскольку информация эта со слов наших пользователей. И, наконец, верхом чудес программирования можно признать программу RapidCommVoice старых версий, авторы которой, вероятно, так и не разобрались, как работает COM порт, а потому вместо управления потоком подбирают по таймеру скорость передачи байт в модем так, чтобы она совпала с физической скоростью работы порта! В общем, все это заставило нас и, насколько нам известно, других производителей модемов с эмуляторами порта принудительно ограничивать скорости передачи до уровней, сходных со скоростью работы настоящих портов. Как показала практика, это полностью устранило все проблемы такого рода с драйверами и программами. Правда, нам удалось сделать все же намного более быстрый COM порт, на уровне 20-30 килобайт в секунду. Между тем, объективно ведь порт, ограниченный скоростью 115200 - вредно! Во-первых, чем быстрее идут данные, и чем больше по размеру блок данных, тем меньше возникает накладных расходов в системе, поскольку за одно прерывание (переключение контекста, приостановку задач и т.п.) драйвер может получить/принять больше данных, и, стало быть, таких переключений в системе будет намного меньше. Во-вторых, почему-то ходит мнение, что протокол V.42Bis упаковывает данные в 4 раза. Это не так. Алгоритм компрессии, применяемый протоколом V.42Bis, конечно же, уступает по эффективности в большинстве случаев алгоритмам популярных программ-архиваторов вроде PkZip, но файл из одних "пробелов" или нулей он может сжать и в 10 раз, и больше. Так же как и файл с большим числом одинаковых подстрок. Скорость 33600 бит/с протокола V.34 соответствует примерно 4000 с небольшим байтам в секунду для упакованного потока (поскольку байты передаются без старт и стоп битов, блоками достаточно большого размера, и накладные расходы протокола канального уровня V.42 в этом случае не очень заметны). Даже четырехкратная распаковка даст уже 16 килобайт в секунду, в то время как скорость работы порта 115200 бит/с - это только 11 килобайт/c (при передаче через последовательный порт каждый 8-битовый байт обрамляется дополнительно старт-битом и стоп-битом, поэтому скорость в байтах рассчитывается как 115200/10). Несложно посчитать, что будет на протоколе V.90. Также несложно посчитать, что даже удвоение скорости COM порта делу не поможет. Надо больше. Конечно, обычно www-страницы гораздо дольше читают, чем скачивают, а то, что скачивают не для чтения, а в архив, обычно запаковано, но идея остается прежней - аппаратный эмулятор COM порта не мешает работе модема, а настоящий COM порт, хоть это внутренний модем, хоть внешний - мешает. Но вот пришло время производителям сделать что-то и для PCI шины. Казалось бы, что проще - взять тот же эмулятор порта, и вывести из него сигналы для работы на PCI. Но тут есть одна принципиальная проблема: на PCI шине производитель не может фиксировать адреса устройства! Если на шине ISA производитель ставил дешифратор адреса, который реагировал на некий диапазон адресов, задаваемых перемычками на плате, а пользователь прописывал этот диапазон адресов в настройки операционной системы (или же система искала его сама методом перебора), то на шине PCI все иначе. Кроме пространства памяти и пространства ввода/вывода, на шине PCI есть еще пространство конфигурации. Причем, в отличие от двух первых, сигналы управления им разведены не в виде шины, а на каждый PCI слот отдельно. Именно поэтому не все равно, в какой именно слот Вы включили Ваше PCI устройство. Например, если Вы переставите Вашу сетевую карту из одного слота в другой (соседний), то Windows найдет ее еще раз, и это будет уже другой, второй по счету, сетевой картой в системе. Все это сделано для того, чтобы реализовать известный принцип Plug'N'Play, то есть освободить пользователя от необходимости вручную распределять адреса и линии прерывания на устройствах, и затем прописывать это в систему. Когда Вы включаете компьютер, то PCI BIOS сам сканирует пространства конфигурации всех слотов, находит, что там стоит (всякое PCI устройство обязано по запросу выдавать свой класс, подкласс, перечень требуемых ему адресных окон, прерываний и т.п.), после чего распределяет все адресное пространство между устройствами. Так же происходит и распределение прерываний. Причем, как правило, если на распределение адресов Вы не можете влиять никак, то прерывания в большинстве материнских плат можно назначить буквально руками: просто выбрать, для какого PCI слота какое именно прерывание использовать. Или уж, по крайней мере, ограничить список прерываний, которые будут использоваться для PCI устройств. Еще многие материнские платы спрашивают тип загружаемой операционной системы. Это делается для того, чтобы вообще не инициализировать второстепенные контроллеры на PCI до загрузки системы, чтобы она сама их распределила, как ей "нравится". Но, так или иначе, про расположение COM портов на привычно-стандартных адресах и линиях прерываний на шине PCI можно забыть навсегда, во всяком случае, в рамках ныне действующего стандарта и практики его реализации в материнских платах. Что с этим делать? Ведь если, несмотря ни на что, выпустить модем с PCI COM портом, то ни одна DOS программа сама с ним работать не сможет. Как минимум, Вы должны будете прописать ей руками адрес этого порта и номер линии прерывания. Причем, если номер линии прерывания обычно еще пишется BIOS'ом после самотестирования компьютера в табличке, то адрес вообще непонятно откуда брать. Но на самом деле понятно. Есть так называемый интерфейс упомянутого выше PCI BIOS'а, через который можно не только получить адрес на шине любого PCI устройства, но даже и поменять его. Для нашего модема HTS Express был в свое время написан оптимизированный для работы на 386 машинах драйвер FOSSIL (называется HtFossil, лежит на http://www.hts-spb.com). Ради интереса, мы добавили туда недавно автоматический поиск таких портов на шине PCI, и это замечательно работает: порт находится, определяется его адрес и линия прерывания, после чего FOSSIL работает с ним так же, как и с любым ISA'шным. Но что делать со стандартными DOS программами, в половине которых можно лишь выбрать порт по номеру 1..4 или в лучшем случае выбрать адрес из списка, а в оставшейся половине - нельзя ввести адрес больше чем 3FFh, в то время как PCI BIOS норовит "засунуть" порт куда-нибудь в B000h? Очевидно, что ничего с этим не сделать, кроме как что заставить работать такую программу через FOSSIL, в котором можно прописать все требуемые параметры. Если же такую программу невозможно заставить работать через FOSSIL, то остается пытаться переконфигурировать адрес PCI COM порта под стандартное значение, о чем подробнее будет рассказано ниже. Сказанное выше про возможность работы под ДОС относится только к полным аппаратным модемам. Однако, в природе существуют и другие устройства, которые тоже можно вставить в PCI-слот и которым производитель предписал играть роль модема. Hа фоне отсутствия достаточной информации по проблеме DOS-PCI-модем, а также намеренно вводя пользователей в заблуждение ("Hе может работать под ДОСом ни один PCI-модем!"), ряд заинтересованных производителей и поставщиков продолжает проталкивать в массы изрядно дискредитировавшую себя идею WinModem'a. Некоторые из этих производители и вовсе отказываются от создания полных PCI модемов, предпочтя выпускать вместо них WinModem'ы. Что такое WinModem? Это половина модема. Та половина, которая демодулирует сигнал из линии. Та, что пищит, набирает номер, и т.п. А второй половины - той, что разбирает команды, корректирует ошибки (V.42), запаковывает/распаковывает данные (V.42bis), и реализует все вспомогательные функции, в модеме попросту нет. Ее отрезали вместе с той аппаратурой, которая ей занималась. Идея, прямо скажем, не нова. Много лет назад были попытки осчастливить публику модемами WinRPI, и даже софт-модемами (у которых отрезано не половина, а 3/4 схемы, включая и собственно обработку сигнала), но эти попытки успешно провалилась - пользователь просто проголосовал ногами. Те же "счастливые" обладатели, которые успели купить подобные устройства, навсегда запомнили, что такое поиск драйвера от своего WinRPI для какой-нибудь новой операционной системы, например Win95. Зачем нужен драйвер? А затем, что отрезанную половину функций все же нужно где-то реализовать. Вот ее и реализовали в драйвере. То есть, часть модема - в железе, часть - в драйвере. И без соответствующего драйвера такое железо совершенно бесполезно. Сделано это все ради удешевления, и это единственная причина. Поскольку за модемную железку клиенту платить нужно, а за полсотни килобайт ОЗУ в его компьютере он уже заплатил, когда компьютер покупал. То же касается и нескольких процентов его быстродействия. Подробнее на IXBT |
|
2000-2008 г. Все авторские права соблюдены. |
|