суботу, 23 лютого 2013 р.

MS/PC DOS 1.0


IBM PC з PC-DOS 1.1.
Той самий, модель 5150.
(c) www.vintage-computer.com
Натрапив я недавно ще на одну штуку зі свого дитинства. Вирішив написати про неї, в процесі стало зрозуміло, що контекст буде незрозумілим.  Довелося почати з історичної довідки.

Забігаючи наперед, мушу попередити: цей пост не претендує на повноту, він не є повноцінним історичним дослідженням -- матеріалу по темі багато, значна частина відповідних історичних персон ще жива, а то й активна, колупатися є в чому. Це просто розповідь про давні-давні часи. (Хоча я і намагався перевіряти наведені факти.) При чому, розповідь із безліччю виносок -- не так просто із тісної, щільної, павутини, висмикнути кілька ниток так, щоб без хвостиків. Взагалі, ті виноски теж варто читати. :-)

Історія


Отож. Йшов 1980 рік. Я ще тільки збирався народитися, а компанія IBM готувала свій черговий (на той момент - таємний!)  проект -- новий персональний комп'ютер. (Див. додаток 1!). В його ROM було прошито BASIC від Microsoft -- IBM, очевидно, вже мала певний досвід співпраці з цією фірмою. BASIC міг служити в ролі примітивної операційної системи, зокрема, вмів завантажувати програми з касет. Однак, цього було мало -- потрібна була справжня операційна система (ОС). Планувалося залучити CP/M-86, версію популярної тоді 8-бітної ОС, CP/M, для 16-бітного 8088/8086 процесора. Однак, розробник та власник CP/M, Gary Kildall, щось кумизився (1), а час підтискав, тому, після переговорів, Мікрософт взялася надати і ОС.



Приблизно в той же час, молодий програміст з Seattle Computer Products, Тім Патерсон, взявся розробити "тимчасову" операційну систему для їх нового мікрокомп'ютера (точніше - плати для нього), на базі шини S-100 (2) -- обіцяна CP/M-86 все не виходила і не виходила. На той момент у них був вже згаданий ROM-BASIC від Мікрософт, але ОС не було. Щоб спростити перенесення програмного забезпечення, яке вже існувало, Патерсон вирішив відтворити API (Application Programming Interface, інтерфейс роботи із системою), популярної на той час CP/M (3). Правда, замість простої файлової системи CP/M, яка мала дуже суттєві обмеження (див. главу "6.4.2 The CP/M File System" книги "Modern Operating Systems" від Таненбаума), використав файлову систему мікрософтівського БЕЙСИК-а, тоді ще восьмибітну FAT, розширивши її до 12 біт (FAT-12), та ввівши ряд інших змін, що суттєво збільшували можливості файлової системи, зокрема максимальний розмір дисків та файлів (4).

Написавши її всього лиш за два місяці, автор так і назвав -- Quick and Dirty Operating System. Потім, (з версії 0.33), правда, перейменували у 86-DOS, все ж несолідно. :-)

Замість писати з нуля, Мікрософт купила права на 86-DOS, (5) (можна сказати -- разом і з автором, він потім на якийсь час перейшов до МС і працював над DOS там), та перенесла її під архітектуру нової машини IBM (6).

Так що, IBM PC, модель 5150, з якої почався переможний похід цієї архітектури (див. Додаток 1), вийшла 12 серпня 1981 року із операційною системою PC-DOS 1.00. (7)

З версіями тут, правда, все складно. Мікрософт розробляла DOS разом із IBM, але, крім того, з 1982, продавала її й іншим OEM (Original equipment manufacturer). (До 1991 року користувачам Мікрософт DOS не продала, в основному його можна було купити лише разом з комп'ютером). При чому, хоча існувало два паралельних іменування, PC-DOS і MS-DOS, фактично це був один і той же DOS (8,9).

Отож, 86-DOS версії 1.14, була названа Мікросот MS-DOS 1.14, вона ж розповсюджувалася IBM під іменем PC-DOS 1.00. Через вісім місяців версія MS-DOS 1.24 була опублікована IBM під назвою PC-DOS 1.10.

Версія MS-DOS 1.12 була першою, проданою OEM, відмінному від IBM -- Compaq (10), версія 1.13 розповсюджувалася Texas Instrument, але аж в 1983 році. Так виглядає, що це були варіації на тему PC DOS 1.10/MS-DOS 1.24+. Зокрема, TIME i DATE там вже вбудовані.

MS-DOS 1.25 була першою менш-більш поширеною версією, яка постачалася різним,  відмінним від IBM, OEM. Існувала вона і для не дуже сумісних машин, таких як Zenith Z-100, із двома процесорами, 8085 і 8088, на ньому могли працювати і DOS, і CP/M. Власне, в першу чергу, для таких виробників DOS постачався у вигляді OEM Adaptation Kit -- див. виноску (9).

Нарешті, в березні 1983 було випущено MS/PC-DOS 2.0, який фактично був новою ОС, хоча й підтримував сумісність з попередніми версіями, 1.xx.
Подальшу історію розвитку DOS див., наприклад, "Timeline of DOS operating systems", або "16bitos", а поки коротко подивимося, що ж ті ранні версії вміли.

Що ж це було?

PC-DOS 1.00 підтримував лише FAT-12, поняття каталогів (директорій) не було -- всі файли лежали у корені дисків. 
Підтримував лише 5-дюймові дискети формату 160Кб -- односторонні (здається, двосторонні теж були, просто їх доводилося перевертати вручну), 40 доріжок на диск, 8 секторів на доріжку (11).
Імена файлів, як запозичено із CP/M, (і до сих пір лякає нас, хоч й останні роки в меншій мірі) могли мати лише 8+3 символів, розділених точкою -- 8-символьне ім'я та 3-символьне розширення, яке служило для визначення призначення файлів. Зокрема, програми були двох типів, які відрізнялися розширенням -- .COM, та .EXE.
COM безпосередньо наслідував виконавчий формат CP/M,  він не містив ніякої службової інформації, просто завантажувався за зміщенням 100h у сегмент коду. Так як сегменти 8086/8088 були 64-кілобайтові, максимальний розмір такої програми -- 65,280 байтів (FF00h), перших 100h (256) байт використовувалися для PSP -- Program Segment Prefix, спеціальної структури даних з інформацією про процес (аналог Zero Page з CP/M). EXE був більш просунутим форматом. Всі сучасні exe-файли все ще залишаються сумісними із тим старим форматом, який для ясності називають MZ-EXE (12). Він містив, крім коду, різноманітну інформацію про програму, зокрема, дозволяючи їй бути більшою за 64Кб, містити декілька сегментів.

Крім безпосередньо бінарних програм, від самого початку підтримувалися .BAT - файли (13), своєрідні скрипти, які обробляв командний інтерпретатор, COMMAND.COM. Правда, спочатку жодних команд, крім викликів програм та коментаря "REM", не було. Із користувацьких команд лише DIR, COPY, ERASE, PAUSE, REM, RENAME, і TYPE були вбудованими. (див. "List of MS-DOS commands", але не забувайте поглядувати на версію, з якої команда підтримується). Навіть DATE і TIME були програмами, а команди VER, "версія", взагалі не було. Як не дивно, в комплект входив DEBUG.COM, доволі потужний дебагер, хоча із тяжким для сприйняття інтерфейсом (14). Включався і лінкер, LINK.EXE, однак засоби, що могли створювати об'єктні файли для нього, треба було купляти окремо. На жаль, редактор був відверто рудиментарним, Edlin, його написав той же Тім Патерсон, десь в 1980-му, в надії швидко-швидко замінити на щось пристойніше, ("A primitive line-oriented system, it was supposed to last less than six months.") і проіснува цей жах аж до MS-DOS 5.0, потім ще й відродився у гілці NT, аж до Windows 8 включно, бо її підтримка DOS базувалася на DOS 5.0. Інші системні програми на диску (їх призначення див. "List of MS-DOS commands"): CHKDSK.COM, FORMAT.COM, SYS.COM, DISKCOPY.COM, DISKCOMP.COM, COMP.COM, MODE.COM.

Так як каталоги не підтримувалися, командний процесор, COMMAND.COM, у ролі запрошення виводив лише ім'я диску ("A:" в MS-DOS, "A>" в PC-DOS -- не змогли IBM i Microsoft досягнути консенсусу :). Однак, так як два дисководи були не дуже поширеними, існувала можливість прив'язки двох логічних дисків, A i B, до одного фізичного, завдяки чому можна було копіювати файли між дискетами: вставив одну, розпочав копіювання, прочитавши в пам'ять, ОС попросила вставити дискету-призначення, записала на неї. Якщо пам'яті на цілий файл не вистачало, заміну дисків слід було повторити декілька раз. (15)

Уміла слідкувати за датою і часом (кажуть, не дуже поширена річ у тодішніх персоналках), однак при кожному запуску їх слід було вводити заново. При запуску питалася тільки дату.

Найбільш потужною частиною був BASIC. Він включав примітивну IDE та покладався на ROM-BASIC оригінальних IBM-PC (тому на сучасних машинах працювати відмовиться, просто зависне). Постачався у двох варіантах, Disk BASIC (BASIC.COM) та Advanced BASIC (BASICA.COM). Перший міг працювати із дисками, (на противагу магнітофонним касетам),  потребував 32 Кб пам'яті, підтримував послідовний порт та виправляв деякі помилки у ROM BASIC. Другий потребував 48Кб, додатково підтримував виведення звуку на PC-спікер та виведення у графічному режимі (16). Також на диску було багато програм на БЕЙСИКу, в основному -- прикладів використання різноманітних можливостей машини. Поміж них була і перша гра,  написана для IBM-PC -- DONKEY.BAS, знаменита ще й тому, що її фактичним співавтором був Білл Гейтс. Файли прикладів зберігалися у "tokenized"-форматі -- ключові слова були замінені однобайтовими кодами, щоб зекономити місце і час виконання. Тому, якщо заглянути у них будь-яким текстовим редактором, буде видно ну дуже спотворений код, візуально - майже сміття. Сам БЕЙСИК відображав програми у звичній для людей формі, міг  зберегти їх так, у формі звичайного ASCII-тексту.

Займав DOS 1.00 8Кб оперативної пам'яті і складався з приблизно чотирьох тисяч рядків коду на асемблері. (Як він виглядав можна побачити, подивившись на коди 86-DOS, наприклад тут: Howard's Seattle Computer Products SCP 86-DOS Resource Website, див також (17)) . Основних компонент було три: IBMBIO.COM, IBMDOS.COM, COMMAND.COM. IBMBIO.COM -- інтерфейс, розширення та іноді -- "хотфікс" до BIOS, включав драйвери диску, консолі, принтера. (17) IBMDOS.COM -- ядро ОС, в якому реалізовано все API, зокрема і славнозвісне INT 21H (див. також сюди). COMMAND.COM -- програма, яка забезпечувала взаємодію з користувачем. Фактично, саме її більшість називали DOS-ом (18). Для економії складався із трьох частин -- частина ініціалізації, що опрацьовувала AUTOEXEC.BAT -- список команд, які слід виконати при завантаженні, потім відкидалася, резидентної, яка була присутня завжди і такої, що могла бути викинута із пам'яті, щоб звільнити місце. Остання містила реалізації внутрішніх команд, не знаю, як DOS 1.00, але пізніші дуже любили, після виконання сторонньої програми, просити вставити диск з COMMAND.COM, щоб підвантажити нерезидентну частину (якраз це був один із основних обов'язків резидентної).

Крім того, вже підтримувалися файли-пристрої: CON (консоль, читання з нього велося з клавіатури, запис в нього виводився на екран), PRN (принтер -- запис у  цей файл виводився на принтер, якщо такий був присутній), AUX (послідовний порт), NUL (виведене туди просто відкидалося). Деякі цікавинки з того приводу див. у додатку 2.

PC-DOS 1.10 додав, в першу чергу, підтримку двосторонніх дискет, розміром 320Кб -- ті ж 40 доріжок/8 секторів, лише дві сторони (19). Решта, в основному, було дрібними змінами -- DATE і TIME було зроблено вбудованими, старі команди стали трішки потужнішими, додано EXE2BIN.EXE для перетворення EXE в COM (тільки тих, що "поміщалися" в 64Кб - 256 байт). Якщо користувач не вводив дату при запуску -- просто встановлювалася дата по замовчуванню (тому є багато файлів, датованих 1 січня 1980 :). Додано синоніми парі вбудованих команд, DEL для  ERASE і REN для RENAME. Для файлів, на додачу до дати,  почав зберігатися час їх зміни.

DOS 2.0, випущена 8 березня 1983, разом із IBM PC/XT. Це була, фактично, зовсім нова операційна система, щоправда, із збереженням сумісності з попередниками. важливою новинкою була підтримка жорстких дисків -- XT мала 10-мегабайтовий жорсткий диск (Seagate ST-412). Різке збільшення дискового простору змусило нарешті додати підтримку директорій. З'явилася характерна для Unix-ів можливість перенаправляти дані (наприклад вивід на екран у файл). Розширилася підтримка резидентних програм -- TSR, такої собі ерзац-заміни багатопоточності (20). Додано можливість завантажувати драйвери пристроїв, додано відповідний конфігураційний файл, CONFIG.SYS. На відміну від тодішніх традицій UNIX-світу, дравери завантажувалися бінарними, не було потреби їх перекомпільовувати чи перелінковувати. Окрім підтримки жорстких дисків, додано підтримку 9-секторних (на доріжку) гнучких дисків, ємністю 180 і 360 Кб (одно і двосторонніх, відповідно). До версії від IBM додано утиліти типу FDISK.COM, для роботи із жорсткими дисками та TREE.COM для виведення дерева каталогів. З'явилася  ASSIGN.COM, що могла створювати віртуальні диски, прив'язані до директорій -- це полегшувало життя старим програмам для DOS 1.xx. Поміж решти утиліт: FIND.COM для пошуку файлів і тексту в файлах, BACKUP.COM, GRAPHICS.COM, MORE.COM,  SORT.EXE, PRINT.COM, RECOVER.COM, RESTORE.COM і т.д. Розповсюджувалася на двох дисках. Мала вже й свої "пасхалки" :-)

COMMAND.COM почав підтримувати  змінні середовища, схожі на ті, що існують в UNIX-системах. Додано команди підтримки нових можливостей, такі як SET, для встановлення змінних середовища, PATH для роботи із змінною, що вказує шляхи пошуку програм, CD/CHDIR для переходу між директоріями, MD/MKDIR для їх сторення і RD/RMDIR для видалення,   CTTY -- для зміни/перенаправлення терміналу, PROMPT -- змінна керування запрошенням користувача, VERIFY для керування перевіркою запису на диск, VOL для відображення мітки диску. Зрозуміли автори DOS-у, що він буватиме різним, тому додали команду VER -- вивести версію. Пакетні файли тепер могли містити розгалуження (команда IF), цикли (FOR), переходи (GOTO), виведення повідомлень (ECHO), вміли трішки маніпулювати переданою їм командною стрічкою (SHIFT).

Використовувала 20Кб пам'яті.

Дуже сильно змінився та покращився й інтерфейс для програмістів, зокрема, робота з файлами могла здійснюватися за допомогою номерів файлів (handle), на манер Unix, а не тільки з використанням запозичених із CP/M і доволі архаїчних вже тоді FCB. Взагалі, див. тут: "DOS Kernel" для версії DOS2+.

Огляд DOS 2.0 вище дуже короткий (21) -- змін було чи не більше ніж DOS 1.xx всього разом. Детальніше див: "DOS 2.0 and 2.1", зокрема і пасхалка там описана.

Я в ту історію не заглиблюватимуся, а наступним постом покажу, як можна самому подивитися на DOS 1.xx чи навіть помацати його. (Насправді, це не така тривіальна задача.)

На разі, маєте зауваження, виправлення, питання, пишіть! І:

Дякую за увагу!

_______________

Література

  • Дуже(!) детальна історія : "Timeline of DOS operating systems".
  • Архів мертвого сайту про колекціонування (образно кажучи, не придумав, як ще назвати) старих версій та старих дистрибутивів DOS: "16bitos". Містить, зокрема, фото, описи та різноманітну, як офіційну, так і неофіційну, інформацію про різноманітні дистрибутиви. Наприклад, див "IBM DOS Version 1.00". Ліцензія там цікава... Зокрема, забороняли посилатися на їх сайт без дозволу, судом грозилися, якщо що. :-)
  • Стаття Тіма Патерсона: "A Short History of MS-DOS". Викладено послідовність QDOS (0.11) -> 86-DOS (0.33) -> MS-DOS (1.14, вона ж PC-DOS 1.00).
  • Список статей про DOS від Тіма Патерсона та його блог. (Що цікаво, я стикався із іншим його проектом, не знаючи наскільки видатний в нього автор -- веб-сервером на AVR від Atmel). Зокрема, "The First DOS Machine", "Is DOS a Rip-Off of CP/M?" та "The Contributions of CP/M".
  • Стаття того ж Патерсона: "All Those Floppy Disk Formats…" та список форматів гнучких дисків (floppy disks) Вікіпедії.
  • Статті про історію DOS на "OS/2 Museum": "DOS Beginnings", "DOS 1.0 and 1.1", "DOS 2.0 and 2.1", "DOS 3.0, 3.1, and 3.2", "DOS 3.3", "DOS 4.0", "86-DOS Was an Original", "OEM Adaptation Kit (OAK)". 
  • Список різноманітних DOS із базовими характеристиками: "Comparison of DOS operating systems".
  • "Reverse-Engineering DOS 1.0 – Part 2: IBMBIO.COM", "Reverse-Engineering DOS 1.0 – Part 1: The Boot Sector".
  • Історія PC-DOS,  яка, фактично, до 1993 була лише ребрендінгом MS-DOS. (PC-DOS 6.1 це ще майже MS-DOS 6.00 із традиційними дрібними змінами.) 
  • Блог Larry Osterman, особливо з тегом Microsoft History.
  • Блог Raymond Chen, особливо з тегом History.
  • Солянка з різноманітних джерел (ось як у мене цей пост, тільки англійською ;) про історію DOS: "MS DOS/PC DOS History".
  • Коротко, зате російською: "История MS-DOS".
  • Історія версій, російською: "MS-DOS/PC-DOS", також список (хоча і трішки дискусійний) на форумі "Железные призраки прошлого": "Версии MS-DOS".
  •  "IBM PC Technical Reference Manual." для різних моделей. Детальний опис архітектури машини. Доступні в Інтерніт. Див., наприклад, тут: http://www.retroarchive.org/dos/docs/. (Там взагалі багато цікавих документів: "IBM BASICA v1.10 Manual", "IBM PC (Model 5150) Guide to Operations", "IBM PC/XT Hardware Maintenance Guide", тощо). Зокрема, прямі посилання на "Technical Reference Manual" для 5150 (IBM PC) і 5160 (IBM PC/XT).
  • "Ralf Brown's Interrupt List"  -- дуже детальний список використання переривань DOS, BIOS та різноманітного подібного програмного забезпечення. Містить опис використаних структур даних. Включає як документовані так і недокументовані відомості. Функції власне "голого" DOS тут: "DOS Kernel". Зверніть увагу на версії, з яких кожен системний виклик підтримувався, зокрема, що входить до "DOS 1+" і "DOS 2+".
  • Опис IBM PC, разом із фотографіями і т.д.: "Vintage Computer: IBM PC".
  • "MS-DOS® (Versions 1.0-3.2) Technical Reference Encyclopedia".  На жаль, знайти в Інеті не вдалося, навіть купити, і то, дорого. Але джерело інформації по темі дуже хороше. Із іншою книгою, з такою ж назвою, пов'язана цікава історія: "Does anyone remember the ORIGINAL MS-DOS encyclopedia?". Коли енциклопедію писали вперше, автори не особливо спілкувалися з програмістами, в результаті в книгу ввійшло дуже багато таємної інформації. Довелося вилучити з магазинів і ліквідувати. (Хоча знайти все ще можна.) Потім під тією назвою випустили вже більш "виважену" книгу.
  • "The MS-DOS encyclopedia", Ray Duncan, Microsoft Press, 1988. Ось її знайти в мережі реально. Ну, або, звертайтеся, якщо що.
  • Місце, де можна купити старі дистрибутиви DOS та інші суміжні матеріали. 
  • Чисто для приколу: "Easter eggs in Microsoft products", "Early Easter Eggs", "Why no Easter Eggs?".

______________

Виноски

(1) Сам Гарі Кілдал був дуже цікавим дядьком, геніальним комп'ютерщиком та непоганим бізнесменом. Зокрема, йому ми завдячуємо самій концепції BIOS -- винесенню частини базового для апаратури програмного забезпечення в окремий апаратний модуль, із фіксованим інтерфейсом, який дозволяв у широких межах змінювати апаратну реалізацію, не переписуючи всіх програм. Він -- автор першої масової операційної системи для персоналок, (продано більше чверті мільйона копій), першого компілятора для них, кооперативної багатозадачності, ряду історично важливих речей, які зараз би назвали файловими системами, маси ідей стосовно роботи з дисковими та касетними файлами, і т.д. і т.п. На жаль, пам'ятають його, в основному, через провал переговорів щодо ОС для першої IBM PC... Як у відомому анекдоті:

Сидит старый шотландец в пабе, сидит, пивко потягивает, трубку курит. Сидел, сидел и говорит:
- Вот эту мельницу, построил я сам, ОДИН(!)...собрал камней, намесил раствор и построил... но почему-то никто не называет меня Макфларен-строитель мельниц.
Посидел, отхлебнул пива, затянулся.
- Вот этот сад, в котором сейчас самые большие урожаи фруктов и ягод, посадил я сам, ОДИН(!)...все радуются и собирают плоды. Но почему-то никто не называет меня Макфларен-садовник.
Посидел, отхлебнул пива, затянулся.
- Вот этот мост, построил я сам, ОДИН(!), спилил деревья, ошкурил и сделал мост, теперь по нему ездят машины, ходят люди. Но почему-то никто не называет меня Макфларен-строитель мостов.
Посидел, отхлебнул пива, затянулся.
- Но стоило один раз отиметь овцу... 


Коротко про історію переговорів можна почитати на тій же вікіпедії.

На жаль, не можу знайти точну цитату, бачену на днях, але хтось із людей, що мав відношення до тих подій, писав, що Кілдалл був хорошим бізнесменом, але, на жаль, йому довелося протистояти Біллу Гейтсу, проти якого всі виглядали слабенько...

Також цитата з "The man who gave Bill Gates the world": "Kildall was one of the founding fathers of desktop computing, but he seems destined to go down in history as the man who gave Bill Gates the world."

(2) На відміну від сучасних комп'ютерів, де материнська плата включає багато всіляких компонент, S-100 не містила нічого, навіть процесор був "картою розширення". Комп'ютер від Seattle Computer Products, випущений в 1979, фактично являв собою три плати розширення -- карту 8086, карту підтримки CPU і карту з 8/16Кб пам'яті, разом із власне шиною, яка їх об'єднувала. Щоб отримати робочу машину слід було додатково роздобути корпус та термінал. Детальніше див. у блозі Тіма Патерсона: "The First DOS Machine".

(3) Що потім викликало тривалі "розборки" із Кілдалом, автором CP/M, який звинувачував Патерсона у крадіжці та масове поширення відповідних чуток. З того приводу можна порекомендувати, окрім вже згаданої статті на Вікі про Кілдала, наступні джерела:

Статті Тіма Патерсона: "Is DOS a Rip-Off of CP/M?" та "The Contributions of CP/M"

Статтю про Кілдала: "The Man Who Could Have Been Bill Gates", яка була відповіддю на главу про нього у книзі Evans, Harold; Gail Buckland; David Lefer, "They Made America: From the Steam Engine to the Search Engine: Two Centuries of Innovators.", 2004.

"86-DOS Was an Original" -- порівняння двох ОС, зокрема і з точки зору, що було запозичено, що, швидше за все, - ні, що -- точно ні.

Згадане у попередній статті розслідування від професійного "комп'ютерного слідчого": "Did Bill Gates Steal the Heart of DOS?". Зокрема, там згадується, де можна взяти вихідні тексти CP/M (на сайті The Unofficial CP/M Web site) та QDOS (Howard's Seattle Computer Products SCP 86-DOS Resource Website).

Цікаво подивитися також ранні мануали Q-DOS: "Documentation for 86-DOS and Seattle Computer Products".

Важливо, що на відміну від "захисничків", сам Кілдал звинувачував Патерсона та Гейтса не у крадіжці кодів CP/M, а у викраденні ідеї та перехоплення контракту, відповідно.

(4) Писати про конкретні обмеження на розміри трішки важко -- вони еволюціонували з часом, тому, зокрема, теоретичні обмеження, актуальні для сучасної підтримки FAT12 реалізувалися далеко не зразу. Детальніше див., наприклад: "File Allocation Table: FAT12" на Вікі та "FAT" на OSDev.

(5) Права ОС все ж не купують так просто в магазинах, процес був багатоетапним, див., наприклад, "Timeline of DOS operating systems: 1980–1995: Important Events in DOS History".

(6) Зокрема, 86-DOS орієнтувалася на 8-дюймові диски, тоді як IBM PC -- на 5-дюймові (5.25 дюймів). Детальніше про перехід 86-DOS --> перші версії PC/MS-DOS, див:

"DOS Beginnings" -- популярна оглядова стаття,
"The Roots of DOS", стаття 1983 року, про, власне, коріння ДОСу :-),
"86-DOS: Creation of PC DOS" на Вікіпедії,
"An Inside Look at MS-DOS: The design decisions behind the popular operating system", 1983, від самого Тіма Патерсона,
"Design of DOS" -- його ж сучасна стаття, 2007. Поміж іншим там згадується і про вибір файлової системи та мотивацію за ним.

(7)  На базовій моделі, із 16Кб оперативної пам'яті і без дисководу (див. списко літератури до додатку 1), DOS міг йти тільки чисто теоретично. Хоча він займав лише 8Кб пам'яті, BIOS завантажує boot-сектор диску за адресою 0:7C00h, що відповідає 31-му кілобайту. (Див. також "DOS 1.0 and 1.1").

(8) Ну, насправді все трішки складніше. Не весь код писався в Мікрософт. Наприклад, COMP, DISKCOMP, DISKCOPY, MODE були написані IBM. Крім того, IBMBIO.COM включав код під конкретну апаратуру -- фактично то була така собі збірка драйверів. Див. також виноску (9).

(9) Починаючи з 1982 року, OEM-виробниками постачали так-звані OEM Adaptation Kit (OAK). Вони включали:
  • Вихідні коди, які складали собою апаратний інтерфейс, і входили до IBMBIO.COM/IO.SYS.
  • Об'єктні файлами, які містили програмні інтерфейси високого рівня та лінкувалися в IBMDOS.COM/MSDOS.SYS -- фактично, ядро ОС. 
  • COMMAND.COM постачався як є, частина утиліт теж йшла в бінарній формі, але деякі, зокрема FORMAT i SYS -- у вигляді вихідних кодів. 
Ідея полягала в тому, що виробники могли підігнати взаємодію із апаратною частиною під свою платформу, але не могли змінювати програмний інтерфейс, те, що робило DOS DOS-ом. Кому цікаво, в мережі бродить  OAK для DOS 3.30. Крім того, у розпорядженні музею OS/2, (на сайт якого тут є багато посилань), є OAK версії 3.21, README до якого вони виклали. Для зовсім гурманів, в мережі бродить вкрадені в MS вихідні тексти DOS 6.00 (можливо -- 6.22), та частини коду DOS є в украдених там же "сорцах" NT та Windows 2000. (Правда, Мікрософт погрожує засудити кожного, хто на них подивиться, але прецедентів поки не було, або я про них не знаю. Зокрема, на ftp://ifctfvax.harhan.org/pub/micro/msdos/dos_source/ вони лежать вже багато років).
(10) Машини, які продавав  Compaq, були достатньо сумісні із IBM-івськими, завдяки reverse engineering та "дизайну чистого приміщення" (сlean room design) -- спочатку одна група розбиралася, як IBM PC функціонує, писала специфікації. Потім інша група, яка не контактувала із першою напряму (!), по цих специфікаціях розробляла незалежну, але сумісну, специфікацію. Такий підхід дозволив залишатися сумісним, фактично копіюючи оригінальну архітектуру, але не порушуючи законів про авторське право, бо, грубо кажучи, ідеї, такі як API, патентувати не можна.

(11) Більше про цей та інші формати див. статтю Патерсона: "All Those Floppy Disk Formats…" та список форматів гнучких дисків (floppy disks) Вікіпедії.

(12) Назва походить від сигнатури, перших двох байтів, по яким його розпізнають -- "MZ" (4Dh, 5Ah). Походження саме такої сигнатури просте -- це ініціали розробника, Mark Zbikowski. Крім того, дизасемблюються вони у послідовність команд "dec bp; pop dx", якими не може починатися жодна адекватна COM-програма. Розпізнавання програми ОС робить швидше по цій сигнатурі, а не по розширенню. Зокрема,  в старших версіях багато системних програм, таких як COMMAND.COM, перевищили 64Кб ліміт, але змінити їх назву не дала зворотня сумісність -- багато які програми використовують вшиті імена. З якої версії DOS розпізнавання відбувається по сигнатурі я, щоправда, не знаю. Всі більші сучасні формати DOS/Windows, (NE - New EXE, PE -- Portable EXE ) починаються із звичайного MZ-заголовка, часто із програмою-заглушкою, що може працювати під DOS. Теоретично, один EXE-файл міг містити версію і для Windows, і для DOS, але в більшості випадків така заглушка під DOS просто виводить повідомлення, про те, що програма потребує Windows. Див. також: "What's the difference between the COM and EXE extensions?".

(13) Назва не від кажана (bat), а від скорочення до трьох літер слова batch, файли  називалися пакетними. :-)

(14) До сих пір час від часу запускаю його клон від PTS-DOS -- фактично, той же DEBUG.COM, але із текстовим інтерфейсом:
(З назвою фірми-автора там плутанина -- у моєму файлі є стрічка "Paragon Technology Systems  (C) 1994", тоді як стверджується, що перша версія власне від Paragon, а не PhysTechSoft, оригінального автора PTS-DOS, вийшла в 1995).

(15) Так, я теж займався таким. Моя перша машина, куплена в 1994, запущена в 1995, була "Пошук-1", з 8088-сумісним процесором, 640Кб оперативної пам'яті (крім штатних 512Кб, в мене був ще один розширювач), CGA-монітором та 5-дюймовим зовнішнім дисководом. Дисковод, з допомогою 800.com, нормально читав диски 720Кб. Сформатовані на ньому під 800Кб, читав і писав десь до 760Кб. На жаль, поширені в той час у моєму оточенні 800Кб, сформатовані іншими дисководами, читав погано, точніше корневий каталог міг прочитати, але на тому все. Як показали подальші дослідження, посекторно вони читалися нормально і повністю, але чи то ОС намагалася читати кілька секторів за раз, чи що, але DOS із ними працювати відмовлявся. Фактично, радянський клон (1991 року) IBM PC, із помітно більшою кількістю пам'яті та підтримкою більших, ніж підтримувала оригінальна модель, дискет.

(16) Відносно сумісною версією, що не потребувала ROM-BASIC, був GW-BASIC.

(17) Хороші люди дизасемблювали та проаналізували IBMIO.COM з PC-DOS 1.00: "Reverse-Engineering DOS 1.0 – Part 2: IBMBIO.COM". Доволі цікаво та повчально! Зокрема, описано баги BIOS, які обходилися та надано рекомпілювабельні тексти, ( для NASM) з яких можна отримати трішки відмінний побайтово, але сумісний IBMIO.COM. Той же автор дизасемблював і bootloader: "Reverse-Engineering DOS 1.0 – Part 1: The Boot Sector".

(18) Навіть зараз окремі випускники IT-спеціальностей з червоними дипломами доводять мені, що консоль з cmd.exe під Windows XP це є віконечко DOS... Нє, Windows його якось так і називає, але, повторюся, "випускники IT-спеціальностей".

(19) З того приводу на 16bitos є дивна фраза: "This version supported 160k and new double-sided 320k drives, but did not copy between the two unless going from 160k to 320k."...

(20)  Але відповідні програмні інтерфейси залишилися в значній мірі недокументованими. Зокрема прапорець InDos, завдяки якому можна було уникати колізій із нереєнтрантним DOS, документовано лише починаючи з DOS 5.0. Іноді стверджується, що TSR з'явилися лише в DO 2+, що невірно -- див., хоча б, виклик INT 27H, який підтримувався від самого початку.

(21) Лаконічно, але повніше, сказано у вікіпедіії: "Microsoft releases MS-DOS 2.0, which introduces a Unix/Xenix-like hierarchical file system and installable device drivers (e.g. ANSI.SYS) in the system configuration file CONFIG.SYS—a first step towards plug and play.[32] New internal commands are BREAK, CHDIR or CD, CLS, CTTY, EXIT, FC, MKDIR or MD, PATH, PROMPT, RMDIR or RD, SET (environments), VER, VERIFY and VOL. New external commands are DISKCOPY (not identical to IBM's version), PRINT (spooling); three filters supported with standard devices and redirection: FIND, SORT and MORE; BACKUP, RESTORE and RECOVER. New batch file commands are ECHO, FOR, GOTO, IF and SHIFT. CONFIG.SYS commands are BREAK, BUFFERS, DEVICE, FILES and SHELL. New file attribute bits are read-only, volume label, subdirectory and archive. A team of six developers produced version 2.0, led by Paul Allen, Mark Zbikowski and Aaron Reynolds.".
 _______________

Додаток 1 

Персональні комп'ютери з'явилися раніше, ніж почався переможний похід IBM PC. Зацитую вікіпедію: "The Xerox Alto, developed at Xerox PARC in 1973, was the first computer to use a mouse, the desktop metaphor, and a graphical user interface (GUI)". На жаль, це геніальне творіння, що випередило час на десятиліття, в продаж ніколи не поступало -- використовувалися ці машини для внутрішніх потреб, декілька було передано різноманітним організаціям.  Див. також: "Microcomputer revolution", та перші масові персональні машини: "Altair 8800" "Apple II". Вони примітивні від Xerox Alto, але на відміну від останнього, були доступні широким масам.
Файловий менеджер Xerox Alto,  "Neptune Directory Editor". 1973. Використовувалася мишка, знайомі нам кнопки (50 років тому), списки, довгі імена файлів (заслуга ОС а не менеджера, але все ж). Взято на сайті історії GUI.
Однак, бум наступив саме після виходу IBM-івського PC 5150. Зокрема, переважну більшість персональних комп'ютерів протягом останніх 30 років складають так-звані "IBM-сумісні". Єдиний конкурент, який вижив (хоча, велику частину часу саме виживав на межі) -- Apple.  А станом на зараз із процесорних архітектур "персоналок" залишилися лише x86. Яких, правда, починають підтискати знизу ARM-ми, проникаючи "на стіл" з ринку вбудованих пристроїв -- смартфонів, планшетів, та їм подібних. Може чергова революція назріває. :-)

Проблема в тому, що ні про що подібне ніхто тоді, в 1980-81, не думав. Тому процесор, 8088, вибрали такий, щоб тільки підійшов, в схемах економили на сірниках. Так як DOS надавав зовсім мало сервісів за межами підтримки файлової системи (нє, ну Disk Operation System :), програмне забезпечення часто працювало із залізом напряму та відмовлялося працювати на машинах із тим же процесором, але іншими нюансами реалізації шини/таймера/виводу зображення на дисплей, і т.д. і т.п. Тому не до кінця сумісні апаратно архітектури повідпадали, а зафіксовані фішки і заморочки реалізації, десятки їх, все ще актуальні. Наприклад лінія A20, разом із керуванням нею за допомогою контролера клавіатури 8042, (див. також "Who needs the address wraparound, anyway?").

Більше того, та дорога веде й далі в минуле. 8086 був little-endian процесором, що створює багато незручностей зараз. Кому приємно, коли змінну:
word_val  db "AB";
завантажити в регістр:
mov    AX, [word_val]
то AX дорівнюватиме "BA"? Питання, чому він поводився саме так? Щоб бути, на рівні асемблера, якомога суміснішим із своїм попередником, 8080, 1974 року впуску (нагадаємо, що сам 8086 -- 1979). А чому так робив 8080? Щоб бути сумісним із своїм попередником, 8008, 1972 року. А той чому? Тому що емулював поведінку bit-serial процесора від Datapoint, якому, щоб вчасно побачити біт переносу, слід було спершу отримувати найбільш значимий біт. Власне, автор архітектури 8086 жаліє, що не відмовився у свій час від цього little-endiang, впустивши шанс покласти кінець самій проблемі Endianness.

Згаданий процесор, 8086, було розроблено "на коліні", щоб заповнити час до виходу наступного великого творіння Intel,  iAPX 432. Людина, яка розробила його систему команд, ніколи не займалася таким ні до ні після. (Див. його інтерв'ю: "Stephen Morse: Father of the 8086 Processor"). Обмеження архітектури жахливі, для прикладу, доступно не більше мегабайта пам'яті, (точніше -- адресного простору, за допомогою зовнішніх схем фізичної пам'яті могло бути більше), максимум шматками по 64 Кб, жодного механізму розмежування доступу (MMU). Інша справа, що, як подумати, i432 теж був тим ще монстром...

Багато гарних прикладів економії пари транзисторів там і сям є в самій архітектурі IBM PC, але по пам'яті їх не згадаю зараз. Тому лише один приклад.

8088 процесор міг працювати на частоті до 5МГц, однак IBM PC використовував 4.77МГц. Чому? Згідно Тіма Патерсона (батька DOS ;-), відомості якого підтверджують й інші джерела (тут і тут) було так. 8088 хотів хитрого тактового генератора, із імпульсами, шириною 1/3 від періоду (тобто, грубо кажучи, 1/3 часу на лінії мала бути логічна одиничка, 2/3 - нуль). Щоб забезпечити 5МГц, Intel пропонувала допоміжний чіп, генератор, 8284, який працював на втричі вищій частоті -- так він міг легко забезпечити 1/3:2/3 робочий цикл (duty cycle). З іншого боку, кольоровий відеосигнал, як це вимагав стандарт NTSC,  частота-підносій (це такий переклад слова subcarrier, див. тут) для кольорового сигналу була 3.579545 МГц. Здавалося б, до чого тут це? Справа в тому, що кольоровий сигнал для дисплея, CGA (чи телевізора, якщо виділеного дисплея немає), теж якось треба було генерувати. І тут інженери IBM зауважили, що якщо генератору тактової частоти 8284 задати частоту 14.31818МГц, то 1/4 від неї буде якраз потрібна частота субносія, а 1/3 -- 4.77273 МГц, всього лиш на 5% нижча від максимальної для процесора 8088. Інженери вирішили уникнути необхідності ставити додатковий генератор, (вартістю порядку 50 центів), ціною всього лиш 5% зниження продуктивності. Крім того, згідно Raymond Chen, частота таймера, 1.19318МГц, яка була рівна 1/4 від 4.77273 МГц, відповідала тривалості імпульсу приблизно 54.92мс, завдяки чому 65536 імпульсів складали приблизно 3600 секунд, якраз годину. До чого ця вся арифметика? Все дуже просто, 65536 це \(2^16\), максимальне число, яке можна представити в 16-бітному регістрі (а 8088 якраз 16-бітний), тому BIOS міг зекономити пару байт і пару тактів процесора, коли перевіряв, чи не минула північ -- порівнювати регістр із нулем трііішки простіше, ніж із константою.

Посилання для додатку 1:

__________

Додаток 2 -- важкий спадок минулого

Найкумедніше, що багато що, що стосується DOS 1.00, 1981 року випуску, залишається актуальним і зараз. Не вірите? ;-) Ось декілька найбільш очевидних та загальновідомих прикладів.

Імена файлів в стилі 8+3

Оті самі, для сумісності із CP/M. Ніби вже майже не актуальні -- старі файлові системи, типу FAT12/FAT16 відходять в минуле, як і Windows 9x (вони довгі імена підтримують, але тим не менше, зіткнутися з короткими цілком можна, швидше складно уникнути такого зіткнення).

Однак, див. статтю: "Why do operating system files still adhere to the old 8.3 naming convention?". Ну, то не так суттєво -- внутрішня домовленість Windows-ів це така справа. Рухаємося далі. Відомий судовий процес "Microsoft v. TomTom", крутився навколо того, що фірма, використовуючи Linux, порушувала патенти Мікрософт на FAT32. (Інші приклади див. "FAT32: Legal_issues") Не відволікаючись зараз на загрозу для Open Source світу взагалі (занадто широка тема), лише одне запитання. Які саме патенти? Наприклад, патент на генерацію коротких імен, формату 8+3 (типу "PROGRA~1") із відповідних довгих. Аналогічні позови були і до інших фірм, зокрема тих, що розповсюджують пристрої на Android. Все, крапка.

Так, обійти цю проблему легко. Існують патчі, які просто вимикають генерацію коротких імен (яка зараз не так часто актуальна, особливо на embedded-пристроях), але хто скаже, що це не слід DOS 1.00? :-)

До речі, суміжним є питання використання розширень для ідентифікації призначення файлів, але воно вимагає окремого великого аналізу.

Функціонування wildcard

А знаєте, чому A*B.TXT відповідатиме під DOS? (Та й під Windows воно відчувається -- дещо стало ідіомами, наприклад те, в шаблонах типу "bla-bla-bla.*", .* ігнорується, бо інакше *.* почало б ігнорувати файли без крапки в імені, тобто, в термінах DOS -- без розширення.) 

Переказувати не буду, але якщо справді цікаво, (в тому числі, якщо цікавлять  інші ідіоми сучасного Win32, пов'язані з впливом DOS 1.00), див.: "How did wildcards work in MS-DOS?". І до чого б, здавалося, тут організація FCB, запозичених з CP/M? ;-)

Чому існує символ кінця текстових файлів, Ctrl-Z?

В принципі, додавати його не обов'язково, але є така традиція. Походить вона із CP/M -- розмір файлу там міг задаватися лише кратно 128-байтовим записам, і треба було якось вказувати реальний кінець у останньому записі.  Ctrl-Z його й відмічав.

Див. також "Why do text files end in Ctrl+Z?".

Чому роздільником шляху є символ "\"?


А не більш звичний із UNIX-ів "/"?

DOS 1.x не підтримував директорій. При тому, так вийшло, що "/" було використано в ролі символу опції (ось як "-" в UNIX/Linux). Потім з'явився DOS 2.0, з'явилися директорії, і їх в шляху якось треба було відмічати. Розробники пішли шляхом UNIX, однак "/" вже був зайнятим! Тому використали схожий на нього "\". Правда, зробили так, щоб в шляхах розпізнавалися обидва символи, і залишили можливість переключати символ опції:  "SWITCHAR=" в CONFIG.SYS.

Детальніше див.: "Why is the DOS path character "\"?".

Працюючи з програмами з Linux-світу (наприклад MinGW/MSYS) під Windows, постійно об це спотикаюся, не зважаючи на часткову взаємозамінність "\" і "/"...

PRN, AUX, NUL, CON

Був собі DOS 1.xx, який знати не знав ні про які директорії. Але файли для деяких пристроїв мав: PRN, AUX, NUL, CON. При чому, щоб було зручно ними було користуватися, вводилися деякі додаткові припущення.

Наприклад, працює собі асемблер. Розширення asm вхідного файлу додумує сам. Виводить результати у файли із тим же іменем, що й вхідний файл, але іншими розширеннями. .OBJ -- об'єктний файл, лістинг -- .LST.

A>asm foo    the ".asm" extension on "foo" is implied
Assembler version blah blah blah
 Source file: FOO.ASM
 Listing file [FOO.LST]:     just hit Enter to accept the default
Object file [FOO.OBJ]:     just hit Enter to accept the default


Однак, припустимо, користувач не хоче зберігати лістинг, хоче зразу його надрукувати. Він може ввести PRN як ім'я файлу лістингу. Проблема в тому, що асемблер вважатиме, що виводить файл із іменем "PRN.LST". Щоб система все ж працювала, як заплановано, було вирішено, що після імен пристроїв розширення ігноруватимуться.

Потім з'явився DOS 2.x і директорії. Однак, старі програми, які працювали з диском засобами DOS 1.xx, про них нічого не знали. Вирішено було, що вони бачитимуть як звичний їм корінь диску поточну директорію. Але тоді, щоб вони могли працювати із тими зарезервованими іменами пристроїв, довелося робити вигляд, що такі файли існують в кожній директорії.

Тому ми до сих пір не зможемо штатними засобами DOS/Windows створити файл з іменем PRN, AUX, NUL чи CON та будь-яким розширенням. Гірше, якщо його таки створити іншими засобами, (або натрапити на мережевих дисках), зробити з ними щось, хоча б видалити, стандартними засобами буде теж неможливо.


Додатково див:
"What's the deal with those reserved filenames like NUL and CON?", (саме там взято фрагмент виводу асемблера вище).
"From a Feature to a Bug".
"How to Remove Files with Reserved Names in Windows".
"Cannot Create Windows Folder Named Con" -- навіть конспірологам (конспірОлухам, я б сказав), воно сподобалося.

(UPD. 13-07-2013)  "Why is the syntax for touching a file from the command prompt so strange?" Гарна цитата звідтіля:
I dont know where the two-comma version came from, but it most likely exploited a parsing glitch in COMMAND.COM, and somehow this variant gained traction and became the version everybody used. <skipped> As a result, this weird syntax has become grandfathered as a special-case in the CMD.EXE parser. Here's some actual code from the part of CMD.EXE which parses the arguments to the COPY command:
if (parse_state == SEEN_TWO_COMMAS)
    copy_mode = TOUCH;

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

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