ВАДИМ ДРУЖИН
Русификация FreeDOS
Разработка системы FreeDOS началась более 10 лет назад – файл HISTORY.TXT в исходных текстах ядра начинает отсчёт с 25 мая 1993 года. Несмотря на столь солидную историю, пригодной для практического использования в современных условиях система стала недавно – поддержка файловой системы FAT32 начала разрабатываться в 2001 году. Конечно, не все применения DOS требуют поддержки большой файловой системы. Задолго до появления FAT32 FreeDOS использовалась как встроенная операционная система в условиях малого дискового пространства и небольших объемов оперативной памяти, а также входила в состав дистрибутива программы DOSEMU – среды эмуляции DOS для Linux. Однако для меня DOS – это прежде всего система, которую можно загрузить с дискеты и использовать для восстановления работоспособности операционной системы на жестком диске, среда для запуска утилит аварийного восстановления данных и антивирусных программ. После появления версий Microsoft Windows с поддержкой файловой системы FAT32 использовать для аварийно-восстановительных работ DOS без поддержки этой файловой системы было проблематично. Поэтому достаточно длительное время FreeDOS меня не интересовала.
Недавно, подготавливая загрузочную антивирусную дискету, у меня возникли трудности в ограничении по размеру – необходимые файлы не удавалось упаковать в объём 3,5-дюймовой дискеты, несмотря на все ухищрения. Тогда я решил поискать версию DOS с поддержкой FAT32, но с меньшим объёмом загрузочных файлов, чем у MS-DOS из комплекта Windows. Оказалось, что у FreeDOS уже имеются нужные возможности и при этом сохранился маленький объём загрузочного файла. Сравним размер ядра MS-DOS из состава Windows 98 Second Edition RUS и ядра из дистрибутива FreeDOS Beta9RC5:
DOS
|
Файл
|
Размер
|
MS-DOS
|
IO.SYS
|
222390 байт
|
FreeDOS
|
KERNEL32.SYS
|
45815 байт
|
Разница почти в 5 раз! Так что для запуска с дискеты предпочтительно использовать именно FreeDOS.
К сожалению, при работе с FreeDOS выяснился один неприятный момент – FreeDOS не поддерживает смену информации о кодовых страницах. Команда COUNTRY в файле CONFIG.SYS обрабатывается только частично, используется первый параметр (код страны) для установки национальных форматов даты, времени, валюты и разделителей, а указанная кодовая страница (второй параметр) игнорируется, и используется страница, жёстко зашитая во время компиляции. Поэтому после установки из дистрибутива FreeDOS не может нормально обрабатывать файлы и каталоги с русскими именами. Но эту проблему можно решить. Так как FreeDOS распространяется с полными исходными текстами, никто не мешает нам собрать версию ядра с поддержкой нужной кодовой страницы. Описанию этой процедуры и посвящена статья.
Для сборки ядра FreeDOS нам понадобится компилятор языка C. Выполнять компиляцию можно при помощи Turbo C 2.01, Turbo C++ 1.01, Turbo C 3.0, Borland C 4.51 и 5.01, по утверждению авторов, можно использовать другие компиляторы Borland, Microsoft C и (Open)Watcom C. Хотя некоторые версии компиляторов Borland сейчас доступны в Интернете для свободного скачивания, я (как и разработчики FreeDOS) рекомендую использовать OpenWatcom C. Я пробовал использовать для сборки компилятор Turbo C 2.01. Процесс прошёл успешно, но получившееся ядро не смогло нормально загрузиться. А после сборки компилятором OpenWatcom C 1.2 получился полностью рабочий исполняемый файл.
Компилятор OpenWatcom можно свободно загрузить из Интернета по адресу: http://openwatcom.mirrors.pair.com/watcom/open-watcom-win32-1.2.exe – это полный инсталятор для среды Win32, включая компиляторы C и Fortran77 (размер файла 63.1 Mб).
Если вы не хотите качать весь файл, можно получить набор только необходимых для компиляции компонентов по адресу: http://openwatcom.mirrors.pair.com/watcom/zips-1.2.
Компиляцию можно выполнять как из-под Windows, так и из-под DOS. Версию компилятора для DOS можно использовать, например, в среде DOSEMU под Linux. В зависимости от ОС, под которой будет проходить компиляция, нужно скачать соответствующий набор ZIP-архивов.
Файлы OpenWatcom 1.2 для компиляции под DOS
|
c_doswin
|
C compiler (DOS & Win16 hosts)
|
clib_a16
|
C runtime libraries (16-bit all targets)
|
clib_d16
|
C runtime libraries (16-bit DOS)
|
cm_clib_a16
|
C runtime libraries (16-bit all targets)
|
cm_clib_d16
|
C runtime libraries (16-bit DOS)
|
cm_clib_hdr
|
C runtime library header files
|
cm_core_all
|
Core binaries (All hosts)
|
cm_core_dos
|
Core binaries (DOS host)
|
cm_core_doswin
|
Core binaries (DOS & Win hosts)
|
core_doswin
|
Core binaries (DOS & Win16 hosts)
|
ext_dos4gw
|
DOS/4GW DOS extender
|
Файлы OpenWatcom 1.2 для компиляции под Win32
|
c_nt
|
C compiler (Win32 hosts)
|
clib_a16
|
C runtime libraries (16-bit all targets)
|
clib_d16
|
C runtime libraries (16-bit DOS)
|
cm_clib_a16
|
C runtime libraries (16-bit all targets)
|
cm_clib_d16
|
C runtime libraries (16-bit DOS)
|
cm_clib_hdr
|
C runtime library header files
|
cm_core_all
|
Core binaries (All hosts)
|
cm_core_nt
|
Core binaries (Win32 host)
|
core_nt
|
Core binaries (Win32 hosts)
|
Все скачанные архивы нужно распаковать в какой-нибудь каталог, пусть для определенности это будет C:WATCOM. Распаковывать архивы нужно с сохранением структуры каталогов.
Кроме компилятора C для сборки понадобится также ассемблер NASM версии не ниже 0.98.36. Я использовал версию 0.98.38 (DOS 32-bit). Загрузить NASM можно по адресу: http://nasm.sourceforge.net. Будем считать, что NASM распакован в каталог C:NASM.
Маленький размер ядра FreeDOS достигается при помощи использования динамической упаковки. После компиляции файл дополнительно обрабатывается упаковщиком UPX, и при загрузке происходит его автоматическая распаковка в оперативную память. Похожую технологию использует ядро Linux, там для упаковки используется алгоритм GZIP или BZIP2. Скачать UPX можно по адресу: http://upx.sourceforge.net. Я пользовался UPX 1.24d (32-bit DOS version). По аналогии с NASM пусть UPX располагается в каталоге C:UPX.
Итак, все утилиты, необходимые для компиляции, у нас есть, теперь нужно получить сами исходные тексты FreeDOS.
Вы можете скачать с сайта http://www.freedos.org дистрибутив FreeDOS в виде образа загрузочного компакт-диска (ISO), в который входят исходные тексты, скомпилированные версии всех файлов и интерактивный инсталлятор, либо скачать с того же адреса по отдельности необходимые утилиты (команды и драйверы DOS) и по адресу http://sourceforge.net/projects/freedos исходные тексты ядра.
Если скачивать утилиты по отдельности, вы получите самые последние версии, программы, входящие в установочный образ, могут быть устаревшими. Я использовал для сборки исходные тексты ядра версии 2.0.34 из дистрибутива FreeDOS Beta9RC5, они находятся в файле FREEDOS PACKAGESSRC_BASEDISK04KERNELS.ZIP на компакт-диске. После распаковки архива с сохранением структуры каталогов в корне диска C мы получим каталог C:SOURCEKE2034, в котором и располагаются исходные тексты, документация на английском языке (в подкаталоге DOCS) и командные файлы, выполняющие сборку. Сборка производится с помощью командного файла BUILD.BAT или утилиты make. При запуске make без параметров выполняется вызов того же самого BUILD.BAT, так что разницы фактически никакой.
Перед началом компиляции нужно задать параметры, такие как тип и место нахождения используемого компилятора, архитектура процессора, для которого предназначено ядро (16 или 32 бита), и необходимость поддержки файловой системы FAT32. Задаются эти параметры в файле CONFIG.BAT. Чтобы получить исходный вариант файла (с настройками по умолчанию), нужно скопировать с этим именем файл CONFIG.B (copy CONFIG.B CONFIG.BAT). Теперь вносим в файл CONFIG.BAT необходимые изменения.
Следующие строки нужно закомментировать:
set COMPILER=TC2
set TC2_BASE=c: c201
set XCPU=86
set XFAT=16
А взамен раскомментировать (убрать символы «:- » в начале строки):
:- set COMPILER=WATCOM
:- if not \%WATCOM% == goto watcom_defined
:- set WATCOM=c:watcom
:- set PATH=%PATH%;%WATCOM%inw
:- set XCPU=386
:- set XFAT=32
Следующие строки изменить:
set XNASM=c:in asm16 ® set XNASM=c: asm asm
set XUPX=upx --8086 –best ® set XUPX=c:upxupx --8086 --best
Если вы используете версию компилятора Watcom C для среды Win32, то в строку
set PATH=%PATH%;%WATCOM%inw
нужно добавить путь к каталогу binnt:
set PATH=%PATH%;%WATCOM%inw;%WATCOM%innt
Итак, для компиляции у нас всё готово, осталось только выполнить то, ради чего всё это затевалось – русификацию.
Минимально необходимая модификация ядра, которая позволяет без проблем обрабатывать файлы с русскими символами в именах, – это задание правильной таблицы преобразования строчных/заглавных букв. Информация о кодовой странице (частью которой является таблица преобразования) хранится в файле KERNEL NLS_HC.ASM. Этот файл является копией одного из исходных файлов, находящихся в каталоге KERNELNLS. В стандартном ядре это KERNELNLS?01-437.HC.
Насколько я понял из комментариев, для создания HC-файлов должна использоваться некая утилита, которая преобразует файл формата UNF (Universal NLS data Format) в ассемблерный листинг (HC). Никаких следов этой утилиты мне обнаружить не удалось, поэтому я решил взять в качестве исходного ассемблерный код файла NLS_HC.ASM и поменять таблицу непосредственно в нём. Структура файла вполне очевидна. Хотя, кроме заголовка, комментарии в файле отсутствуют, имеющиеся имена меток достаточно информативны. Таблица преобразования регистра символов имеет метку _nlsUpcaseHardcoded. Кроме этой таблицы, я также исправил таблицу порядка сортировки, которая помечена как _nlsCollHardcoded.
Порядок сортировки в изменённом варианте используется не алфавитный, а по возрастанию расширенных ASCII-кодов символов.
Для русской кодовой страницы 866 использование такого порядка даёт почти правильный результат, только в последовательность строчных русских букв вклинивается набор символов псевдографики (эти символы в именах файлов встречаются нечасто).
Мой вариант файла NLS_HC.ASM можно скачать по ссылке http://vdruzhin.chat.ru/freedos/007-866.hc. После скачивания файл нужно переименовать и скопировать вместо оригинального NLS_HC.ASM.
Теперь вернемся в каталог KE2034 и, собравшись с духом, запустим команду BUILD.BAT. После окончания компиляции в каталоге BIN мы получим файл KERNEL.SYS – наше новое ядро FreeDOS. Кроме него, в каталоге BIN находятся дополнительные файлы и утилиты:
- AUTOEXEC.BAT – пример конфигурационного командного файла;
- CONFIG.SYS – пример конфигурационного файла DOS;
- INSTALL.BAT – командный файл для создания загрузочной дискеты с собранным ядром;
- KWC38632.map – карта памяти ядра (отладочная информация);
- KWC38632.sys – копия ядра, в имени файла которого указаны использованные опции сборки – тип компилятора, тип процессора, тип файловой системы;
- SYS.COM – команда для копирования системных файлов и записи на диск загрузочного сектора.
Я не разбирался, привязана ли жёстко команда SYS.COM к версии ядра, скорее всего нет, но на всякий случай я использую оба файла, собранные совместно.
Чтобы проверить работоспособность скомпилированных файлов, можно использовать командный файл INSTALL.BAT. Вставьте в дисковод A: чистую дискету и, находясь в каталоге KE2034BIN, выполните команду INSTALL. На дискету будет скопировано ядро, конфигурационные файлы и командный интерпретатор.
Только при копировании файла COMMAND.COM возникает небольшая проблема. Дело в том, что команда SYS ищет этот файл в трёх местах – в исходном каталоге, в корневом каталоге исходного диска и в переменной среды «COMSPEC», при этом она не проверяет, принадлежит ли найденный файл именно FreeDOS. Так как в каталоге KE2034BIN после завершения сборки никакого COMMAND.COM нет, найден и скопирован на дискету будет командный интерпретатор той операционной системы, под которой выполнялась компиляция. Не самое плохое решение, однако если окажется, что текущая операционная система – это не FreeDOS, а MS-DOS (или MS Windows), то загрузочная дискета будет неработоспособной, так как COMMAND.COM от Microsoft работает только в «своей» версии DOS. Чтобы исправить эту ситуацию, можно либо заранее скопировать в каталог KE2034BIN командный интерпретатор от FreeDOS, либо после создания дискеты скопировать файл на неё, заменив вариант, записанный командой SYS. На инсталяционном компакт-диске FreeDOS COMMAND.COM можно найти в каталоге isolinuxuildcd.
Теперь осталось перезагрузить компьютер (не забыв в настройках BIOS Setup разрешить загрузку с дискеты) и убедиться в работоспособности скомпилированного ядра.
Ссылки:
- FreeDOS – http://www.freedos.org
- OpenWatcom – http://www.openwatcom.org
- NASM (Netwide Assembler) – http://nasm.sourceforge.net
- UPX (Ultimate Packer for eXecutables) – http://upx.source-forge.net