Русификация 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\PACKAGES\SRC_BASE\DISK04\KERNELS.ZIP на компакт диске. После распаковки архива с сохранением структуры каталогов в корне диска C: мы получим каталог C:\SOURCE\KE2034, в котором и располагаются исходные тексты, документация на английском языке (в подкаталоге 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:\tc201

set XCPU=86

set XFAT=16

А взамен раскомментировать (убрать символы ":- " в начале строки):

:- set COMPILER=WATCOM

:- if not \%WATCOM% == \ goto watcom_defined

:- set WATCOM=c:\watcom

:- set PATH=%PATH%;%WATCOM%\binw

:- set XCPU=386

:- set XFAT=32

Следующие строки изменить:

set XNASM=c:\bin\nasm16 → set XNASM=c:\nasm\nasm

set XUPX=upx --8086 --best → set XUPX=c:\upx\upx --8086 --best

Если вы используете версию компилятора Watcom C для среды Win32, то в строку

set PATH=%PATH%;%WATCOM%\binw

нужно добавить путь к каталогу binnt:

set PATH=%PATH%;%WATCOM%\binw;%WATCOM%\binnt

Итак, для компиляции у нас всё готово, осталось только выполнить то, ради чего всё это затевалось - русификацию. Минимально необходимая модификация ядра, которая позволяет без проблем обрабатывать файлы с русскими символами в именах, это задание правильной таблицы преобразования строчных/заглавных букв. Информация о кодовой странице (частью которой является таблица преобразования) хранится в файле KERNEL\NLS_HC.ASM. Этот файл является копией одного из исходных файлов находящихся в каталоге KERNEL\NLS. В стандартном ядре это KERNEL\NLS\001-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 находятся дополнительные файлы и утилиты:

Я не разбирался, привязана-ли жёстко команда SYS.COM к версии ядра, скорее всего нет, но, на всякий случай, я использую оба файла собранные совместно.

Чтобы проверить работоспособность скомпилированных файлов, можно использовать командный файл INSTALL.BAT. Вставьте в дисковод A: чистую дискету и, находясь в каталоге KE2034\BIN, выполните команду INSTALL. На дискету будет скопировано ядро, конфигурационные файлы и командный интерпретатор. Только при копировании файла COMMAND.COM возникает небольшая проблема. Дело в том, что команда SYS ищет этот файл в трёх местах - в исходном каталоге, в корневом каталоге исходного диска и в переменной среды "COMSPEC", при этом она не проверяет, принадлежит ли найденный файл именно FreeDOS. Так-как в каталоге KE2034\BIN после завершения сборки никакого COMMAND.COM нет, найден и скопирован на дискету будет командный интерпретатор той операционной системы, под которой выполнялась компиляция. Не самое плохое решение, однако, если окажется, что текущая операционная система это не FreeDOS а MS-DOS (или MS Windows), то загрузочная дискета будет не работоспособной, так как COMMAND.COM от Microsoft работает только в "своей" версии DOS. Чтобы исправить эту ситуацию, можно либо заранее скопировать в каталог KE2034\BIN командный интерпретатор от FreeDOS, либо после создания дискеты скопировать файл на неё, заменив вариант записанный командой SYS. На инсталяционном компакт диске FreeDOS COMMAND.COM можно найти в каталоге isolinux\buildcd.

Теперь осталось перезагрузить компьютер (не забыв в настройках BIOS Setup разрешить загрузку с дискеты) и убедиться в работоспособности скомпилированного ядра.

Have a nice DOS! :-)

Вадим Дружин, <cdslow@mail.ru>


Ссылки:

FreeDOS - http://www.freedos.org/

OpenWatcom - http://www.openwatcom.org/

NASM (Netwide Assembler)- http://nasm.sourceforge.net/

UPX (Ultimate Packer for eXecutables) - http://upx.sourceforge.net/