![]() |
CDSlow | NTPWEdit | video3x | sleid0r | sleid0r-effects | cpgcdemux | fictionup |
Разработка системы 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 находятся дополнительные файлы и утилиты:
AUTOEXEC.BAT - пример конфигурационного командного файла;
CONFIG.SYS - пример конфигурационного файла DOS;
INSTALL.BAT - командный файл для создания загрузочной дискеты с собранным ядром;
KWC38632.map - карта памяти ядра (отладочная информация);
KWC38632.sys - копия ядра, в имени файла которого указаны использованные опции сборки - тип компилятора, тип процессора, тип файловой системы;
SYS.COM - команда для копирования системных файлов и записи на диск загрузочного сектора.
Я не разбирался, привязана-ли жёстко команда 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/