Создание простейшей операционной системы.
Становление Силы.
Написание своей ОС является наилучшим способом изучить работу компьютера, и самого низкого программного уровня.
Все программы использованные в данной статье вы найдете на 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, или просто оцените эту статью.
Все пожелания, отзывы, и т.п. на skif_q@mail.ru Если что-то в данной статье непонятно, пишите на mail, или в форум, обязательно отвечу.
|