System operacyjny
Prosty program w boot sektorze.
Listing 1 Plik boot.asm
; Program w bootsektorze wypisuje * we wszystkich możliwych kolorach.
; Adres startowy 0000:7c00
[ORG 0x07c00]
[BITS 16] ; program ma być kompilowany jako 16 bitowy
mov ax, 0xb800 ; ustawiamy segment es na początek
mov es,ax ; pamięci karty video
mov bx, 0 ; pozycja kursora
mov cl, 0xff ; bieżacy kolor
loop1:
mov byte [es:bx], '*' ; wpisujemy znak * na biezaca pozycje
mov byte [es:bx+1], cl ; ustawiamy atrybuty (kolor i tło)
add bx, 2 ; przesuwamy się na następną pozycję
sub cl, 1 ; zmiejszamy kod koloru
cmp cl, 0xff
jne loop1
loop2: jmp loop2 ; zapętlamy
times 510 - ($-$$) db 0 ; uzupełniamy zerami do pozycji 510
dw 0x0aa55 ; wartość aa55 oznacza,
;że jest to sektor bootowalny
Kompilowanie
nasm -f bin boot.asm -o boot.bin
Kopiowanie systemu na pendrive
sudo dd if=./boot.bin of=/dev/sdb1 bs=512 count=1
Uruchamianie w emulatorze [w zaleźności od wersji]
qemu -hda ./boot.bin
kvm -hda ./boot.bin --boot order=c
qemu-system-i386 -drive format=raw,file=./boot.bin
Przerwania BIOSu
Listing 2 Plik boot_dysk.asm
; Kompilacja
; nasm boot_dysk.asm -fbin -o boot.bin
; Uruchomienie
; qemu -hda ./boot.bin
; Adres startowy 0000:7c00
[ORG 0x07c00]
[BITS 16]
bootloader:
mov ax, 0
mov ds, ax ; ustawienie segmentu DS na zero
mov es, ax
mov ah, 0x42 ; odczyt LBA
mov dl, 0x80 ; numer dysku (dysk nr 0)
mov si, read_pocket ; DS:SI adres struktury definiujacej
; ile przeczytać i gdzie umieścić
int 0x13
mov bp, 0x7E00
mov cx, msglen ; długość tekstu
call write_text
loop1:
hlt ; zatrzymujemy procesor
jmp loop1 ; zapętlamy
read_pocket:
db 0x10 ; rozmiar rekordu (pocket)
db 0 ; zarezerwowane = 0
dw 1 ; ile sektorów odczytać
dd 0x00007E00 ; gdzie umieścić wynik
dd 1 ; który sektor odczytać
dd 0 ; starsze bajty sektora
; Wypisuje tekst
; BP - adres tekstu
; CX - dlugosc tekstu
write_text:
mov ah, 0x13 ; wypisanie tekstu
mov al, 0x01 ; tryb pisania : bit 0 - przesunąc kursor po zapisie
; bit 1 - tekst zawiera na przemian
; litery i atrybuty znaków
mov bh, 0x00 ; strona ekranu
mov bl, 0x70 ; atrybuty znaków (czarne na białym tle)
mov dx, 0x0000 ; gdzie wypisać (górny lewy róg)
int 0x10
ret
times 510 - ($-$$) db 0 ; uzupełniamy zerami do pozycji 510
dw 0x0aa55 ; wartość aa55 oznacza,
;że jest to sektor bootowalny
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; TO jest juz poza pierwszym sektorem i bedzie wczytane naszym bootloaderem
msg:
db 'To jest tekst w drugim sektorze', 13, 10
msglen equ ($ - msg)
times 1024 - ($-$$) db 0 ; uzupełniamy zerami do pozycji 1024
Tutoriale
http://lukaszsowa.pl/tag/systemy-operacyjne/
Zadanie 1.
Zmodyfikuj program z Listingu 1 w ten sposób aby najpierw był czyszczony ekran (uzupełniany spacjami) a potem na środku wypisywane było Twoje imię i nazwisko.
Zadanie 2.
Wykorzystaj przerwania BIOSu, aby za pomocą klawiatury sterować poruszaniem się obiektu na ekranie (w trybie tekstowym lub graficznym).
Na tej bazie zaimplementuj prostą grę.
Zadanie 3.
Napisać własny mini system operacyjny:
przygotować bootsektor, który uruchomi się wypisując przywitanie,
załaduje drugi program 32-bitowy, przejdzie do trybu chronionego i przekaże sterowanie programowi 32 bitowemu,
program 32 bitowy powinien implementować prostą aplikację.
Jako rozszerzenie można postarać się przygotować obsługę wybranego przerwania z trybu chronionego.