lab1_somipp
Transcript of lab1_somipp
-
7/25/2019 lab1_somipp
1/14
Universitatea Tehnic a Moldovei
Catedra Automatic i Tehnologii Informaionale
RaportLa Sisteme de Operare: Mecanisme interne i principii de proiectare
Lucrarea de laborator Nr.1
Tema :Dezvoltarea bootloader-ului de sistem.
A efectuat: A verificat:
st.gr. SI-131 Popov Eugen lect. asist.Ostapenco S.
Chiinu 2015
-
7/25/2019 lab1_somipp
2/14
Obiective:
Dezvoltarea propriului bootloader i nscrierea acestuia pe dischet.
Condiii:
Pentru acest lucrare de laborator vom face cunostin cu limbajul de programareassembler, i vom utiliza ntreruperile BIOS pentru a nelege modul n care vom dezvolta
propriul nostru boot loader.
Ducem cont de modul in care BIOS-ul analizeaz sectoarele de pe dischet.
Sectorul citit de BIOS la ncrcarea FDD-ului(0:A) are adresa 0xAA55 ce reprezint un offset de
510bytes de pe dischet. Teoretic acesta reprezint primul sector, care l vom seta pentru
ncrcarea kernel-ului de sistem dezvoltat la urmtoarele lucrri de laborator.
Un exemplu de bootstrap este expus mai jos:
;**************************************
[BITS 16]
ORG 0
INT 0x18
TIMES 510-($-$$) DB 0
DW 0xAA55;**************************************
Atunci cnd BIOS-ul va citi boot loader-ul de pe primul sector al dischetei, codul
compilat n fiierul nostru COM va fi ncrcat pe adresa
0:07C00h, de unde propriu zis, vom suprancrca regitrii.
Deci, sarcina este de a scrie un sector de boot, asamblat ntr-un fiier binar simplu
(conform unuipunct de mai jos) ,care n final trebuie nscris pe primul sector al discului, cu
ajutorul aplicaiei voastre - dezvoltata n C++/C#, Java etc.
Sarcina:
Afiarea a 4 sau 6 mesaje pe centrul ecranului - citit minimum din 8 offset-uri.
Unul din aceste mesaje va clipi periodic cu un interval de minim 2 - 3s i i va schimba culoarea
(minim 4 culori).i celelalte mesaje se vor mica orizontal pe centrul ecranului de la dreapta spre
stnga n ciclu periodic.
-
7/25/2019 lab1_somipp
3/14
Mersul lucrrii:
Se presupune c sistemul nostru de operare va lucra n regim DOS , de aceea e nevoie s
instalm o main virtual cu setrile corespunztoare.
Fig 1. Setrile mainei virtuale create
n continuare este nevoie s scriem codul nostru n limbaj de asamblare, care va fi citit de
pe dischet.
[BITS 16] ;Tells the assembler that its a 16 bit code
[ORG 0x7C00] ;Origin, tell the assembler that where the code will be in memory after it is been loaded
Prin aceast porune de cod de la nceputul programului comunicm asamblorului c
avem un cod pe 16 bii i adresa de la care va ncepe citirea codului.
Pentru realizarea sarcinii de afiare a 4 mesaje pe centrul ecranul am realizat urmtoarele
proceduri, care folosesc ntreruperile BIOS:- WriteString procedur de afiare a unui ir de caractere pe eran , care folosete funcia
-
7/25/2019 lab1_somipp
4/14
0x13 a ntreruperii 0x10.
- Delay procedur de realizeare a unei reineri de 800 milisecunde , care folosete
funcia 0x86 a ntreruperii 0x15.
-
ClearScreen curarea ecranului . Funcia 0x06 a ntreruperii 0x10
-
WriteMessages procedura ce afieaz string-urile din toate 8 offset-uri la coordonataanumit a ecranului. Procedura data apeleaz procedura WriteString.
- Decrement procedura decrementeaz coordonata x a tuturor mesajelor de pe ecran .
-
RestartMessages procedura restabilete poziia mesajelor n partea extreme din dreapta.
- Divide procedura mparte contorul principal din funcia main , pentru a realiza schimba
culorii la fiecare a 8-a iteraie.
- main procedura principal , care reprezint un ciclu infinit, ce const dintr-un ir de
afiri i curiri a ecranului pentru a realizara micarea mesajelor afiate.
Programul sfrete cu urmtoarea poriune :
TIMES 510 - ($ - $$) db 0 ; se umple restul sectorului cu 0
DW 0xAA55 ; semntura sfritului bootloader-ului
Pentru compilarea codului am folosit compilatorul NASM .
Fig 2. Compilatorul NASM
Dup compilarea fierului nostru cu extensia .asm obinem fiierul .img , pe care l
nscriem pe dischet. Dup care pornim maina virtual.
-
7/25/2019 lab1_somipp
5/14
Fig 2. Rezultatul boot-rii fiierului de pe dischet
Concluzii:
n urma efecturii lucrrii de laborator am fcut cunotin cu sintaxa FASM i cu
particularitile limbajului de asamblare pentru acest compilator. Am cptat abiliti practice n
realizarea unui bootloader i am studiat ntreruperile BIOS 10h i 15h i diverse funcii ale
acestora, care le-am folosit pentru realizarea sarcinii de afiare dinamic a mesajelor.
-
7/25/2019 lab1_somipp
6/14
Anex
; BIOS reads 512 bytes from cylinder: 0, head: 0, sector: 1
; of bootable floppy drive, then it loads this data into
; memory at 0000:7c00h and starts the execution from the first byte.
#fasm# ; use flat assembler syntax
#make_boot#
ORG 0x7C00 ;Origin, tell the assembler that where the code will be in memory after it
is been loaded
jmp main ; Salt la punctul de intrare in program
WriteString:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Procedura de afisare a unui sir de caractere ;;
;; Functia 0x13 a intreruperii BIOS 0x10 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ah, 0x13 ; Codul functiei de afisare a unui sir
mov al, 1 ; Modul de afisare
mov bh, 0x00 ; Numarul paginii
int 0x10 ; Call video interrupt
ret
Delay:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Procedura de efectuare a unei retineri ;;
;; Functia 0x86 a intreruperii BIOS 0x15 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
push ax ;Salvam
push cx ;continutul
push dx ;registrelor
mov ah, 0x86 ; Codul functiei
mov cx, 0x3 ; Durata pauzei in microsecunde (in cx bitul superior)
-
7/25/2019 lab1_somipp
7/14
mov dx, 0x20 ; in dx bitul inferior (800 milisecunde)
int 0x15 ; Apelarea intreruperii BIOS
pop dx ; Restabilim
pop cx ; continutulpop ax ; registrelor
ret
ClearScreen: ; Ecranul are dimensiunea de 24x79 pixeli
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Procedura de curatare a ecranului ;;
;; Functia 0x06 a intreruperii BIOS 0x10 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
push ax ; Salvam continutul
push bx ; |registrelor in starea
push cx ; in care se aflau inainte de
push dx ; apelarea functiei
mov ah, 0x06 ; Codul functiei
mov al, 0 ; Numarul de rinduri care vor fi scroll-ate (al=0 -curata ecranul)
mov bh, 0x00 ; Setarile grafice (culoarea fundalului pentru liniile curatate)
mov ch, 0 ; Rindul din care incepe curatarea
mov cl, 0 ; Coloana din care incepe curatarea
mov dh, 24 ; Rindul in care sfirseste curatarea
mov dl, 79 ; Coloana in care sfirseste curatarea
int 0x10 ; Apelarea intreruperii BIOS
pop dx ; Restabilim
pop cx ; continutul
pop bx ; registrelor
pop ax ; in starea inainte de apelare
ret
-
7/25/2019 lab1_somipp
8/14
WriteMessages:
push ax ; Salvam continutul
push bx ; registrelor in starea
push cx ; in care se aflau inainte depush dx ; apelarea functiei
mov bp, str1 ; salvam offsetul mesajului in bp (Hello World!)
mov bl, 0001 ; setam codul culorii
mov cx, word[str1_len] ; incarcam in cx numarul de caractere a sirului
mov dh, 10 ; rindul din care incepe afisarea
mov dl, [str1_x] ; coloana din care incepe afisarea call WriteString
mov bp, str2 ; salvam offsetul mesajului in bp (This is )
mov bl, 0001 ; setam codul culorii
mov cx, word[str2_len] ; incarcam in cx numarul de caractere a sirului
mov dh, 11 ; rindul din care incepe afisarea
mov dl, [str2_x] ; coloana din care incepe afisarea
call WriteString
mov bp, str3 ; salvam offsetul mesajului in bp (my new )
mov bl, 0001 ; setam codul culorii
mov cx, word[str3_len] ; incarcam in cx numarul de caractere a sirului
mov dh, 11 ; rindul din care incepe afisarea
mov dl, [str3_x] ; coloana din care incepe afisarea (adaugam la coloana initiala lungimea
sirului afisat anterior)
call WriteString
mov bp, str4 ; salvam offsetul mesajului in bp (test OS.)
mov bl, 0001 ; setam codul culorii
mov cx, word[str4_len] ; incarcam in cx numarul de caractere a sirului
mov dh, 0xB ; rindul din care incepe afisarea
mov dl, [str4_x] ; coloana din care incepe afisarea (adaugam la coloana initiala lungimea
sirului afisat anterior)
-
7/25/2019 lab1_somipp
9/14
call WriteString
mov bp, str5 ; salvam offsetul mesajului in bp (Enjoy )
mov bl, 0001 ; setam codul culorii
mov cx, [str5_len] ; incarcam in cx numarul de caractere a siruluimov dh, 12 ; rindul din care incepe afisarea
mov dl, [str5_x] ; coloana din care incepe afisarea
call WriteString
mov bp, str6 ; salvam offsetul mesajului in bp (it!)
mov bl, 0001 ; setam codul culorii
mov cx, [str6_len] ; incarcam in cx numarul de caractere a siruluimov dh, 12 ; rindul din care incepe afisarea
mov dl, [str6_x] ; coloana din care incepe afisarea (adaugam la coloana initiala lungimea
sirului afisat anterior)
call WriteString
mov bp, str7 ; salvam offsetul mesajului in bp (Popov )
mov bl, [color] ; setam codul culorii
mov cx, [str7_len] ; incarcam in cx numarul de caractere a sirului
mov dh, 13 ; rindul din care incepe afisarea
mov dl, [str7_x] ; coloana din care incepe afisarea
call WriteString
mov bp, str8 ; salvam offsetul mesajului in bp (Eugen)
mov bl, [color] ; setam codul culorii
mov cx, [str8_len] ; incarcam in cx numarul de caractere a sirului
mov dh, 13 ; rindul din care incepe afisarea
mov dl, [str8_x] ; coloana din care incepe afisarea (adaugam la coloana initiala lungimea
sirului afisat anterior)
call WriteString
pop dx ; Restabilim
pop cx ; continutul
pop bx ; registrelor
-
7/25/2019 lab1_somipp
10/14
pop ax ; in starea inainte de apelare
ret
Decrement:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Procedura decrementeaza coordonatele de afisare ;;
;; a mesajelor pentru a realiza miscarea acestora ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov al, [str1_x]
sub al, 1
mov [str1_x], al
mov al, [str2_x]sub al, 1
mov [str2_x], al
mov al, [str3_x]
sub al, 1
mov [str3_x], al
mov al, [str4_x]
sub al, 1
mov [str4_x], al
mov al, [str5_x]
sub al, 1
mov [str5_x], al
mov al, [str6_x]
sub al, 1
mov [str6_x], al
ret
RestartMessages:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Procedura restabileste coordonatele mesajeor ;;
;; in pozitia extreama din dreapta ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov byte[str1_x],62
-
7/25/2019 lab1_somipp
11/14
mov byte[str2_x],56
mov byte[str3_x],64
mov byte[str4_x],71
mov byte[str5_x],64
mov byte[str6_x],69ret
Divide:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Procedura imparte contorul ciclului principal la 8 ;;
;; astfel la fiecare a 8-a iteratie se reseteaza ;;
;; contorul schimbarii culorii mesajului ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax, cx
mov bl, 8
div bl
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;FUNCTIA PRINCIPALA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
main:
mov cx, 200 ; Setam contorul ciclului principal
et:
call WriteMessages ; Afisam mesajele
cmp byte[str2_x], 0 ; Comparam pozitia mesajelor cu pozitia extrema din stinga
jnz et1 ; Daca nu am ajuns la coordonata 0 - salt la et1
call RestartMessages ; Daca am ajuns la coordonata 0 , amplasam mesajele in pozitia
extrema dreapta
et1:
call Delay ; Apelam retinerea de 800 microsecunde
call ClearScreen ; Curatim ecram
call Decrement ; Calculam coordonatele noi ale mesajelor
call Divide ; Impartim contorul cx la 8
cmp ah, 0 ; Daca restul impartirii(AH) nu este 0 - salt la et2
-
7/25/2019 lab1_somipp
12/14
jnz et2
inc byte[color] ; Daca restul este 0 schimbam culoarea mesajului (la fiecarea a 8-a
iteratie)
et2:
cmp byte[color], 8 ; Daca codul culorii nu este 8 - salt la et3jnz et3
mov byte[color], 1 ; Daca codul culorii este 8 - il resetam la 1
et3:
cmp cx,1 ; Comparam contorul cx cu 1 pentru a verifica terminarea ciclului
jz main ; Daca contorul este 1 - salt la main. Reluam ciclul.
LOOP et
;Data
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Definima: 4 mesaje in 8 offset-uri ;;
;; Lungimea fiecarui string ;;
;; Coordonata pe x a fiecarui string ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
str1 db 'Hello World!', 0
str1_len dw 12
str1_x db 34
str2 db 'This is ' ,0
str2_len dw 8
str2_x db 0x1C
str3 db 'my new ' ,0
str3_len dw 7
str3_x db 36
str4 db 'test OS.' ,0
str4_len dw 8
str4_x db 43
str5 db 'Enjoy ' ,0
str5_len dw 6
str5_x db 36
str6 db 'it!' ,0
-
7/25/2019 lab1_somipp
13/14
str6_len dw 3
str6_x db 41
str7 db 'Popov ' ,0
str7_len dw 6
str7_x db 34str8 db 'Eugen' ,0
str8_len dw 5
str8_x db 40
color db 0001
TIMES 510 - ($ - $$) db 0 ;Fill the rest of sector with 0DW 0xAA55 ;Add boot signature at the end of bootloader
-
7/25/2019 lab1_somipp
14/14
Bibliogfie:
1. Stackoverflow. Unsigned division in nasm. [Resurs electronic].- Regim de acces :
http://stackoverflow.com/questions/26457647/unsigned-division-in-nasm
2. Asmcommunity. Looping in NASM. [Resurs electronic].- Regim de acces :
http://www.asmcommunity.net/forums/topic/?id=30742
3. Nasm.us. The Netwide Assembler: NASM . [Resurs electronic].- Regim de acces:
http://www.nasm.us/doc/nasmdoc4.html
4. Stackoverflow. Basic NASM bootstrap. [Resurs electronic].- Regim de acces :
http://stackoverflow.com/questions/10853425/basic-nasm-bootstrap
5. Codenet. BIOS - INT 10H: . [Resurs electronic].- Regim de
acces : http://www.codenet.ru/progr/dos/int_0009.php
6. Cyberforum. DOS, 21 Assembler.
[Resurs electronic].- Regim de acces :
http://www.cyberforum.ru/assembler/thread724827.html
http://stackoverflow.com/questions/26457647/unsigned-division-in-nasmhttp://stackoverflow.com/questions/26457647/unsigned-division-in-nasmhttp://www.asmcommunity.net/forums/topic/?id=30742http://www.asmcommunity.net/forums/topic/?id=30742http://www.nasm.us/doc/nasmdoc4.htmlhttp://www.nasm.us/doc/nasmdoc4.htmlhttp://stackoverflow.com/questions/10853425/basic-nasm-bootstraphttp://stackoverflow.com/questions/10853425/basic-nasm-bootstraphttp://www.codenet.ru/progr/dos/int_0009.phphttp://www.codenet.ru/progr/dos/int_0009.phphttp://www.cyberforum.ru/assembler/thread724827.htmlhttp://www.cyberforum.ru/assembler/thread724827.htmlhttp://www.cyberforum.ru/assembler/thread724827.htmlhttp://www.codenet.ru/progr/dos/int_0009.phphttp://stackoverflow.com/questions/10853425/basic-nasm-bootstraphttp://www.nasm.us/doc/nasmdoc4.htmlhttp://www.asmcommunity.net/forums/topic/?id=30742http://stackoverflow.com/questions/26457647/unsigned-division-in-nasm