|
ArcaOS 5.0 Русская версия
Пакет русификации ArcaOS 5.0 OS/2 давно доступен.
Поддерживается любая версия: 5.0, 5.0.1, 5.0.2.
eCo Software может выпустить и другие пакеты
(Немецкий, Голландский, Бразильский Португальский, Испанский, Шведский и т.д.)
|
Пришло время JFS (часть вторая) |
TITLE: Пришло время JFS (часть вторая)
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.ifs и убрать глюки с os2lvm.dmd
- для того чтобы делать бут при формате диска, надо менять UJFS.DLL (ну ее и так
править надо)
Выводы утешительные:
- загрузка возможна и уже есть, как бы это не нравилось IBM.
- LVM можно и снести, да и Даниэла там что-то на тему os2dasd писала...
- есть исходники JFS и ее можно довести до нормального состояния в обозримое время
Рисунок: Операционная система загружена с JFS-тома, в чем можно убедиться с помощью программы LVM
Послесловие
Автор выносит поименную благодарность:
- IBM - за передовые достижения в логике и развитии OS/2
- gerash - за советы и празднования достигнутых результатов
- sunlover - за советы, веру в документацию и терпение выслушать
не всегда ясно излагаемые проблемы
- froloff - за периодическое дерганье и подталкивание
- Samm - за обещание напоить пивом, когда будет загрузка
- os2bird - за совет ставить mov ax,seg DATA16 вместо mov ax,DATA16
- [zuko] - за приведение цитаты из документации по процессору в
нужное для меня время и темы для "возгласы из зала"
- e-co - за убеждение меня заняться загрузкой
А также всему каналу #os2russian за моральную поддержку.
Использовано
1 раб.сила, два компьютера, internet, 4 бутылки коньяка, 15 литров пива, 204 листа
бумаги, 10 блоков сигарет LM, 500гр чая, 307 квтч, китайский фонарик, 2 свечи и
один карандаш. Все использованные материалы не нанесли вреда окружающей среде и некоторые
уже рециклированы.
Редакторы: Eugene Gorbunoff, Deniska
Комментарии: Timur Kazimirov 2002-06-20 09:59:47 | Куль!!! Только вот... Пива что-то подозрительно мало было выпито... ;-) | Sergey Posokhov 2002-06-20 12:03:45 | Преисполняясь уважения снимаю шляпу. Это самая удивительная статья про OS/2, которую мне приходилось читать ! | Sergey Poziturin 2002-06-21 02:22:46 | Молодец. | VAD))) 2002-06-21 17:57:13 | Крут [Pasha] и дело его круто. И статью написал неслабую. Браво! :) | vladest 2002-06-21 18:03:37 | А давайте побъем Lou??
он еще хуже бимеров :-\ | Eleph 2002-06-21 18:21:48 | "Мочи их!"- закричали лохи...
2[Pasha]: Класс!!! (В зале бурные и продолжительные аплодисменты, местами переходящие в овации...) ;))))
Как бы айбиемеров-то пнуть? Сильно... Или они-таки совсем плохие... ;((( | taxman 2002-06-21 19:38:11 | Паша!
Надоест JFS - переходи на детективы! :) | Stepan Kazakov 2002-06-22 08:57:31 | бpаво, маэстpо, текст написан мастеpски!
пpо остальное - не знаю, не знаю.. ;)
(многочисленные возгласы из зала) | kamuzon 2002-06-22 10:31:48 | Восторг! нопасаран. | RElf 2002-06-22 10:48:14 | Паша, а не хочешь написать подробно все технические детали, которые ты обнаружил, дабы восполнить пробелы в документации? | EvgenSK 2002-06-24 21:59:38 | Эта. А на буржуйский перевести в морду некоторым ткнуть ? | porro 2002-06-25 05:43:11 | I'm ready to translate this wonderful atricle into English if the author don't mind ;-) I'll try to save all peculiar moments in it, I swear ;-) | porro 2002-06-25 05:43:59 | Sorry for misprints, I'm short of time in the I-net :( | GPV&KGB 2002-06-26 16:42:39 | Теперь бы в самый раз потамагочить МежДелМаш на предмет вделать загрузку с JFS в очереденую версию Авроры (ACP3?)... | FonMax 2002-06-27 01:02:39 | Вот чудеса.. а вещали, что энто inpossible.. Встаю и хлопаю в ладошки, неимоверно ожидая технических подробностей. | Oxyd 2002-06-27 08:15:05 | В очередной раз убеждаюсь, что в OS/2 можно сделать даже то что нельзя :) | MadInt 2002-06-27 11:36:36 | А вот у меня такая мысль - почему бы смещение нужных фунок в jfs.ifs не брать из .sym-файла?
Помниться такой примерно трюк делает для OS2KRNL драйверок win32k.sys из поставки одина... | Andy Porro 2002-07-08 03:34:44 | Hi guys!
I have this article translated and if somebody is interested in that fact I can as soon as I find the way to download translated file give it to public.
2Author.
1. Seems to me somewhen I saw a boot process description with all addresses and steps mentioned in the PC-hardware description. Try to find it.
2. I have some doubts that it is possible to remove LVM, does you program work with JFS volume splitted over two or more disks? I guess no. I don't know either you are aware or not, but LVM stores additional information about drive letters and so on in the boot sector, I suppose you have some trouble due insufficient information about LVM compatible software. | Михаил 2003-09-04 15:56:11 | А как можно снести lvm ? А то он, сволочь, не полностью видит диск, в отличие от Fdisk а загруженного с дискет. | Михаил 2003-09-04 15:58:12 | Да и VCU при переносе системы на другой винт не всегда срабатывает - приходится менять размеры разделов (ACP2) драйвер danis506 |
Прокомментируйте эту статью (напоминаем, автор работал над текстом несколько недель, уважайте мнение других).
|
|
Готовая eComStation на SSD диске
Последний активный опрос: Какая высота барьера RPM?
[Google]
|
IBM OS/2 Warp
|