...

воскресенье, 1 сентября 2013 г.

Добываем исходный код VM/370

Здравствуйте, уважаемые хабарчане!

Почти неделю назад я написал свой первый пост о VM/370. Первым комментарием к нему было совершенно справедливое замечание:


Весело, конечно, но «полотно» состоит в основном из выводов команд. Если честно, гораздо интереснее прочитать не только про саму установку системы, но и про её «кишки», как, что, да почему.

Исследовать исходники VM/370, к примеру.





Да, действительно, туториал по установке мягко говоря устаревшей ОС интересен только в общепознавательном плане как демонстрация ее возможностей. А вот описание принципов работы с цитатами из исходников — другое дело. Тем более, что исходники доступны. Проблема только в том, что подобное описание — дело серьезное.

Принципы работы VM/370 описаны в этом трехтомнике. Сам исходный код — сравнительно небольшой, «всего» двести тысяч строк на ассемблере — CP и примерно столько же — CMS. Но работа все равно предстоит капитальная.

В этой статье я не ставлю перед собой задачу даже начать цикл о внутренностях VM/370. Я только объясню как я извлек исходный код VM/370 в читабельном формате. В процессе извлечения я узнал кое-что интересное про работу с VM/370.


Распаковка ленты в CMS




Объем ленты с исходниками — около тридцати мегабайт. Будучи совершенно уверенным что файлы хранятся на ленте в несжатом виде, я просто разделил этот объем на емкость цилиндра 3330 и вычислил, что для сохранения всех исходников мне понадобиться 130 цилиндров. Потом это конечно оказалось не так (видимо, какое-то сжатие все-таки происходит, размер распечаток — ок. 40 мегабайт), но к счастию лента состояла из нескольких томов, и я просто распечатал их один за другим.

Итак, добавим в каталог, в описание пользователя MAINT, строку:

MDISK 192 3330 200 130 CPR6L0 WR READ * SOURCES




Примечание: весь процесс я выполнял под пользователем MAINT. Вообще говоря, это — злостное нарушение правила «не работай под рутом» и так делать нельзя.

Запустим VM, залогинимся как MAINT, запустим CMS. введем перфокарты с описанием каталога и обновим его командой «DIRECT MYVM». Перелогинимся (чтобы изменения учетной записи вступили в силу). Подключим диск 192 (командой «access 192 b») и ленту с исходниками. Загрузим первый том архива (исходники CP) командой «VMFPLC2 LOAD * * B».

Распечатка




Я долго не мог найти способ распечатать несколько файлов одной командой. Дело в том, что команды PRINT и PUNCH ругаются на звездочки в имени файла. А печатать пятьсот штук файлов вручную что-то не хотелось. В конце-концов я решил, что проще всего будет написать программу распечатки на ассемблере, но роясь в мануалах по ассемблеру, нашел более легкий способ.

У команды LISTFILE (аналог DIR/ls) есть опция (EXEC. Если запустить LISTFILE с этой опцией, LISTFILE создаст файл (файлы EXEC — это аналог bat/sh), со строками вида &1 &2 . &1 &2 — это параметры скрипта.

Теперь внимание! При запуске команды CMS PUNCH, в каждой строке файла CMS EXEC вместо &1 будет подставлен PUNCH, а затем строка выполнена. По-моему, это самое лучшее решение инженеров IBM в области пользовательского интерфейса (хотя и ненужное в Linux при наличии awk).

Я поэкспериментировал с различными распечатками и решил, что PUNCH лучше чем PRINT.

Примечание: геркулесовский вывод перфокарт настроен на формат EBCDIC. Чтобы получить читабельный код, надо перенастроить его на ASCII командой «ATTACH D ./sources/DMK.txt ascii».

Итак, создаем список файлов:

L * * B (EXEC




И выводим их:

CMS PUNCH
...длинный список файлов.




Уже когда все закончилось, я догадался, что имело смысл добавить в CMS EXEC первую строчку &CONTROL OFF (аналог echo off). Да, не застал я не то что VM/370, но даже и элементарный MS-DOS.

Разделение файлов




В результате предыдущих манипуляций, я получил файл DMK.txt со склеенными вместе исходниками. Теперь их надо разделить. Для этого я применил такой скрипт на awk:

/^MAINT MAINT MAINT MMMM AAAA IIII NNNN TTTT$/ {next}
/^USERID/ {next}

$1==":READ"{
MYFILE="./DMK/"$2 "_" $3
next
}

{
print $0 > MYFILE
}




Прошу прощения за г-код, писалось на коленке и не с целью читабельности/эффективности.

Теперь таким же образом можно вывести исходники CMS (условный код DMS), RSCS (условный код DMT, название Remote Spooling Communication Subsystem немного путает, но это в каком-то смысле аналог fido) и IPCS (условный код DMM, системные тесты).


Ссылки




This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends:



Комментариев нет:

Отправить комментарий