Загрузчик QSINIT


QSINIT Итак Тетрис QSINIT. Что это?

Это такое небольшое 32-битное нечто, которое формально можно назвать мелким DOS-ом (и под которое можно писать свои приложения) и которое, попутно, является загрузчиком ядра OS/2.
А "Тетрис" потому, что самым первым приложением был тетрис.

Короткая история: все знакомы с проектом реверса осевого ядра - под названием OS/4. В рамках него есть свой штатный загрузчик ядра, внешне похожий на исходный от IBM - но на практике там довольно много нового. Основная проблема такого загрузчика в том, что это почти COM файл - т.е. файл размером < 64k, со сложной внутренней структурой, который обязан делать кучу дел, но умещаться, при этом, один 16-битный сегмент.

После долгих войн за каждый байт (тогда я ещё занимался этим загрузчиком), пришла в голову мысль написать нечто более удобное для практических задач. А таких задач на загрузке может быть масса:

Промежуточным итогом аж нескольких лет творчества является QSINIT - в нынешнем его виде :)

Бинарно - это два файла: OS2LDR и QSINIT.LDI, которые надо положить в корень загрузочного диска - и всё. Первый их них заменяет штатный загрузчик (который стоит забэкапить). Возможно создание меню - формат его описан в архивах c OS/4 тут же на сайте, меню полностью совместимо. Кто хоть раз ставил ядро OS/4 - знает как это делается, это простой ini файл.

Для кода бутсектора/загрузочной файловой системы этот OS2LDR ничем не отличается от родного загрузчика IBM, поэтому грузиться может как с FAT, так и с HPFS/JFS.

Без OS/2, возможна отдельная установка на FAT/FAT32 раздел, в этом случае QSINIT заменяет код бутсектора и грузится оттуда сам.

QSINIT может грузиться с FAT32, но загрузка OS/2 с неё не поддерживается уже ядром и fat32.ifs. Однако, это позволяет делать "ремонтные флешки" / телефоны ;) если записать загрузчик на SD карту и карта видна биосу.

Что внутри? QSINIT - 32-битный рантайм, работающий в PM. Больше всего он похоже на DOS4/GW приложения (кто-то помнит? ;). Формат запускаемых модулей - LE/LX, компилятор - ватком. Приложения хранятся в этом "втором файле" - QSINIT.LDI, это обычный zip архив. При загрузке создаётся временный виртуальный "системный" диск в памяти и содержимое этого архива просто туда распаковывается. Затем запускается либо загрузка ядра, либо меню выбора ядер / меню приложений, если OS/2 на диске нет.

Меню выбора ядра выглядит так же, как в загрузчике OS/4:
Kernel selection

Но есть несколько отличий в возможных операциях:

SysView.

Это такое "сборное" приложение, написаное на старом добром Turbo Vision, куда добавляется всё, что требует "обширного интерфейса" ;) Мыши нет, но диалоги не так уж велики и проходятся кнопкой Tab.

Тут собрана работа с дисками (см. ниже), стандартный текстовый редактор (из кода Turbo Vision же, был в скриншоте выше), разные меню загрузки, просмотр встроенного лога QSINIT, CPU info, просмотр/редактирование физ.памяти, итд.

Диалог CPU info делался из тестовых соображений (хоть кто-то помнит в деталях все фичи всех новых моделей процессоров? ;)
Q6600 i5-3450

Работа с дисками.

Полный список разделов на всех дисках можно вызвать прямо из меню приложений - кнопкой F7.

В более удобном виде оно присутствует в диалоге Disk Management в SysView. И есть команды шелла, которыми делается то же самое.

Что можно делать: Чтение с FAT32 в QSINIT кэшируется. Кэш работает без отложенной записи, чтобы не создавать лишних проблем, загрузочный раздел не кэшируется вообще - по этой же причине :)

Образцом производительности кэш не является, но с ним, копирование с диска на диск (с помощью BIOS!) быстрее нашего удивительного драйвера FAT32, работающего через SATA/AHCI :) На копировании свалки файлов средних размеров (около 20Gb с диска на диск) на далеко не новом G41 чипсете - получается ~30 Mb/s.

Единственная проблема с доступом к FAT в настоящее время - никаких русских имён файлов, вообще никаких имён в национальных кодировках. Возможно, это будет исправлено.

500Gb и OS/2.

Виноват в проблеме, как всегда, МежДелМаш aka IBM :) В IOCTL доступа к дискам чтение происходит не по LBA номеру сектора, а по дремучим значениям CHS, которые, к тому же 16-битные.
В итоге, физический диск в OS/2 ограничен 65536 x 254 x 63 - примерно 512 гигабайтами пространства.

Хитроумная фрау Даниэлла придумала решение - её DANIS стал отдавать CHS геометрию с числом секторов 127 и 255, вместо максимальных 63. Этого достаточно для дисков до 2Tb, но - таблица разделов, которую создаёт при этом LVM - некорректна по "классическим" канонам. Значения CHS там просто битые и попытка загрузиться с таких дисков в лучшем случае приводит к ошибке, в худшем вешает отдельные загрузчики и операционные системы ;)

Однако, будучи вторым диском в системе - такой диск мирно уживается со всеми, поскольку LBA значения в таблице разделов вполне корректные.
Вот пример этой разбивки - LVM info диска размером 1 Tb: 60321 цилиндр и 127 секторов на трек:
Disk with 127 sectors per track

Как вылечить эту проблему? Перейти на другой IOCTL - здесь мяч на стороне Менсиса, который сейчас формально отвечает за систему.
Нынешний способ доступа, в добавок, отрицает диски больше 2 Tb, хотя их можно было бы использовать целиком, представив остаток выше 2Tb как отдельный диск со своей MBR (подобный драйвер есть, например, для XP).

Вот пример USB диска, неокученного LVM (и уже несовместимого с ним, поскольку размер > 500Gb, а разбивка диска "нормальная" - в 63-секторной геометрии. При попытке записать LVM info об этом будет сказано):
Disk without LVM info

Для самых смелых (aka работа с разделами дисков).

Эта функциональность пока слабо тестирована, поэтому рекомендуется к использованию только на чистых дисках ;) Разделы создаются по "классическим" канонам - т.е. начало и конец выравнены на цилиндр.

Создание primary почти безопасно, logical - теоретически может убить все logical разделы на изменяемом диске - в силу сложности работы с extended partition, но практически - этого не делает :)

Да, и всегда есть LVM, miniLVM, dfsee и тьма партишнмагиков / fdisk-ов под другие платформы. Но как же не написать свой? ;)

Пример: много свободного места, надо его как-то применить
Free space

Создаём небольшой (100 Gb) раздел в конце:
Make small
остальное честно делим пополам:
Make step 2 Make step 3

Форматируем наш небольшой (100 Gb) раздел в FAT32, но по глупости выбираем Long format.
Quick здесь - быстрый формат, без чтения поверхности, Long - чтение (поиск бэдов), Wipe - запись старого доброго байта F6 на весь диск.
Long format

ждём... ждем... ну его нафиг, долго:
Formatting... Break format

Выбираем Quick, готово:
Format ready

Желающие поставить метку диска могут сделать это из шелла командой LABEL ;)

Для самых пытливых (aka посекторный редактор диска).

Ближайший аналог этого редактора - diskedit из NU (опять же, кто-то помнит? :))
Функциональность сравнительно небольшая - редактирование, копирование секторов, запись в файл и из файла, поиск по диску и возможность посмотреть сектор в виде MBR / бутсектора.

При боязни пробовать редактор на реальном диске - объектом издевательств может служить виртуальный диск самого QSINIT, который можно изменять наравне со всеми. Но не стоит забывать, что с него запускаются все приложения, включая этот самый редактор :)

На скриншоте в списке доступных для редактирования - виртуальный диск, загрузочный раздел, жесткий диск и вставленная флешка, в фоне - данные корневого каталога виртуального диска:
Edit virtual disk

Сохраняем MBR (0-й сектор) в файл:
MBR save

Ищем строчку на диске, в данном случае описание точки монтирования в регистри Windows XP:
Search on disk Searching...

Панорамные страсти.

Немного про "панораму" - наш славный VESA драйвер, умеющий ставить Write Combine и, делая shadow буфер, показывать дольно неплохие fps (несколько сотен в секунду на полном обновлении экрана). Только делает он это не всегда ;)

Многие годы в коде установки Write Combine жила ошибка (LightElf говорит, что виноват Ларс :), благодая которой Write Combine никогда не ставился на PC с размером памяти от 4Gb и выше - даже если и говорил обратное. На некоторых моделях Асуса владельцам везло, но это редкость.

Сейчас Менсис этот баг исправил и, традиционно, привязал новую версию панорамы к своему ACPI, который привязан к своему ядру и загрузчику. В общем, платите юзера дорогие ;)

Однако, с наличием QSINIT - никто не мешает нам поставить Write Combine самостоятельно, изменив MTRR регистры до старта ядра. Поскольку часть загрузчика остаётся резидентной - эти значения получается скопировать и остальным ядрам после их старта.

Для работы с MTRR в шелле есть одноименная команда, умеющая менять всё, что вообще возможно. Помимо установки Write Combine с её помощью можно забавно издеваться над PC - например превратить квад в 80286 - просто выключив кэш :) Наберите MTRR OFF. Или выставить WC памяти текстового режима (видеоэффекты на встроенном интеле непредсказуемы). В целом - рекомендуется изучающим тему ;)

Установка Write Combine может быть автоматизирована - считать его вручную, думаю, готовы не все :).
Просто записываем в файл qssetup.cmd (аналог autoexec/startup.cmd) в корне загрузочного диска строчку vmtrr и этот VMTRR прочитает из VESA адрес видеопамяти, найдёт на PCI шине устройство, к которому она относится и поставит Write Combine на полный диапазон адресов этого устройства (видеокарты, очевидно).

Бывалые борцы с MTRR могут изучить регистры до и после установки:
MTRR with no WC MTRR with WC on

С учётом того, что поддержка VESA в QSINIT есть - есть и графические режимы. А раз так - почему бы не быть и виртуальной консоли? ;)

Был, ведь, заметен разный размер скриншотов выше? Здесь, например 100x37.
Возможна и загрузка файла с битовым шрифтом (типа тех, что были в русификаторах доса когда-то).
Mode command

Эта часть не совсем логически закончена - нельзя, например, добавить свой произвольный текстовый режим - но, надо надеятся на лучшее... ;)

PXE.

Помимо загрузки с диска, при помощи пакета PXEOS4 от Моветона QSINIT грузится и по PXE с сервера.

Работает QSINIT, при этом, так же - читает свой ZIP с приложениями и распаковывает его на виртуальный диск, что позволяет, скажем, просмотреть конфигурацию бездискового PC.

Собственно, одной из целей такой фичи при разработке был спортивный интерес - скопировать OS/2 (аврору, например) с другого PC вообще без применения флешек и инсталляционного CD :)
Это реально, если сделать небольшую промежуточную копию системы без PM, работающую на FAT.
Алгоритм: Конечно, всё это можно проделать и более простыми способами ;) - но возможность обойтись без флешки (и без драйвера сетевой карты!) - в любом случае не мешает. Тем более, что во всех встроенных картах (реалтек, атерос) PXE есть и, обычно, работает.

Загрузить OS/2 по сети можно с помощью PXE из WSOD (но он, в отличие от PXEOS4, не позволяет запрашивать с TFTP сервера произвольные файлы), ну, или, если Моветон допишет PXEOS4 до поддержки полной загрузки ;)

Рамдиск в памяти выше 4Gb.

Ещё одной проблемой полуоси является неспособность работать с памятью выше 4Gb (ядро не умеет даже PAE).

При этом, на обычном PC с 4Gb памяти - 500-700 метpов сходу пеpемаплены выше этой гpаницы. Т.е. "простая 32-битная система" видит 3.2-3.5 Gb памяти, а остаток доступен только 64-битной или умеющей расширенные страничные режимы (типа PAE).

Но жаба-то душит, душит ;)

Для лечения асфиксии в QSINIT добавлено создание "виртуального HDD" из этой памяти. Не только из этой, впрочем (можно частично или полностью использовать и обычную).

Для этого диска есть BASEDEV драйвер для OS/2, который представляет его тем же отдельным HDD. Более того, с него можно загрузить систему. Т.е. грузим QSINIT, например, с флешки (или по PXE), создаём виртуальный диск (гарантированного размера), распаковываем туда большой zip с системой (прочитав его с флешки / по PXE) и запускаем с него загрузку.

Диск может быть отформатирован в FAT/FAT32 (для прочих систем надо писать поддержку записи и форматирования). Что не мешает уже в OS/2 из startup переформатировать его во что угодно.

Можно просто использовать эту память как некое "посекторное хранилище" (что намного быстрее, чем работа через дисковый API).

Да, внутри драйвер для OS/2 довольно забавен - он на лету меняет страничный режим в работающей 32-битной системе на PAE и назад ;)

Несколько замечаний по выбранным решениям.

Общие принципы функционирования "системы" QSINIT: Причины именно таких решений:

Копирайты и прочее.

Торжественно уведомляю, что при написании QSINIT не пострадал ни один юниксоид. Т.е. в продукте нет ни строчки GNU кода и лицензия, под которой он распространяется несовместима с GNU.

Из стороннего кода использованы: Остальное содержимое QSINIT - шелл, загрузка модулей, загрузка ядра, работа с железом, итд - написаны с нуля. Код доступен в виде исходников в SDK.

И последний вопрос - а зачем всё это, не лучше ли iOS и ондроид? ;) Ответ прост - скучно :) Когда всё готово, когда кругом ява и C++ и 100500 мегабайт памяти и каждый чих увешан вызовами MySQL и лайками. Можно считать это ностальгией по старому доброму творческому процессу и временам, когда компьютеры уже не были большими, но ещё и не стали маленькими ;).

Не знаю - хорошо ли получилось, но потраченного времени, в общем, не жаль :)
Развлекайтесь и вы ;)

  Автор.

p.s. свежие версии обычно тут: FTP, HTTP.


Интересные ссылки: Доходных для бизнеса.
Комментариев к странице: 7 | Добавить комментарий
Домой | Проект ядро Core/2 | Проект OS/4 Download | Новости | Гостевая книга | Подробно обо всем | Нужные программы | Проекты | OS/2 FAQ | Всячина | За и Против | Металлолом | #OS2Russian | RDM/2 | Весёлые картинки | Наша галерея | Доска объявлений | Карта сайта | ПОИСК | ФОРУМ