


Позвольте мне представить, так сказать небольшое тех. задание
для создания микроядерной OS.
Надеюсь что этот материал сподвигнет многих программистов к написанию
реального кода, а не реального флейма



Сперва необходимо написать три бинарных файла и один конфигурационный файл.
Это четыре файла:
1.0 Начальный загрузчик 'loader.com'
2.0 Конфигурационный файл 'kernel.cfg'
3.0 Микро Ядро 'kernel.bin'
4.0 Отладочный драйвер 'debug.run'
(Предлагаю для всех исполняемых файлов назначать расширение '.run' от
слова RUN, чтобы никому небыло обидно

1.0 Начальный загрузчик 'loader.com'
Начальный загрузчик должен уметь перевести процессор в защищенный режим
(плоская модель памяти), загрузить в память компьютера микроядро,
конфигурационный файл, приложения и драйвера которые прописаны в
конфигурационном файле. Затем начальный загрузчик должен передать управление
на микроядро, после чего микроядро берет управление всей системой на себя.
Из-за того что, процесс начальной загрузки на IBM PC достаточно кривой то
придется начальный загрузчик разделить на две части. Первая часть бутовая,
вторая все что не поместилось в 'BOOT RECORD'. Лично мне очень понравился
менеджер загрузок под названием 'SyMon'(правда он share ware) И мне кажеться
что загрузчикам типа Lilo и Grub очень далеко по интуитивности и понятности
до бутового загрузчика SyMon
Для простоты и функциональности, думается сперва имеет смысл сделать простой
'досовый' загрузчик 'loader.com'
2.0 Конфигурационный файл
Конфигурационный файл это обычный текстовый файл, который будет общим как
для начального загрузчика так и для микроядра. Конфигурационный файл будет
содержать необходимые параметры начального загрузчика и ядра.
Синтаксис конфигурационного файла для облегчения обработки будет близок к
синтаксису ясыка Си.
2.1 Пример конфигурационного файла 'kernel.cfg'
Пример конфигурационного файла:
#name="kernel config file" // Обязательный параметр(идетификатор) ставиться в начале конфигурационного файла
#title="Пример конфигурационного файла"; // Не обязательный параметр (заголовок)
/* Параметры для загрузчика */
/* Приложения и драйвера для загрузки в память*/
#load="fdd01/kernel.bin"; // Загрузить c флоппи диска ядро (можно не писать загружается по умолчанию)
#load="fdd01/kernel.cfg"; // Загрузить конфигурационный файл (можно не писать загружается по умолчанию)
#load="fdd01/debug.run"; // Загрузить отладочный драйвер
#load="fdd01/video.run"; // Загрузить драйвер дисплея (сервер)
#load="fdd01/keybord.run"; // Загрузить драйвер клавиатуры (сервер клавиатуры)
#load="fdd01/hdd.run"; // Загрузить драйвер жесткого диска
#load="fdd01/mouse.run"; // Загрузить драйвер мышки (сервер мышки)
#load="fdd01/cd-dvd.run"; // Загрузить драйвер CD-ROM, DVD-ROM
#load="fdd01/far/far.run"; // Загрузить файловый менеджер FAR
#load="fdd01/fasm/fasm.run"; // Загрузить ассеблер Fasm
#load="fdd01/drv/mouse.run"; // Загрузить драйвер мышки
#load="fdd01/tpadv/tpad.run"; // Загрузить текстовый редактор
#load="fdd01/tcpip/tcpip.run"; // Загрузить TCP-IP драйвер(стек)
#load="fdd01/drv/usb.run"; // Загрузить USB драйвер(стек)
/* Параметры для ядра */
#startmsg="ON" // включить вывод информации о процессе загрузки ядра
#debug="ON" // включить накопление в ядре отладочной информации
#debugrun="ON" // включить вызов драйвера 'debug' про любому событию в системе
/* приложения и драйвера для запуска (из памяти) */
#run="fdd01/debug.run"; // Запустить отладочный драйвер
#run="fdd01/video.run"; // Запустить драйвер дисплея (сервер)
#run="fdd01/keybord.run"; // Запустить драйвер клавиатуры (сервер клавиатуры)
#run="fdd01/hdd.run"; // Запустить драйвер жесткого диска
#run="fdd01/mouse.run"; // Запустить драйвер мышки (сервер мышки)
#run="fdd01/cd-dvd.run"; // Запустить драйвер CD-ROM, DVD-ROM
#run="fdd01/far/far.run"; // Запустить файловый менеджер FAR
#run="fdd01/fasm/fasm.run"; // Запустить ассмеблер Fasm
#run="fdd01/drv/mouse.run"; // Запустить драйвер мышки
#run="fdd01/tpadv/tpad.run"; // Запустить текстовый редактор
#run="fdd01/tcpip/tcpip.run"; // Запустить TCP-IP драйвер(стек)
#run="fdd01/drv/usb.run"; // Запустить USB драйвер(стек)
3.0 Микро Ядро 'kernel.bin'
Микроядро должно выполняться в нулевом кольце и должно уметь выполнять
следующие функции:
- менеджер памяти (выделять/освобождать куски памяти произвольного размера)
- менеджер задач (запускать/остонавливать выделенные куски памяти и
переключаться между задачами по прерыванию от таймера)
- регистратор прерываний (регистрировать прерывания от различных устройств
и при наличии соответствующего драйвера передавать на него управление)
Все остальные функции будут выполнять драйвера и приложения, причем нет
особой разницы между драйвером и приложением.
Управление на выполнение приложения передается по прерыванию от таймкра.
У правления на выполнение драйвера передается по аппаратному или
программному прерыванию
Никто не мешает приложению зарегистрироваться как на переключение по таймеру
и одновременно на обрабоку прерывания.
3.1 Функции микроядра
Функции работы с памятью:
1. Вернуть размер свободного количества памяти
2. Выделить кусок памяти определенного размера с определенными свойствами из
общего обьема памяти компьютера(создать буфер).
Параметры выделенного куска памяти.
- Размер куска памяти (кратный 4-м Kb)
- Порядковый номер куска
- Уникальный номер куска
- Литерное имя куска
- Зависммый кусок памяти, зависимый кусок памяти автоматический
удаляется если удалить родительский процесс(приложение) которое
послало запрос на выделение этого куска памяти
- Не зависимый кусок памяти, не зависимый кусок памяти остается
в памяти после удаления родительского процесса(приложения/драйвера)
- Общий (доступный) для всех приложений на чтение (-r)
- Общий (доступный) для всех приложений на запись (-w)
- Приватный, доступный только для родительского процесса
(приложения/драйвера)
3. Удалить выделенный кусок памяти, (освободить память)
4. Изменить параметры выделенного куска памяти
Функции работы с задачами(приложениями/драйверами)
1. Создать из выделенного куска памяти(буфера) задачу (установить флаг,
что этот кусок памяти является задачей) К атрибутам буфера добавляется
атрибут задачи
2. Превратить задачу обратно в кусок памяти(буфер) - снять атрибут(флаг)
задачи.
3. Установить задачу в очередь на выполнение по прерыванию от таймера.
По другому говоря зарегестрировать приложение в таблице менеджера
задач или запустить пиложение на выполнение. Эта функця запускает
простое приложение
4. Снять задачу из очереди на выполнение по прерыванию от таймера
5. Установить задачу на выполнение по указанному в параметрах функции
прерыванию (аппаратному или программному). Это значит что задача
(драйвер, приложение) единолично установила (захватило) прерывание.
Эта фукция предназначена для создания реал тайм драйверов
6. Освободить захваченное прерывание
7. Пропустить выполнение задачи. Передать управление на следующее в
очереди задач по таймеру приложение или в случае если пришло аппаратное
(программное) прерывание вернуть упраления ядру
8. Принудидельно передать управление на указанное в параметрах функции
приложение.()
Сервисные функции ядра:
1. Вернуть версию ядра
2. Перезагрузить комьютер
3. Удалить задачу (Kill)
4. Горячий рестарт ядра
5. Вернуть тип процессора
и т.п.
3.2 Дополнительные требования к микроядру
Для простоты и скорости выполнения, микроядро ядро должно писаться
исключительно на Ассемблере (скорее всего FASM). Должно иметь обильные
коментарии



При написании ядра должны использоваться 32-х
разрядные команды и регистры хотя это преведет к незначительному
увеличению размеров микроядра. И самое главное в том чтобы микро ядро
запускалось и раьотало на I386
При написании микроядра нужно предусмотреть соответствующие буферы для
вывода вних отладочной информации и возможность включения режима
#debugrun="ON" для передачи управления отладочному драйверу по любому
событию в системе !!!
4.0 Отладочный драйвер 'debug.run'
Отладочный драйвер 'debug.run' будет хорошим примером для создания
любого драйвера. Так как на начальном этапе нет ни одного драйвера,
то отладочный драйвер будет иметь в себе драйвер дисплея (консольный),
драйвер клавиатуры, драйвер флопи диска и мышки)
Отладочный драйвер будет запускаться при любом событии в системе и
выводить соответствующую информацию. Если говорить более точно то
отладочный драйвер должен представлять из себя настоящий многофункцио
нальный консольный дебаггер !!!
Товарисчи программисты !!! Оособенно те кто 'расколол' защищенный режим,
от вас 'код' и 'исходники' !!!



P.S. Продолжение следует...