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.