Загрузчик QSINIT
Это такое небольшое 32-битное нечто, которое формально можно назвать мелким DOS-ом (и под которое можно писать свои приложения) и которое, попутно, является загрузчиком ядра OS/2.
А "Тетрис" потому, что самым первым приложением был тетрис.
Короткая история: все знакомы с проектом реверса осевого ядра - под названием OS/4. В рамках него есть свой штатный загрузчик ядра, внешне похожий на исходный от IBM - но на практике там довольно много нового. Основная проблема такого загрузчика в том, что это почти COM файл - т.е. файл размером < 64k, со сложной внутренней структурой, который обязан делать кучу дел, но умещаться, при этом, один 16-битный сегмент.
После долгих войн за каждый байт (тогда я ещё занимался этим загрузчиком), пришла в голову мысль написать нечто более удобное для практических задач. А таких задач на загрузке может быть масса:
- выбрать ядро/другой загрузчик
- запустить ядро с теми или иными параметрами
- посмотреть разбивку памяти машины, девайсы на PCI шине, итд
- сменить активный раздел на диске, а возможно и создать/удалить раздел
- запустить загрузку с произвольного раздела
- прочитать данные с big-floppy флешки или переразбить её
- восстановить LVM сигнатуры на диске
- поискать какие-то данные на дисках, отредактировать
- итп
Бинарно - это два файла: 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:
Но есть несколько отличий в возможных операциях:
- Стрелка вправо вызывает диалог настроек ядра.
Тут можно изменить почти все параметры, включая название самого ядра.
Для особых ценителей хардкора - запустить загрузку можно и из шелла, командой BOOTOS2 имя_ядра :)
- F9 вызывает меню приложений QSINIT.
В отдельной установке (без OS/2) оно показывается сразу после загрузки.
В одном из подменю скрывается тетрис, в другом - просмотр простого и детального списка PCI девайсов, таблицы памяти PC и проч.
Все пункты меню просто вызывают команды шелла или отдельные приложения, его содержание целиком настраиваемо.
Названия пунктов вполне говорящие:
- Disk management - вызов диалога работы с дисками, о нём ниже.
- Boot Manager - это не прямой его вызов, а своя обработка данных LVM.
Самого BM уже может не быть на диске, но если в LVM данных указано,
что раздел включён в его меню - он попадёт в список.
Правда, наличие этого меню - скорее, дело привычки: в диалоге Disk Management доступна возможность загрузки с любого раздела (если там есть что грузить, конечно ;).
- Power off - выключение PC, пока только через APM, которого уже нет на ноутбуках и
новых EFI биосах.
В команде POWER шелла есть и возможность suspend, но работающий APM suspend - это такой зверь, которого никто не видел ;) Хотя есть редкие биосы, где это возможно.
- Disk management - вызов диалога работы с дисками, о нём ниже.
- Использование для загрузки разделов.
В том же файле OS2LDR.INI можно описать список загрузочных разделов - чтобы получилось вот такое меню:
Это меню можно сделать стартовым - и вместо загрузчика OS/2 QSINIT становится загрузчиком разделов ;) Ось, XP, Linux у которого GRUB в бутсекторе раздела - работают без возражений. В качестве основного загрузчика оно, может и не так удобно - но запасного - вполне ;)
Плюс, в диалоге "Disk Management" можно запустить загрузку вообще с любого раздела - там просто есть такая опция.
У этой загрузки, правда, есть лёгкая грабля - A20 открыта и прерывания перемаплены на 50/70 - но с воплями помирает от этого только дрееевний HIMEM.SYS под досом. ;) Чуть менее древний (и сам дос) - грузятся.
- F3 - шелл QSINIT
Шелл - это просто шелл :)
Довольно простой шелл, без многих фич. Не готово, например, перенаправление ввода/вывода, формат форматирует только FAT16/FAT32, итд. Но совместимость с шеллом DOS/Win/OS2 вполне приличная. Все команды, перечисленные на этом скриншоте - работают (пример dir).
Вопрос может вызвать странное имя диска: 1:\.
Оно связано с используемым кодом работы с FAT (см ссылку в конце текста). Его автор применил альтернативное наименование 0:..9: вместо A:..Z:, а я не стал переделывать ;) A:..Z:, вернее A:..J: тоже поддерживаются.
Эти буквы - свои буквы QSINIT, они никак не связаны с буквой диска LVM и OS/2.
- 0:/A: - всегда загрузочный раздел. Если этот раздел - FAT/FAT32, то он автоматически примонтирован, с полным доступом (чтение/запись). Если это раздел, доступный через IFS (HPFS/JFS), то доступа к нему нет (micro-FSD api на загрузке не годится для нормальной работы).
- 1:/B: - виртуальный диск с приложениями QSINIT. Обычно он небольшого размера (1 Mb), расположен в памяти, при старте ядра память освобождается
- диски 2:/C:..9:/J: - буквы свободные для монтирования FAT/FAT32 разделов
жестких дисков и/или флешек (если биос их видит). Монтирование не сохраняется между
перезагрузками. Выполнить его можно или командой MOUNT или из диалога Disk Management.
Если вы долго мечтали написать FORMAT C: - теперь это возможно ;) Примонтируйте любой ненужный раздел на C: и вперед.
Смена буквы LVM тоже есть, но отражается она только в OS/2.
Синтаксис командных файлов тоже "в духе DOS" ;)
Пример рабочего cmd файла:
- F7 - показывает в консоли список разделов всех видимых через BIOS дисков.
GPT разбивка и диски больше 2Tb поддерживаются (если с нет проблем с их чтением). Привычный MBR тоже тут.
- F8 - показывает внутренний лог.
Он же доступен через компорт и отдельную команду в консоли.
- ну и F1 - покажет небольшой help, где указаны
некоторые, не совсем очевидные возможности ;).
SysView.
Это такое "сборное" приложение, написаное на старом добром Turbo Vision, куда добавляется всё, что требует "обширного интерфейса" ;) Мыши нет, но диалоги не так уж велики и проходятся кнопкой Tab.Тут собрана работа с дисками (см. ниже), стандартный текстовый редактор (из кода Turbo Vision же, был в скриншоте выше), разные меню загрузки, просмотр встроенного лога QSINIT, CPU info, просмотр/редактирование физ.памяти, итд.
Диалог CPU info делался из тестовых соображений (хоть кто-то помнит в деталях все фичи всех новых моделей процессоров? ;)
Работа с дисками.
Полный список разделов на всех дисках можно вызвать прямо из меню приложений - кнопкой F7.В более удобном виде оно присутствует в диалоге Disk Management в SysView. И есть команды шелла, которыми делается то же самое.
Что можно делать:
- монтировать FAT/FAT32 разделы, читать/писать на них.
- монтировать любые другие разделы и форматировать их в FAT/FAT32.
- создавать и удалять разделы в MBR и GPT формате разбивки диска.
- инициализировать чистый диск, прописывая ему пустую MBR и OS/2 LVM инфо (при желании) - или GPT.
В случае наличия LVM диск больше 500 Gb будет разбит в формате, совместимом с DANIS/последними AHCI. (детали про 500Gb - ниже). - работать с OS/2 LVM:
- апдейтить LVM инфо после создания раздела за пределами OS/2
- записывать LVM инфо на диск, если её там нет
- ставить/менять букву диска LVM, менять текстовое имя диска/раздела
- в редакторе секторов можно непосредственно покопаться в DLAT секторе, если вы, конечно, знаете, где он находится ;) Диалог сам пересчитает CRC после изменений
Образцом производительности кэш не является, но с ним, копирование с диска на диск (с помощью 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 секторов на трек:
Как вылечить эту проблему? Перейти на другой IOCTL - здесь мяч на стороне Менсиса, который сейчас формально отвечает за систему.
Нынешний способ доступа, в добавок, отрицает диски больше 2 Tb, хотя их можно было бы использовать целиком, представив остаток выше 2Tb как отдельный диск со своей MBR (подобный драйвер есть, например, для XP).
Вот пример USB диска, неокученного LVM (и уже несовместимого с ним, поскольку размер > 500Gb, а разбивка диска "нормальная" - в 63-секторной геометрии. При попытке записать LVM info об этом будет сказано):
Для самых смелых (aka работа с разделами дисков).
Эта функциональность пока слабо тестирована, поэтому рекомендуется к использованию только на чистых дисках ;) Разделы создаются по "классическим" канонам - т.е. начало и конец выравнены на цилиндр.Создание primary почти безопасно, logical - теоретически может убить все logical разделы на изменяемом диске - в силу сложности работы с extended partition, но практически - этого не делает :)
Да, и всегда есть LVM, miniLVM, dfsee и тьма партишнмагиков / fdisk-ов под другие платформы. Но как же не написать свой? ;)
Пример: много свободного места, надо его как-то применить
Создаём небольшой (100 Gb) раздел в конце:
остальное честно делим пополам:
Форматируем наш небольшой (100 Gb) раздел в FAT32, но по глупости выбираем Long format.
Quick здесь - быстрый формат, без чтения поверхности, Long - чтение (поиск бэдов), Wipe - запись старого доброго байта F6 на весь диск.
ждём... ждем... ну его нафиг, долго:
Выбираем Quick, готово:
Желающие поставить метку диска могут сделать это из шелла командой LABEL ;)
Для самых пытливых (aka посекторный редактор диска).
Ближайший аналог этого редактора - diskedit из NU (опять же, кто-то помнит? :))Функциональность сравнительно небольшая - редактирование, копирование секторов, запись в файл и из файла, поиск по диску и возможность посмотреть сектор в виде MBR / бутсектора.
При боязни пробовать редактор на реальном диске - объектом издевательств может служить виртуальный диск самого QSINIT, который можно изменять наравне со всеми. Но не стоит забывать, что с него запускаются все приложения, включая этот самый редактор :)
На скриншоте в списке доступных для редактирования - виртуальный диск, загрузочный раздел, жесткий диск и вставленная флешка, в фоне - данные корневого каталога виртуального диска:
Сохраняем MBR (0-й сектор) в файл:
Ищем строчку на диске, в данном случае описание точки монтирования в регистри Windows XP:
Панорамные страсти.
Немного про "панораму" - наш славный 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 могут изучить регистры до и после установки:
С учётом того, что поддержка VESA в QSINIT есть - есть и графические режимы. А раз так - почему бы не быть и виртуальной консоли? ;)
Был, ведь, заметен разный размер скриншотов выше? Здесь, например 100x37.
Возможна и загрузка файла с битовым шрифтом (типа тех, что были в русификаторах доса когда-то).
Эта часть не совсем логически закончена - нельзя, например, добавить свой произвольный текстовый режим - но, надо надеятся на лучшее... ;)
PXE.
Помимо загрузки с диска, при помощи пакета PXEOS4 от Моветона QSINIT грузится и по PXE с сервера.Работает QSINIT, при этом, так же - читает свой ZIP с приложениями и распаковывает его на виртуальный диск, что позволяет, скажем, просмотреть конфигурацию бездискового PC.
Собственно, одной из целей такой фичи при разработке был спортивный интерес - скопировать OS/2 (аврору, например) с другого PC вообще без применения флешек и инсталляционного CD :)
Это реально, если сделать небольшую промежуточную копию системы без PM, работающую на FAT.
Алгоритм:
- архивируем нашу аврору в rar, с EA. QSINIT EA не поддерживает, увы
- архивируем небольшую ось, с текстовым шеллом в ZIP и кладём её на TFTP сервер
(ей не нужен EA и её можно распаковать на FAT) - загружаемся по PXE, разбиваем QSINIT-ом диск на разделы, назначаем LVM буквы, форматируем небольшой раздел под FAT16
- распаковываем на этот раздел ZIP с TFTP сервера и ставим QSINIT командой sys - первая полуось есть :)
- копируем с TFTP сервера rar с реальной системой (всё тем же QSINIT)
- грузим текстовую аврору, уже в ней форматируем ещё один раздел под HPFS или JFS. Распаковываем туда rar (с EA), sysinstx, грузимся - готово :)
Загрузить 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:- исполняемые модули: обычные EXE файлы в формате LE или LX.
- общее адресное пространство.
- отсутствие мультитредности. Процесс может сделать exec потомка и только, в точности как это было в DOS.
- DLL модули и их данные - глобальны и шарятся всеми использующими их процессами.
- система состоит из 2 файлов :) Загрузчик - файл размером ~50k и zip архив с программами и данными.
- загрузчик может быть запущен из FSD механизма загрузки OS/2 (FAT, HPFS, JFS, PXE загрузка) или просто загружен и запущен на исполнение кодом бутсектора FAT/FAT32 раздела.
- для работы в качестве основного диска используется небольшой виртуальный FAT в памяти, куда распаковывается zip архив.
- общее адресное пространство, отсутствие процессов и тредов:
- простота реализации (всё-таки это не ОС).
- размер кода загрузки модулей и обслуживания защищённого режима.
- "резидентные" модули возможны - DLL может быть загружена отдельной командой шелла и оставаться в памяти до конца работы, выполняя роль "драйвера" или "сервиса".
- загрузчик:
- наличие загрузчика определено логикой работы FSD механизма OS/2.
- он обеспечивает минимальные сервисы: переход в PM, вызов реального режима, работу с памятью, загрузку LE/LX модулей, работу с FAT, unzip.
- в сумме этот набор сервисов умещается в 50k, являющиеся лимитом для файла типа OS2LDR - и, одновременно, предоставляет почти полный набор сервисов для запуска модулей.
- встроенная поддержка FAT/FAT32:
- определена логикой работы FSD механизма OS/2: OS2LDR должен сам работать с FAT, в отличие от прочих файловых систем.
- используется для создания виртуального диска и работы с ним.
- используется для монтирования FAT/FAT32 разделов и полноценной работы с ними (чтения/записи).
- поддержка unzip:
- позволяет сократить "систему" до минимально необходимого числа файлов - двух ;)
- встроенная проверка целостности модулей (crc32 zip файла). Встречались ситуации, когда SSD диск возвращал мусор при чтении в PIO режиме, без всякой ошибки.
- сокращение размера читаемой информации (с диска или по сети в случае PXE).
- простой для модификации в любых условиях формат архива.
- виртуальный диск:
- "система" работает на "обычном диске", с чтением и записью. Все приложения и данные, соотвественно - файлы на нём.
- возможность бездисковой работы (PXE загрузка).
- LX/LE модули:
- определяется необходимостью загрузки ядра OS/2 (LX модуль).
- формат имеет поддержку 16-битных сегментов, переходов 16<->32, итд.
- формат довольно сложен. Реализовав загрузку LX можно реализовать почти что угодно ;)
- в качестве базового компилятора используется Open Watcom, для которого этот формат "родной".
- применение Turbo Vision:
- наиболее внятная оконная библиотека для текстовых режимов.
- быстрота написания интерфейсов и диалогов (стоит учитывать ограниченность доступных человеко-часов ;).
Копирайты и прочее.
Торжественно уведомляю, что при написании QSINIT не пострадал ни один юниксоид. Т.е. в продукте нет ни строчки GNU кода и лицензия, под которой он распространяется несовместима с GNU.Из стороннего кода использованы:
- старый добрый PMODE, который был доступен в исходниках в дремучих 90х
- FatFs by ChaN - для доступа к FAT/FAT32. Отличный отлаженный код FAT, используемый на куче платформ. Код форматирования сделан на его базе
- небольшой фрагмент zlib для распаковки zip архивов
- Turbo Vision, который сейчас живет, как abandonware, видимо. Для портирования был взят "народный" код, бродивший в FIDO более 10 лет назад и якобы использовавшийся в IDA. Число авторов исправлений там довольно велико (как и косяков после них ;) ).
И последний вопрос - а зачем всё это, не лучше ли iOS и ондроид? ;) Ответ прост - скучно :) Когда всё готово, когда кругом ява и C++ и 100500 мегабайт памяти и каждый чих увешан вызовами MySQL и лайками. Можно считать это ностальгией по старому доброму творческому процессу и временам, когда компьютеры уже не были большими, но ещё и не стали маленькими ;).
Не знаю - хорошо ли получилось, но потраченного времени, в общем, не жаль :)
Развлекайтесь и вы ;)
Автор.
p.s. свежие версии обычно тут: FTP, HTTP.
Интересные ссылки: Доходных для бизнеса.
Комментариев к странице: 7 | Добавить комментарий
Домой | Проект ядро Core/2 | Проект OS/4 Download | Новости | Гостевая книга | Подробно обо всем | Нужные программы | Проекты | OS/2 FAQ | Всячина | За и Против | Металлолом | #OS2Russian | RDM/2 | Весёлые картинки | Наша галерея | Доска объявлений | Карта сайта | ПОИСК | ФОРУМ