Reviews / articles about OS/2 |
Operating systems: ArcaOS, eComStation, IBM OS/2 Warp |
|
|
DATE: 2002-06-20 09:24:04 AUTHOR: Pavel Shtemenko
Детство было трудное и ПрелюдияПолгода назад на канале #netlabs в разговоре с |lou| я упомянул, что если будет время, то я сделаю загрузку с JFS. "it's impossible" - таков был ответ. Но ведь для exUSSR программистов преград нет? (зал встает и хором поет "Интернационал"). Действие 1. Воспоминание о прошломЯ не буду рассказывать, как я всерьез занялся ей.. Было время, а желание подогрели. Я рассчитывал, что если IBM предусмотрела вариант "загрузки по минимуму", то мне это выльется в 2 недели. Но ... сразу скажу, что загрузку пришлось делать по варианту "масимум+". Первое, во что я уткнулся, это то, что за 5 лет активного простоя в написании программ на ассемблере, я успел его подзабыть и в очередной раз убедился, что надо знать не язык ASM86, а компилятор, которым пользуешься (возгласы в зале: "Да ты его и не знал никогда!"). В данном случае был применен ALP. В освоениях и воспоминаниях прошла неделя с написанием собственно того, что прописывается в бутблок и иже с ним. Все это было не так сложно и достаточно быстро написалось. Действие 2. Изменения формы, длины и местоположения глазДо того, как я взялся за загрузку, я считал систему OS/2 достаточно документированной. Не такой, как хотелось бы (кто работал в RSX11M меня поймет), но значительно лучше, чем все остальные PC-системы, с которыми я работал. Первое, во что я воткнулся - это с какого адреса что грузить? По документации я должен загрузить OS2LDR и передать ему заполненную таблицу - тут не было вопросов. Но главный вопрос, с какого адреса загружать OS2LDR так и остался открытым. Единственное, что следовало из интенсивного раздумья над докой - его нельзя грузить вплотную к видеопамяти, потому как он себя потом туда должен переписать (возгласы в зале: "Читать не умеешь!"). После некоторых раздумий было выбрано круглое число 1000h. Но тут сразу подкрался клинч - в этом случае я не смогу грузить свой загрузчик в нижние адреса. Так как OS2LDR потом себя переписывал вплотную к видеопамяти для расположения своего загрузчика, было выбрано не менее круглое число 8000h. Практически сразу выяснилось, что одного загрузчика с бутблока - недостаточно, хотя в доке нигде явно не указано, что обязательно нужен максимальный вариант загрузки, посему был сделан пустой файл изображающий os2boot и началась битва за загрузку OS2KRNL. Первое ползновение глаз вверх было когда я увидел, что доавроровские ядра читаются блоками по 80к, второе - когда я увидел адрес выделяемого мне буфера для чтения с адресом на конец сегмента. Ладно, сказал я себе и написал процедуру LeftRightDress. Глаза начали приобретать сферическую форму когда я обнаружил, что в компорт могут писать или мой загрузчик или OS2LDR, а вместе не получается... Ладно, сказал я и воткнул еще одну плату с двумя ком-портами. Битва с загрузкой ядра шла около недели с переменным успехом, а как только раздобыл OS2LDR с выводом дебага в компорт, так через пару дней я все и закончил. Имея на руках лог загрузки с HPFS, оставалось привести свой загрузчик к нему. При этом выяснились весьма любопытные вещи. Например, документированное ограничение miniIFS в 62 килобайта.. оказалось, что miniIFS на этой стадии загрузки может располагаться только в одном месте (в документации об этом ни полслова) - сразу после векторов прерываний, соотвественно с адреса 1000h-62килобайта. Наконец, исправив свою ошибку при чтении, когда блок переходит с сектора на сектор, я получил тестовый вывод с загруженного кернеля при обращении к моей miniIFS. Я возрадовался с товарищем на пару бутылок коньяка, теперь мне доступны INT 3 и ядро с отладчиком, документированные вызовы и никакого хакерства. (в зале качания в такт распевамому псалму "нет фирмы, кроме IBM и OS/2 пророк ее"). Действие 3. Грабли - это орудие производстваСделать miniIFS годную для отладки, имея на руках уже отлаженную загрузку с бута было не так сложно и я прошел этап функций MFS_* достаточно быстро. Ну где-то дня за два (проверка ведь делалась перезагрузкой). Добрался до стадии, когда miniIFS должна изображать из себя полноценную FS с небольшими ограничениями, преимущественно, что нельзя писать и искать. Вот тут и начались чудеса. Сразу оказалось, что описания 32битных FS нет... Этот этап знаменуется открытием файла country.sys. Cделав все как написано было для 16 битных FS я получил заявку от ядра, что я живу не в той стране... ну предположим я и сам это хорошо знаю и намного лучше этого ядра (в зале отдельные выкрики "не трожь Расею", коммунисты встают и молча уходят). Начались копания, раздумья и совещания. Сначала выяснилось, что в некоторые достаточно важные структуры были введены дополнительные поля... потом выяснилось что по дополнительным полям работает только часть функций, а для другой части функций надо использовать прежние поля. Хмыкнув и оставив это на неисповедимость путей IBM резвенько дошел до окончания работы своей miniIFS. И тут наступаю на главную граблю - ядро не перемонтирует FS и оставляет часть файлов открытой.... все попытки заставить ядро перемонтировать FS остались безрезультатными... Крах на окончании... (возгласы в зале - "Так тебе и надо!", "Прочь девелоперские руки от IBM!") Тут я вспоминаю, что у меня есть FreeJFS, в которой я могу делать правки. Задавшись целью минимизировать изменения в jfs.ifs пришел к варианту получения адресов нужных процедур, чтобы позвать их самому. Сказано - сделано. И о чудо! Загрузка произошла. Отпразновав как следует день радио и победу, с утра был тока в состоянии переписывать систему и проверять разные варианты загрузки.... Вот тут все и началось. Выяснилось, что работает только тот вариант, на котором я разрабатывал загрузку, перепробовав под пиво порядка 10 вариантов, понял что надо трассировать. (возгласы в зале "Мы знаем кто глючит!") Действие 3. Враг неизвестенЯ до сих пор не знаю, почему для разработки я выбрал тот вариант, который входит в число немногих вариантов, которые могут работать... Итак трассировка, потом опять трассировка, потом снова трассировка.... Опыты показали, что если только один раздел в системе и он JFS, то ядро на пару с os2lvm.dmd считают, что разделов вообще в системе нет (возмущенные возгласы в зале "JFS чморят!!!"). Если есть хоть один раздел с HPFS, то я по загрузке получаю запрос на монтирование этой FS n раз, где n = количеству партиций на этом диске. Если известных OS/2 разделов K, а вообще разделов N, то количество разных запросов на монтирование K и потом N-K раз повторяется последний. Уже ничему не удивляясь начинаю искать варианты при которых почти каждый сможет сделать себе загрузочную JFS. К моему вящему изумлению, это оказался вариант из 2х разделов JFS... Обнаружив при этом, что загрузка с primary controller + master disk + primary partition обязательно должна иметь букву назначенную LVM "C:", ессено при тех же условиях slave disk должен иметь букву "D:" и с радостью отметил - IBM таки логична. Начинаю делать вариант подходящий для рядового юзера... Тут обнаруживается, что UJFS.DLL при проверке диска всегда ставит драйв как 80h (первый диск на первом контроллере) и UJFS.DLL от релиза авроры почему-то затирает старшие биты в первых трех байтах... октябрькая UJFS.DLL ставит только драйв не затирая загрузку. Посчитав это происками шпиёнов MS внутри IBM, нелегкой рукой вписал ограничение - первый диск only. (волнения в зале, плавно переходящие в сражения на дискетах). Действие 4. Ужас глубинПрорываясь к возможности загрузки как таковой, ессесно в тылу оставались окруженные (но не сдающиеся) части регулярных модулей IBM. Первое, с чем начал воевать - это с хелперами мини IFS. Это было достаточно просто: поменяли один на другой, вместо съезжающего с дорожек хелпера чтения диска был написан свой, работающий через биос (повторяющиеся восклики в зале "Но мы-то знаем, кто глючит!"). Конечно, при этом пришлось самому следить за смещением от начала диска, но это в принципе не так сложно. Следующим в плане планомерной осады, стояла репликация журнала... К моему величайшему изумлению журнал таки реплицировался сам, по нормальному завершению (типа CAD или shutdown), оставались варианты внезапного нажатия Reset или выключения питания. Слегка поразысмыслив, понял, из-за не слишком вероятных случаев поднимать всю бучу репликации журнала и тормозить загрузку до предпоследнего безпредела не стоит (заметим, что ни HPFS ни FAT в таких же случаях гарантии не дает). Хотя замечу сразу, теперь для меня величайшая загадка IBM - это репликация пустого журнала по загрузке.... (возгласы в зале "Да ты гонишь..."). Радостно потирая руки, заглядываем в следующий пункт: необходимая правка JFS.IFS ! Сначала был использован легкий путь, когда пинаются все кто попадется под руку, дабы они отпинали IBMеров и заставили их добавить необходимый код (аж 10 строк на ASM). Как и ожидалось, IBM начала тормозить и отбрыкиваться всеми доступными ей методами. Надо заметить, методов за столетия своего существования, она накопила много... Ну в общем воз и поныне там, хотя на мой взгляд это практически единственный способ обеспечить 100% загрузку. Вспомнив Мичурина с его фразой "не надо ждать милости от ... , взять их самим - наша задача", полез рассматривать способы изъятия нужных мне адресов jfs.ifs у OS2KRNL. Мысль проста как 2 сероголубых свистка - просканировать таблицу GDT и найти нужный мне селектор. И сразу попадаю в первую засаду. В принципе загрузка происходит в кольце 0, но адрес таблицы селекторов выдается в линейном 32битном виде. А у меня загрузчик весь 16 битный с головы до пят... Ладно, сказал я и полез изучать наставления по девхелперному делу. Хелпер обнаружился, правда для употребления надо было использовать еще два хелпера (хорошо хоть для использования этих хелперов не понадобились следующие). Все хорошо и прекрасно, осталось добыть смещения до нужных мне процедур в JFS.IFS. Самый есстественный путь - это проглядеть LX заголовок JFS.IFS. И тут наступает вторая засада - сразу выясняется что она запакована... Прикинув "на глазок" сколько займет это кода и места, а у меня на все про все 62 килобайта из которых уже 32 использовано... Решил их вбить намертво. Решено - сделано. Начал проверять разные версии JFS.IFS и тут изумление мое достигло предела... IBM 16 битный код в JFS.IFS не менял до сегодняшнего дня.... (возгласы в зале "Пишут без глюков, не то что ты") ЭпилогВыводы неутешительные:
Выводы утешительные:
Рисунок: Операционная система загружена с JFS-тома, в чем можно убедиться с помощью программы LVM ПослесловиеАвтор выносит поименную благодарность:
А также всему каналу #os2russian за моральную поддержку. Использовано1 раб.сила, два компьютера, internet, 4 бутылки коньяка, 15 литров пива, 204 листа бумаги, 10 блоков сигарет LM, 500гр чая, 307 квтч, китайский фонарик, 2 свечи и один карандаш. Все использованные материалы не нанесли вреда окружающей среде и некоторые уже рециклированы. Редакторы: Eugene Gorbunoff, Deniska
Комментарии:
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
(C) OS2.GURU 2001-2021