WYOS - Выпуск №14
Баловство с загрузкой
commrade, Среда, 30 Июнь 2004, 23:31

Напиши свою ОС! #14
Здравствуйте, уважаемые подписчики!

Сразу же хотел бы попросить прощение у вас за столь долгий перерыв в выходе нашей рассылки. Это было вызвано болячками одного из редакторов рассылки (моими).
Новости 3OS
После продожительных боев с html и php, а также другими интернет-технологиями наконец-то заработал официальный сайт проекта 3OS www.3os.ru. Ура товарищи, то есть господа!!!!
Вступление
Просмотрев предыдущие выпуски рассылки я подумал, что пока теории хватит (на первое время), пора попробовать перейти от теории к практике. И начать практическое занятие я хотел бы с процесса загрузки ОС. В этом номере рассылки мы с вами попытаемся прописатся в загрузочном секторе дискетки формата 3,5``, затем загрузиться с нее и сделать так, чтобы у нас на эране монитора отобразилась какая-нибудь надпись.
Об инструментах
Для разработки загрузчика нам понадобятся ассемблер и С/С++ компилятор. В принципе подойдут любые программные средства разработки, потому-что переделать программу написанную для MASM не составит труда переписать под TASM или другой ассемблер, главное - это ухватить идею (проще говоря алгоритм работы программы). Я же привожу примеры кода написанные под следующие инструменты: ассемблер - FASM, С/С++ - компилятор C++ Builder 5.0.
Код загрузчика
Итак приступим. Ниже я привел пример кода. Код до безумия прост, когда компьютер начинает загружаться на эране должна появиться надпись ""... Вот собственно и все что она должна сделать. Ассемлерный код имеет комментарии в которых описанно, что они делают комментировать что либо еще по моему излишне. При желании можно модифицировать код так, чтобы он выводил надпись либо "Zdes byl Vasya" либо "Privet percy". А че через транслит спросите вы, че кирилицу уже отменили? Да нет, просто стандартный BIOS не имеет в своей памяти кирилической таблицы. О том как сделать так, чтобы на эране появилась надпись на русском в следующем выпуске рассылки.
org 7C00h

start:
        mov ax,0b800h   ;0xb800 -- это адрес сегмента 
                                 ;видеопамяти в текстовом режиме.
        mov es,ax       ;копируем это значение в сегментный 
                              ;регистр es
        mov ax,41h      ;Первый -- это значение ascii-кода
                               ;символа, который вы хотите вывести на экран
        mov es,ax       ;снова копируем это значение в сегментный 
                              ;регистр es
        mov ax,1fh      ;Второй -- атрибут символа. Атрибут 
                              ;содержит следующую информацию:
        mov es,ax       ;цвет символа, цвет фона, мерцание 
                              ;и потом опять копируемв es
loop1:  jmp loop1       ;команда jmp указывающая на саму себя

После компиляции (именно компиляция, а не что то другое) вы должны получить стандартный файл с расширением .com, обзовите его как-нибудь, например, "boot.com". Не вздумайте его запустить - ваш комп стопроцентно зависнет, тогда придется нажимать нашу любимую клавишу "Reset".
Запись в загрузочный сектор дискетки
Для записи в загрузочный сектор дискетки нам понадобиться приложение под Windows. Создайте новое приложение с помощью Console Wizard. В появившемся окне выберите Source Type=C, поставте галочку против пункта Console Application. Нажмите ОК. Введите код на языке С указанный ниже. Да чуть не забыл, не забудьте подключить директивой #include следующие загаловочные файлы: io.h, fcntl.h, errno.h, stdio.h. Подключили? Ну тогда поехали.
int main()
{
        char bootbuf[512];
        int deskfloppy, deskfile;
        //char err;
        bootbuf[510]=0x55;
        bootbuf[511]=0xaa;
        
        deskfile=open("boot.com", O_RDONLY);
        if(deskfile==-1)
        {
        perror("Error open boot.com");
            return 1;
        };
        read(deskfile, bootbuf, 510);
        close(deskfile);
        deskfloppy=open("A:/", O_RDWR);
        if(deskfloppy==-1)
        {
        perror("Error open disk A:");
            return 1;
        };
        lseek(deskfloppy, 0, SEEK_CUR);
        write(deskfloppy, bootbuf, 512);
        close(deskfloppy);
    return 0;
}

Загрузка с дискетки
Перезагрузите компьютер. В BIOS'е поставьте загружаться с диска А. Сохраните настройки и выйдите из BIOS'а. Вставте дискетку до начала запуска компьютера. Если вы все сделали правильно на экране должна мигать буква "".
Заключение
Вот вроде и все на сегодня. Все бы хорошо, но тут я обнаружил, что мое второе я (этот монстр из фильма "") специально, что бы вам, уважаемые, не было легко и приятно наделал ошибок в коде, найдите их пожалуйста и напишете мне. А вы что думали, что commrade напишет код, а вы придете на все готовенькое, нетушки, давайте и сами думайте, придумывайте и пишите мне - наиболее понравившиеся образцы кода мы опубликуем в рассылке. Под конец я решил дать вам некоторые задания для развития навыков программировани.
Упражнение 1
Найдите и исправьте ошибки в текстах обеих программ.
Упражнение 2
Модифицируйте программу так, чтобы она выводила надписи на русском языке.


Ну вот теперь все, желаю удачи на ниве программировани ОС, ваш commrade.
Список литературы, источников информации и другой интересной информации
1. http://www.linuxgazette.com - море различной информации из мира *nix систем

2. Кришнакумар -- студент последнего курса B.Tech в Govt. Engg. College Thrissur, Kerala, Индия. Его путешествие в земли Операционных Систем началось с программировани модулей для Linux. Он создал операционную систему GROS, основная цель которой -- выполнение функции маршрутизатора. (Детали вы можете найти на его домашней странице: http://www.askus.way.to/ ) Другие его интересы -- это сетевые драйвера, драйвера устройств, портирование компиляторов и встроенные системы (Compiler Porting and Embedded systems).


это контент от Центр информации по операционным системам
( http://www.osrc.info/plugins/content/content.php?content.18 )