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

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

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

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

Если что-либо в статье непонятно, пишите на mail: skif_q[sobak]mail.ru
или в форум. Обязательно отвечу на любые вопросы.


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



В поисках Силы.
Целью написания ОС, является не создание новой СуперОС, а изучение «высокого исскуства
работы на нижнем уровне» :)
Я постараюсь в своих статьях охватить наиболее широкое количество материала, особенно о
защищенном режиме, такое как: распределение памяти(gdt), прерывания(idt),
многозадачность (tss), а так-же многие другие.

В этой статье мы загрузим вторичный загрузчик, и перейдем на него.

Мы имеем минимальный загрузчик, который ничего у нас не делает.
Нам надо:
1 Загрузить вторичный загрузчик.
2 Перейти на него так чтобы он работал. :)

Загружать мы будем его используя 2-ю функцию 0x13-го прерывания.

;DL — номер диска (носителя)
;DH — номер головки
;CH — номер дорожки
;CL — номер сектора
;AL — количество секторов (в сумме не более одной дорожки)
;ES:BX — адрес буфера в памяти, в который будут считаны данные

Немного о дискетах:
В дисководе флоппи дисков имеется 2 головки (т.е. мы можем читать/писать
с верхней и нижней стороны дискеты), на дискете имеется 80 дорожек, на каждой
дорожке — 18 секторов. Поэтому адрес на fdd обычно пишется вот так x:yy:zz
где x — номер головки, yy — дорожки, zz — сектора.
cм. рисунок: ass3mbler.narod.ru/IMG00001.GIF

Сектора считаются с еденицы. Головки и дорожки — с нуля.
Размер вторичного загрузчика ограничим пока 2048 байтами.

Во избежание глюков, org надо писать выше кода, иначе times неправильно
высчитывает размер. см ниже.

; -------------------------------------------

org 07C00h
main:
jmp far 00:entry1

entry1:
cli
mov ax,cs
mov ds,ax
sti

mov ah,14
xor bl,bl

mov bx,tex1
.strt:
mov al,[bx]

test al,al
jz .exit_

inc bx
int 10h
jmp .strt

.exit_:

mov ax,0x0860
mov es,ax; Cегмент куда загружать будем

sub dx,dx
sub ch,ch
; вторичный загрузчик с 0:0:2 — 0:0:5
mov cl,2; будет в памяти с 0x08600
mov al,4
sub bx,bx; 0x0860:00
mov ah,2
int 0x13





jmp far 0:0x08600; прыгаем на него


tex1 db 'First Loader loaded',0Dh,0


times 510-($-main) db 0
db 0xAA, 0x55

; ---------------------------------------------------
; second loader
; Вторичный загрузчик

org 0x8600
sl:
cli
mov ax,cs
mov ds,ax
sti

; вывод сообщения.

mov ah,14
xor bl,bl

mov bx,tex
.strt:
mov al,[bx]

test al,al
jz .exit_

inc bx
int 10h
jmp .strt


.exit_:
cli
jmp $

tex db 0Ah,'Second Loader is Loaded',0Dh,0

times 2046-($-sl) db 0
db 0xAA, 0x55

; -------------------------------------------

Прим из fasm:

Локальные метки:

sigma:
.alpha:; локальная метка (1)
jmp .alpha; пеpеход на (1)
omega:
.alpha:; локальная метка (2)
jmp .alpha; пеpеход на (2)
jmp sigma.alpha; пеpеход на (1)






Вторичный загрузчик пока ничего не делает, только выводит сообщение что он загружен.

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

На все возникшие у тебя вопросы отвечу незамедлительно, пиши на mail: skif_q[myy]mail.ru

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

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

16:05
Хм интересно.
16:07
Но нужно продолжение.