пʼятницю, 23 серпня 2013 р.

"Extending DOS" by Ray Duncan et. al

Про свою боротьбу із DOS-ом я вже писав: "DOS FCB". Ключова тема -- доступної інформації було мало, критично мало. Ну, тобто, в когось може і були всі потрібні книжки, але в мене -- ні...  Одним із важливих питань було, (вживаючи правильний термін, якого тоді не знав) -- розширення DOSу. Сам DOS -- більш ніж скромна система, навіть на свій час. З чого все почалося теж писав: "MS/PC DOS 1.0". Наступник, DOS 2.0 стала значно просунутішою системою, але все рівно, до середини 80-х років 640Кб було явно мало навіть для персоналок. Однак, вимоги зворотної сумісності не давали просто "почати все з початку", доводилося викручуватися. Розширена (extended) і доповнена (expandex) пам'ять, HMA, захищений режим, VCPI, розширювачі DOS, DPMI, DOS/4GW і т.д. і т.п. -- купа всіляких загадкових слів та абревіатур. З захищеним режимом я сяк-так розібрався. Дорвавшись до каталогу переривань Ральфа Брауна, пробував розібратися і з int 15h/VCPI/DPMI. Але, з одного боку, довідник --- не підручник, з іншого, з приходом Windows-9x, Windows NT та Linux, вся тематика зробилася неактуальною. Активно колупатися -- воно б не вартувало затрачених зусиль. Проте, певна ностальгія, (про неї я вже згадував, пишучи про FCB), залишалася.


Так ось, на початку цього літа завелася в мене книжка з фото вище. Ray Duncan (1), "Extending DOS", 1990-го року видання (2). Прочиталася на раз -- як історично-пригодницька, чи що!  Книжка, щоправда, трохи оглядова. Явно не підручник і не довідник. Правда, прикладів багато і вони доволі детальні. Розібратися, у свій час, допомогла б! Ще однією причиною легкості читання може бути те, що заглиблюватися потреби не було -- просто читав, як художню, намагаючись зрозуміти суть, але не колупаючись в деталях реалізації --- сподіваюся, використовувати практично не доведеться ніколи. 

Перш ніж перейти до огляду, нагадаю, що станом на 1990-й було випущено процесори 286, 386 і 486 та продавалися IBM PC-сумісні комп'ютери із ними. 2-4Мб пам'яті в персоналці вже нікого не дивували. Щойно вийшов Windows 3.0, щойно прийнято DPMI, але до практичного використання ще ні дійшло. OS/2 все ще подавала надії, але щодо неї вже закрадалися сумніви.

Глава перша -- поверхневий огляд  архітектури IBM PC та захищеного режиму. Цікава інформація з останнього її розділу:
  • 1984 рік -- 99% з 3-мільйонного парку IBM PC-сумісних машин використовували 8086/88, лише 1% -- 286.
  • 1987 рік -- 8086/88 складали 69% IBM PC-сумісних комп'ютерів, або більше ніж 10 мільйонів, 286 -- 29%, ~4.25 мільйони машин, 386 -- 2%, трішки більше 300 тисяч.
  • Станом на 1989, 15% все ще складали персоналки на 8086/88-му процесорі.
Глава друга -- доповнена, expanded, пам'ять. Спосіб обійти 1Мб обмеження адресного простору 8086-го, з якого помітну частину відкусила, під свої потреби, архітектура IBM PC, залишаючи програмам 640 Кб "звичайної пам'яті". Спеціальні схеми підставляли сторінки із доповненої пам'яті у нижній мегабайт адресного простору, доступний процесору в реальному (для 8086 --- єдиному можливому) режимі. Дано опис LIM EMS-стандарту (Lotus/Intel/Microsoft Expanded Memory Specification), який надавав API для доступу до цієї пам'яті (вибачайте, деталі переказувати не буду :), якщо дуже цікаво -- пишіть, може і спробую коли, в приступі депресії, написати). Одні тільки нюанси взаємодії із відповідним драйвером чого вартують (грубо кажучи: "Щоб перевірити наявність, відкрийте пристрій із іменем EMMXXXX0 засобами INT 21h, або просто пошукайте стрічку EMMXXXX0 таким-то способом"). EMS 3.0, 3.2, 4.0. Емулятори EMS, які робили вигляд, що присутня доповнена пам'ять, користуючись свапуванням на диск (Turbo EMS:  COMPUTE! ISSUE 115 / DECEMBER 1989 / PAGE 118); або засобами захищеного режиму 286 (книга не наводить жодного прикладу, знайшов один сам: EMM286, 1993, від Jjex Softwar) чи 386+ процесорів (славнозвісні 386-to-the-Max від Qualitas, Quarterdesk QEMM (скачати також можна тут), Microsoft Windows/386 2.1 та EMM386).  Наведено коментований код простого драйвера віртуального диску, що використовує EMS.

До речі, часто траплялися згадки, в підручниках по C та C++, що операційна система не обов'язково звільнить пам'ять після завершення програми, якщо не зробити free/delete. Завжди було цікаво, що ж то за системи такі. Ну ось, EMS-пам'ять якраз приклад. В DOS не було шансу звільнити не віддану програмою доповнену пам'ять без перевантаження.

 Глава третя --- розширена, extended, пам'ять. Пам'ять вище першого 1Мб, доступна лише із захищеного режиму (3). (Не плутати із expanded! --- остання відображається на адресний простір в першому мегабайті, тими чи іншими засобами). Засоби BIOS, INT 15h, для роботи із розширеною пам'яттю. Неофіційні способи керування такою пам'яттю (стандартних способів роботи із нею, типу malloc чи відповідних системних викликів, не було!) -- VDISK-метод та метод перехоплення INT 15h. (Сучасним програмістам варто про це час від часу перечитувати! А то зажерлися ;). Протокол eXtended Memory Specification, спосіб навести порядок із доступом до розширеної пам'яті з-під DOS. Цей протокол також брав на себе також керування лінією A20, надаючи апаратно незалежне API, і так званою "High Memory Area", 64Кілобатйовою областю пам'яті, розташованою вище 1Мб, доступною із реального режиму 286-го через помилку в ньому. В подальшому, для 386+, помилка стала стандартом. "Референтна" реалізація -- HIMEM.SYS. (Пам'ятаєте ще такий? ;-) Способи реалізації доступу із реального режиму --- згадана помилка в 286-му, через яку й довелося вводити керування лінією A20, недокументоване використання LOADALL (у версії для 286), тощо.

Глава четверта --- розширювачі DOS для 286. Розповідь про те, що, хоча 286 вже застарів (4), але все ще дуже поширений, писати програму, орієнтуючись на нього, ще є певний сенс. Розповідь, що таке, взагалі, розширювач DOS (DOS extender). Коротко кажучи, це спосіб  взяти звичайну DOS-івську програму,  перелінкувати її із певними об'єктними файлами, можливо -- пропустити через своєрідний "постпроцесор", і отримати програму, що прозоро працює в захищеному режимі 286, вільно звертаючись до всієї доступної йому пам'яті. Часто завантажувати таку програму слід спеціальним "лоадером", який, правда, можна об'єднати із самою програмою. Розповідь про те, чому, часто так гладко все не працюватиме --- DOS-івські програми люблять вести себе не дуже коректно, вважаючи себе єдиними на всю машину, не соромляться прямої адресної арифметиками із сегментними регістрами, тощо. Опис необхідних змін до програми. Опис внутрішніх принципів функціонування таких розширювачів -- передача викликів DOS та BIOS із переходом в реальний режим, реалізація частини викликів самостійно, обробка переривань, відображення фіксованих адрес пам'яті (наприклад, відеопам'яті) на такі селектори захищеного режиму, щоб мінімізувати модифікації програм, тощо. Розповідь ведеться на прикладі DOS/16M від Rational Systems (зараз --- Tenberry Software) та OS/286 від Eclipse Computer Solutions (потім Ergo, перед тим: A. I. Architects). До речі, здається, DOS/16M все ще можна купити! Принаймні, можна спробувати...

Взагалі, оті 286-extender-и -- приклад елегантних, майже геніальних, способів обійти фундаментальні обмеження DOS. Мені сподобалося! Ні, звичайно, краще щоб тих обмежень взагалі не було. Але, все ж. Одна тільки трансляція звертань до відеопам'яті (лінійні адреси, починаючи з 0B0000h (MDA) чи 0B8000h (CGA, EGA, VGA)) за допомогою селекторів із номерами 0B000h і 0B800h, чого варта. 

Вставка "Programming Project",  про роботу із компілятором С захищеного режиму, Instant C від Rational Systems. Що цікаво, він був ще й інтерактивним -- такий собі інтерпретатор С, доповнений відладчиком захищеного режиму! Вмів генерувати код, правда, доволі повільний -- щоб не конкурував із більш спеціалізованими продуктами компанії, скажімо, із тим же DOS/16M.

Глава п'ята --- розширювачі DOS для захищеного режиму 386+(5). Нюанси їх використання, зокрема необхідність повністю 32-бітного коду, для якого слід мати відповідний компілятор (MetaWare High C-386, Watcom C/386, (6), etc., на сторінках 233-234 є більш повний список). Сторінкова організації пам'яті та віртуальна пам'ять. Режим v86 та переривання реального часу, RPC, ті що Real mode Procedure Calls, (не плутати із Remote, хоча назва свідомо аналогічна), доступ до фіксованих адрес в пам'яті. Математичні сопроцесори, як x87, так і славнозвісний Weitek.

Розглядалося, на прикладі Phar Lap 386|DOS-Extender, (7), OS/386 від Eclipse Computer Solutions та IGC X-AM Development Environment. Очевидно, DOS/4G і  DOS/4GW тоді ще не існувало.

Глава шоста  --- про написання програм для Windows 3.0, який якраз був вийшов. Останній, який міг працювати в реальному режимі. Windows чесно названо "Operating Environment", хоча й наголошується, що він -- значно більше, ніж просто DOS Extender чи менеджер пам'яті. Розповідь про всілякі жахи, типу GlobalLock. На загал -- цікаво, хоча на повноцінний курс програмування під Windows аж ніяк не тягне, швидше -- детальний огляд. Наведено приклад написання програми-годинника.

Глава сьома --- DESQView від Quarterdesk, робоче середовище для переключення між задачами. Така собі реалізація багатозадачності під DOS! При чому --- все в реальному режимі, тому могло працювати на 8086/88. Хоча, за наявності QEMM386 від тієї ж фірми, вміло використовувати XMS. Вміє свапуватися на диск. Дано огляд принципів роботи, доволі детальний опис API, доступного програмам, які хотіли б скористатися додатковими сервісами. Зокрема -- панелі, та редактор панелей (будь здорова, Delphi! :), протоколи взаємодії між процесами, аналоги потоків (threads). Приклад програми-годинника, правда, текстового --- DESQView аж ніяк не графічний.

Симпатична штучка була. Доступна для (напівофіційного) скачування тут. (Див. також додаток 2).

Глава восьма --- VCPI, Virtual Control Program Interface. Проблема із всіма тими розширювачами DOS була в тому, що кожен із них вважав: він повністю контролює систему. VCPI --- перша спроба навчити їх домовлятися між собою. Складна і плутана у використанні. Хоча ідея за нею, враховуючи обставини, геніальна --- контекст захищеного режиму переключається практично повністю, інтерфейс вимагає від клієнтів-розширювачів лише дотримання пари простих вимог, типу надання до трьох селекторів у GDT для потреб сервера та обмежень під час роботи із віртуальною пам'яттю у перших 4Мб лінійного адресного простору. (Див. схеми на стор. 385 і 380-382). Завдяки цьому, декілька програм захищеного режиму можуть працювати одночасно, вважаючи, що вони повністю контролюють машину. Виключно 386+.

Розповідається про принципи використання VCPI, його внутрішню роботу, наведено приклади. Згадано, що Windows несумісний із ним. Насправді, Windows/286 був зовсім несумісним, Windows 3.0 -- лише в реальному режимі, Windows 3.1 був звичайним VCPI-клієнтом, тому проблем із ним не було, однак 3.1 вийшов вже після виходу книги. 

Глава дев'ята --- короткий огляд DPMI, DOS Protected Mode Interface. На моменти виходу книжки DPMI вже було прийнято, але ще толком не реалізовано. Тому про інтерфейс, який з часом перевернув всю ту кухню розширювачів DOS (8), написано зовсім мало, хоча й (вірно!) наголошено на його велику перспективність. Згадано, що інтерфейс існує в двох варіантах, 286 і 386+.

Глава десята --- огляд багатозадачності під DOS. Такий собі узагальнений підсумок.

Завершується книга списком фірм-постачальників як згаданого в книзі так і суміжного програмного забезпечення. 

Додаток 1

Слід пам'ятати, що з часу виходу книги всіляких розширювачів, VCPI та DPMI серверів з'явилося багато. Деякі з них навіть частково підтримують Win32-програми. Більше детальний список див. у вікіпедії: "DOS extenders". Відмічу хіба славнозвісні DOS/4G і DOS/4GWCWSDPMI та HX DOS Extender.

Додаток 2 -- цікаві посилання


З приводу цього "літогляду" декілька посилань. Стаття на dr.Dobbs "Programming With Phar Lap's 286/DOS-Extender", від Al Williams, та його ж статті: "ROLL YOUR OWN DOS EXTENDER: PART I, Develop your own 386 protected-mode applications" і "ROLL YOUR OWN DOS EXTENDER: PART II, Under the hood".

Стаття DESQview/X: A Technical Perspective (1990). На жаль, майже нечитабельний скан...

Знайти різні версії згаданих пакетів та документацію до них можна багато де:

Висновки

На загал, в кого ностальгія за тими, по своєму -- веселими, часами, відповідними обмеженими, зате простим, як борщ, (X), технологіями, за епохою боротьби із 640Кб бар'єром, простими і елегантними вірусами, безпосередньою роботою з BIOS та відеопам'яттю, (а то й портами вводу-виводу) --- дуже рекомендую!

Воно, може, і не вартувало такого розгорнутого поста, але щось я розчулився -- та книжчека така мила. :-)


___________

Виноски

(1) Ray Duncan -- редактор та автор декількох глав, всіх авторів див. на фото обкладинки. Доволі зоряний список: Ray Duncan, Charles Petzold, M. Steve Baker, Andrew Schulman, Stephen R. Davis, Ross P. Nelson, Robert Moote. Що цікаво, Рей Дуглас, визнаний авторитет в світі програмування під DOS (півдесятка ключових книг по темі!), виявився неонатологом. І не тільки за освітою, а неонатологом, який періодами працював у клініках! (Якщо я нічого не наплутав, читаючи його резюме.) Детальніше див. на його сторінці в LinkedIn. Зокрема, там є список публікацій (плюс багато журнальних):

Author:
Addison Wesley:
Extending DOS, 1990.
Extending DOS, 2nd Edition, 1992.

Microsoft Press:
Advanced MS-DOS Programming, 1986
MS-DOS Functions Quick Reference, 1988.
IBM ROM BIOS Quick Reference, 1988.
Essential OS/2 Functions Quick Reference, 1988.
Advanced MS-DOS Programming, 2nd Edition, 1988.
Advanced OS/2 Programming, 1989.
MS-DOS Extensions Quick Reference, 1989.
Power Programming with Microsoft MASM, 1992.

General Editor:
The MS-DOS Encyclopedia, 1988.

(2) Кому цікаво, купити можна тут. При чому, якщо підійде б./в. -- зовсім дешево. Є також новіше видання: "Extending DOS: A Programmer's Guide to Protected-Mode DOS. Second edition.", 1992 року. Якщо хтось має -- діліться!

(3) Відповідь на питання, яке мене колись дуже цікавило. Адреси між 640Кб і 1Мб зарезервовані для BIOS, відеопам'яті і т.д. Тоді, що значило, коли комп'ютер мав 1Мб пам'яті? Куди вона дівалася? Підтвердилося очевидне припущення -- перших 640Кб були "внизу",  решта -- за адресами, починаючи з 2-го мегабайта.

(4) Ех, дали б мені в 1995-му 286-й, це ж би було неміряно круто...

(5) Так то розширювачі для 286 чудово працювали і під 386+.

(6) Компілятор Watcom все ще живий, та ще й Open Source! Ну, точніше, в комі, напевне... Зокрема, після того, як вони дружно відмовилися від STLPort і почали писати свою STL... Але, для багатьох платформ, типу того ж DOS, він -- один із найкращих, а то й єдиний, компілятор такого рівня. До речі, трішки про нього я вже писав: "Приклади використання асемблера разом з OpenWatcom".

(7) Компанію названо на честь коня, Phar Lap. Цікаво, львівський Фарлеп -- на честь цієї компанії?

(8) Згадайте DOS/4GW, Doom, Qucke, Duke Nukem, Warcraft та безліч інших ігор та програм з 90-х!

(X) Такими, які був шанс осягнути, хоча б по верхах, повністю. Не те, що теперішні Windows, Linux, Android і т.д. Ну, але, за все доводиться платити. Зокрема, за потужність та зручність -- складність "бек-енда".

Немає коментарів:

Дописати коментар