Что такое JavaDive

JavaDive - это набор методов, который позволяет апплетам получить доступ к портам ввода-вывода IBM PC, а также к портам COM и LPT. Эти методы пригодятся разработчикам приложений для работы с "железом", подключенным к IBM PC через разъемы расширения и порты COM/LPT.

Для чего это было сделано

Эти методы были разработаны для производственной установки, которая "выращивает" пластмассовые детали из жидкого полимера. Такие машины позволяют создавать заготовки для различных приборов, они используются в медицине, криминалистике и других областях.
Чтобы сделать ее проще, все устройства - микропроцессоры, АЦП и другое "железо", - подключили к обычному IBM PC через разъемы расширения. Работать с ними предстояло через порты ввода-вывода и COM/LPT. Также требовалось сделать хорошую оболочку для управления машиной - приложение, которое могло бы работать без сбоев несколько недель подряд.

Оболочка

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

Работа с устройствами

Обычно для доступа к портам пишется драйвер, который загружается вместе с операционной системой и работает "во втором кольце защиты" процессора Intel, так что ему позволено больше, чем обычным приложениям, работающим во внешнем, "третьем" кольце.
Может ли обычное приложение работать так же, как драйвер? В OS/2 это оказалось возможным. Я нашел маленькую DLL, которая позволяет обычному приложению "нырнуть" во второе кольцо и вернуться обратно. Таким образом, работать с устройствами в OS/2 не составляет труда - надо только установить эту DLL, и все.
Кстати, написана она на чистом Ассемблере и занимает примерно 700 байт. Сделал ее наш крутой хакер Ринат Садретдинов. Вот что он пишет:
Библиотека IOPL32.DLL предназначена для тех, кому необходим доступ к сегментам с привилегией IOPL из 32-х битных приложений. Безусловно, это было решаемо и раньше путем организации т.н. "Thunks" из 32-х битного сегмента кольца 3 в 16-ти битный сегмент кольца 3 и последующим дальним вызовом процедуры в другом 16-ти битном сегменте кольца 2, обладающем уровнем IOPL, но это не всегда удобно по нескольким причинам. Посему мною была написана библиотека IOPL32.DLL, которая делает все это самостоятельно.
Ринат распространяет свою DLL свободно, поэтому я смог ее использовать и подключить к своему апплету.

Доступ к портам в Яве

Чтобы работать с "железом" в апплете, был разработан класс Dive, который содержит хорошо знакомые всем методы для работы с портами, а именно inp и outp. Во время чтения и записи байтов апплет переходит во второе кольцо, а затем возвращается обратно. Такой апплет не может работать в Netscape и выполняется как обычное приложение.
Для отладки был выбран динамик IBM PC, которым можно управлять через порт 0x61. Очень скоро он начал издавать различные звуки - радостно похрюкивать, повизгивать и тому подобное. Также я научил компьютер подмигивать мне лампочкой модема. Это выглядит замечательно, вы тоже можете посмотреть - для этого вам надо запустить JavaDive.cmd.
Вам потребуется Java 1.1.* или более современная, и любая версия OS/2 Warp.

Все вопросы про Ассемблер и IOPL32 - Ринату,
Все вопросы про Яву и эту статью - мне.
Ваш Сергей Посохов
- Весна 1999 года -