Создание вашей первой операционной системы — HackZona.Ru

Создание вашей первой операционной системы

Создание вашей первой операционной системы

Тип статьи:
Со старой ХакЗоны.
Источник:

Внимание, в этой статье я подразумеваю, что основы знаний ассемблера и работы с
компьютером и fasm у вас имеются. Если нет, то читайте статью ASM в 12-ом номере
FT, или любые другие источники.


Становление Силы.
Написание своей ОС является наилучшим способом изучить работу компьютера, и самого низкого
программного уровня.

Все программы использованные в данной статье вы найдете на ass3mbler.narod.ru
fasm можно взять на www.flatassembler.org

Процесс загрузки компьютера:
Основную работу BIOS-а мы пропускаем как не нужную на данный момент для нас. Возьмем как данность, что BIOS
загружает свои процедуры на (int 0x10 10-е прерывание.)
Там имеются почти все необходимые нам процедуры, такие как чтение дисков, и т.п.
Кто хочет подробнее узнать о этих прерываниях ищите в нете tech help (v1 есть русская, остальные — англ.)
или любой другой справочник по прерываниям (можно у меня попросить).

Далее BIOS загружает первый сектор загрузочного диска (дискеты, CD-Rom) на адрес 07C0:0000
или 0000:07C00 что является одним адресом.

Здесь небольшая ремарка:
При компиляции часто используется директива org операнд которой определяет адрес куда
код(программа) будет загружен в оперативку. Сделано это потому что вместо переменных в
команды подставляются их адреса от начала кода, и если не учесть
что программа будет загружена не в самое начало памяти (0000:0000) то вместо переменных
мы получим кашу.
К адресу переменой добавляется операнд директивы org. (например org 100h)

После этого на этот адрес передается управление.

Тут начинается выполнение нашего загрузчика.
Сей загрузчик должен вывести приветственное сообщение, загрузить и перезать
управление вторичному загрузчику.
Для первичного загрузчика размеры ограничены 512-ю байтами (таков размер одного сектора).

Давайте напишем простейший загрузчик, который выводит hello world.

Для компиляции данного примера вам потребуется fasm.


org 07C00h
main:
jmp far 00:entry1
; это необходимо для того, чтобы точно знать, что
; мы находимся на 0000:07C00h

entry1:
cli
; запрещаем прерывания

mov ax,cs
mov ds,ax
; устанавливаем сегмент данных

sti
; разрешаем прерывания

mov ah,14
; в ah — номер процедуры (вывод знаков в режиме
; телетайпа
xor bl,bl

mov bx,tex
; в bx, адрес выводимой строки
; 14-я функция требует чтобы адрес был в формате 0000:xxxx
; а у нас он в формате 07c0:xxxx
; по этому к адресу надо добавить 7C00h

strt:
mov al,[bx]

test al,al
jz exit_
; если al=0 (конец строки) то выход

inc bx
int 10h
jmp strt

exit_:
cli
jmp $
; завешиваем компьютер ($ заменяется на адрес текущей команды
; следовательно эта команда будет повторятся бесконечно).


tex db 'Real Hello World',0Dh,0

times 510-($-main) db 0
; эта директива заставляет компилятор заполнить оставшееся (до 512-и байт) место нулями

db 0xAA, 0x55
; а эти два байта нужны чтобы биос определил что это действительно
; бут сектор


Компилируем получившийся файл, и с помощью программы rawrite записываем его на дискету,
перезагружаемся, и радуемся.

В дальнейшем рекомендую использовать виртуальную машину, чтобы каждый раз не перезагружаться (vmware, bosh,
Virtual PC или др.)

Если эта статья вам понравилась. и вы хотите продолжения, то напишите мне на mail, или просто оцените эту статью.
Все пожелания, отзывы, и т.п. на mail: skif_q гав mail.ru


Если что-то в данной статье непонятно, пишите на mail, или в форум, обязательно отвечу.

Нравится
Не нравится

3 комментария

20:44
Автор респект!
23:54
Нормальок
20:31
Неплохо, но мало, пиши еще!