Написание своей ОС является наилучшим способом изучить работу компьютера, и самого низкого
программного уровня.
Все программы использованные в данной статье вы найдете на Ass3mbleR
fasm можно взять на FASMПроцесс загрузки компьютера:
Основную работу 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 'HARD Hello World',0Dh,0
times 510-($-main) db 0
; эта директива заставляет компилятор заполнить оставшееся (до 512-и байт) место нулями
db 0xAA, 0x55
; а эти два байта нужны чтобы биос определил что это действительно
; бут сектор
Компилируем получившийся файл, и с помощью программы rawrite записываем его на дискету,
перезагружаемся, и радуемся.
В дальнейшем рекомендую использовать виртуальную машину, чтобы каждый раз не перезагружаться (vmware, bosh,
Virtual PC или др.)
Если эта статья вам понравилась. и вы хотите продолжения, то напишите мне на mail, или просто
оцените эту статью.