lab3_somipp
October 26, 2017 | Author: Jen4ik | Category: N/A
Short Description
lab3_somipp...
Description
Universitatea Tehnică a Moldovei Catedra Automatică și Tehnologii Informaționale
Raport La Sisteme de Operare: Mecanisme interne și principii de proiectare
Lucrarea de laborator Nr.3
Tema : Tratarea excepțiilor
A efectuat:
A verificat:
st.gr. SI-131 Popov Eugen
lect. asist.Ostapenco S.
Chișinău 2015
Scopul lucrării De a studia cauzele finisării execuţiei unui proces şi a crea procedura de lansare și terminare a execuţiei nucleului. Obiective De a prezenta în mod UI, procedurile de lansare a nucleului. Condiții Prin procedură se subînțelege rularea unui proces ce va avea ca scop tratarea evenimentului de citire a nucleului (byte by byte) și încărcarea lui în memorie, care va avea o formă de reprezentare conform imaginilor de mai jos. (vezi condițiile conform baremului) La fel, de această procedură se va trata în mod obligatoriu : -
Verificarea integrității nucleului și tratarea excepțiilor în caz de eroare la încărcare Detectarea arhitecturii procesorului și mărimea memorie ram. Compatibilitatea - conform variantelor condițiilor de mai jos.
Mersul lucrării Lucrarea de laborator constă din trei parți: elaborarea preloaderului, bootloader-ului și elaborarea kernel-ului. Acestea trebuie înscrise pe sectorul de boot, sectorul 2 și respectiv pe sectorul 9 (conform variantei). În bootloader și în kernel am folosit următoarele proceduri: -
WriteString – procedură de afișare a unui șir de caractere pe eran , care folosește funcția 0x13 a întreruperii 0x10.
-
Delay – procedură de realizeare a unei rețineri de 5 secunde , care folosește funcția 0x86 a întreruperii 0x15.
-
ClearScreen – curățarea ecranului . Funcția 0x06 a întreruperii 0x10
-
WriteMessages – procedura ce afișează string-urile din toate 8 offset-uri la coordonata anumită a ecranului. Procedura data apelează procedura WriteString.
-
Beep – procedura ce efectuează un sunet la accesarea tastei enter.
-
ReadSector – procedura citește kernelul de pe sectorul dischetei și îl încarcă în memorie
-
main – procedura principală , care reprezintă un ciclu infinit, ce constă dintr-un șir de afișări și curățiri a ecranului pentru a realizara mișcarea mesajelor afișate.
Pentru a înscrie fișierele pe dischetă am folosit programul Emu8086.
Fig. 1 Folosirea Emu8086 pentru înscrierea pe floppy virtual
Această imagine a dischetei o înscriem pe floppy-ul virtual cu ajutorul softului RawWrite.
Fig. 2 Înscrierea imaginii dischetei pe floppy-ul virtual La pornirea sistemului în VirtualBox vedem următoarele:
Fig. 3 Încărcarea preloader-ului
În continuare la accesarea tastei ENTER se va încărca elemental GUI .
Fig. 4 Încărcarea kernel-ului
Dacă este depistată o eroare de disc, vedem următoarele.
Fig. 5 Eroare de citire
După încărcare controlul este transmis kernel-ului.
Fig. 5 Kernel-ul
Concluzii În urma efectuării lucrării de laborator am consolidat cunoștințele în lucrul cu softul EMU 8086 și cu particularitățile limbajului de asamblare pentru acest emulator. Am căpătat abilități practice în realizarea unui bootloader și kernel , am studiat întreruperile BIOS 10h, 12h, 13h, 16h și diverse funcții ale acestora, care le-am folosit pentru realizarea sarcinii de afișare dinamică a mesajelor, tratarea erorilor și citire de pe sectorul dischetei.
Bibliografie 1. dreamincode. [ASM] Load Kernel From Bootloader. [Resursă electronică].- Regim de acces : http://www.dreamincode.net/forums/topic/262898-asm- load-kernel- from-bootloader/ 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. Codenet. Функции BIOS - INT 13H: дисковый ввод-вывод. [Resursă electronică ].Regim de acces : http://www.codenet.ru/progr/dos/int_0012.php 7. Codenet. Функции BIOS - INT 12H: размер используемой памяти. [Resursă electronică].- Regim de acces : http://www.codenet.ru/progr/dos/int_0011.php
Anexă Anexa A. Codul sursă a preloader-ului #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, 13h ; Codul functiei de afisare a unui sir mov al, 1
; Modul de afisare
mov bh, 0x00 ; Numarul paginii int 0x10
; Call video interrupt
ret WriteMessages: push ax
; ? Salvam continutul
push bx
; | registrelor in starea
push cx
; | in care se aflau inainte de
push dx
; L apelarea functiei
mov bp, str1 mov bl, 0ch
; salvam offsetul mesajului in bp (Hello World!) ; setam codul culorii
mov cx, word[str1_len] mov dh, 10 mov dl, [str1_x]
; incarcam in cx numarul de caractere a sirului
; rindul din care incepe afisarea ; coloana din care incepe afisarea
call WriteString mov bp, str2
; salvam offsetul mesajului in bp (This is )
mov bl, 0ch
; setam codul culorii
mov cx, word[str2_len] mov dh, 11
; incarcam in cx numarul de caractere a sirului
; rindul din care incepe afisarea
mov dl, [str2_x]
; coloana din care incepe afisarea
call WriteString pop dx
; ? Restabilim
pop cx
; | continutul
pop bx
; | registrelor
pop ax
; L in starea inainte de apelare
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)
mov dx, 0x20 int 0x15
; in dx bitul inferior
(800 milisecunde)
; Apelarea intreruperii BIOS
pop dx
; Restabilim
pop cx
; continutul
pop ax
; registrelor
ret beep: mov ah, 02h mov dl, 07h int 21h ret ReadSector: push ax push bx push cx push dx call beep call Delay pop dx pop cx pop bx pop ax mov ah, 02h mov al, 1 mov ch, 0 mov cl, 9 mov dh, 0
;mov dl, 0 mov bx, 0800h mov es, bx mov bx, 0 int 13h ; integrity check: ;cmp ;je
es:[0000],0E9h ; first byte of kernel must be 0E9 (jmp). integrity_check_ok
integrity_check_ok: ; pass control to kernel: jmp
0800h:0000h
ret
;;;;;;;;;;;;;;;;;;;;;;;;;FUNCTIA PRINCIPALA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; main: call WriteMessages mov ah , 00h int 16h cmp al, 1bh jnz here int 19h here: cmp al,13 je ReadSector
;Data ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;;
Definima: 4 mesaje in 8 offset-uri Lungimea fiecarui string Coordonata pe x a fiecarui string
;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
str1 db 'Restart-ESC', 0 str1_len dw 11 str1_x db 34 str2 db 'Load kernel-ENTER' ,0 str2_len dw 17 str2_x db 34 TIMES 510 - ($ - $$) db 0
;Fill the rest of sector with 0
DW 0xAA55
;Add boot signature at the end of bootloader
Anexa B. Codul sursă al kernel-ului #make_bin# ; 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. mov ax, 0 mov bx, 0 mov cx, 0 mov dx, 0 jmp main
; Salt la punctul de intrare in program
WriteString1: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;
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 Delay1: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;
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, 0x2E
; Durata pauzei in microsecunde (in cx bitul superior)
mov dx, 0xE0
; in dx bitul inferior
(800 milisecunde)
int 0x15
; Apelarea intreruperii BIOS
pop dx
; Restabilim
pop cx
; continutul
pop ax
; registrelor
ClearScreen1: ; 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
; L apelarea functiei
mov ah, 0x06 mov al, 0 mov bh, 0x00
; Codul functiei ; Numarul de rinduri care vor fi scroll-ate (al=0 -curata ecranul) ; 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
; L in starea inainte de apelare
ret WriteMessage: push ax
; Ă Salvam continutul
push bx
; | registrelor in starea
push cx
; | in care se aflau inainte de
push dx
; L apelarea functiei
mov bp, str1
; salvam offsetul mesajului in bp (Hello World!)
mov bl, byte[color]
; setam codul culorii
mov cx, 8 ; incarcam in cx numarul de caractere a sirului mov dh, 10 mov dl, 35
; rindul din care incepe afisarea ; coloana din care incepe afisarea
call WriteString1 mov bp, str2 mov bl, 4
; salvam offsetul mesajului in bp (Hello World!) ; setam codul culorii
mov cx, 10 ; incarcam in cx numarul de caractere a sirului mov dh, 8 mov dl, 34
; rindul din care incepe afisarea
call WriteString1
; coloana din care incepe afisarea
mov bp, str3
; salvam offsetul mesajului in bp (Hello World!)
mov bl, 4
; setam codul culorii
mov cx, 23 ; incarcam in cx numarul de caractere a sirului mov dh, 9
; rindul din care incepe afisarea
mov dl, 27
; coloana din care incepe afisarea
call WriteString1 pop dx
; Ă Restabilim
pop cx
; | continutul
pop bx
; | registrelor
pop ax
; L in starea inainte de apelare
ret ;;;;;;;;;;;;;;;;;;;;;;;FUNCTIA PRINCIPALA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; main: call ClearScreen1 call WriteMessage call Delay1 cmp byte[color], 15 jne et mov byte[color], 0 et: inc byte[color] jmp main
;Data
; Afisam mesajele
str1 db 'Popov OS!', 0 str11_len db 8 color db 3 str11_x db 34 str2 db 'Kernel 1.0',0 str3 db 'Release date 11.10.2015',0 TIMES 512 - ($ - $$) db 0
;Fill the rest of sector with 0
Anexa C. Codul sursă a loader-ului
#make_bin# #AX=0000h# #BX=0000h# #CX=0000h# #DX=0000h# #SI=0000h# #DI=0000h# #BP=0000h# mov ax,0800h mov ds, ax jmp main Delay1: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;
Procedura de efectuare a unei retineri
;;
Functia 0x86 a intreruperii BIOS 0x15
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; push ax
;Salvam
push bx push cx
;continutul
push dx
;registrelor
mov ah, 0x86
; Codul functiei
mov cx, 0x13
; Durata pauzei in microsecunde (in cx bitul superior)
mov dx, 0x88
; in dx bitul inferior
(800 milisecunde)
int 0x15
; Apelarea intreruperii BIOS
pop dx
; Restabilim
pop cx
; continutul
pop bx pop ax
; registrelor
ret
DrawBar: push ax push bx push cx push dx mov bp, offset bar mov bl, 15
; salvam offsetul mesajului in bp (Hello World!) ; setam codul culorii
mov cx, 1 ; incarcam in cx numarul de caractere a sirului mov dh, 10 mov dl, 33
; rindul din care incepe afisarea ; coloana din care incepe afisarea
mov ah, 13h ; Codul functiei de afisare a unui sir mov al, 1
; Modul de afisare
mov bh, 0x00 ; Numarul paginii int 0x10
; Call video interrupt
mov cx, 1 ; incarcam in cx numarul de caractere a sirului mov dh, 10 mov dl, 49
; rindul din care incepe afisarea ; coloana din care incepe afisarea
mov ah, 13h ; Codul functiei de afisare a unui sir mov al, 1
; Modul de afisare
mov bh, 0x00 ; Numarul paginii int 0x10
; Call video interrupt
pop dx pop cx pop bx pop ax ret
DrawBox: push ax push bx push cx push dx mov bp, offset symbol mov bl, ds:[color]
; salvam offsetul mesajului in bp (Hello World!) ; setam codul culorii
mov cx, 1 ; incarcam in cx numarul de caractere a sirului mov dh, 10 mov dl, [x]
; rindul din care incepe afisarea ; coloana din care incepe afisarea
mov ah, 13h ; Codul functiei de afisare a unui sir mov al, 1
; Modul de afisare
mov bh, 0x00 ; Numarul paginii int 0x10 mov ah, 01h
; Call video interrupt ;ascundem
mov cx, 2607h
;cursorul
int 10h pop dx pop cx pop bx pop ax ret
DrawPercent: push ax push bx push cx push dx mov bp, offset percent mov bl, 15
; salvam offsetul mesajului in bp (Hello World!)
; setam codul culorii
mov cx, 1 ; incarcam in cx numarul de caractere a sirului mov dh, 11 mov dl, 47
; rindul din care incepe afisarea ; coloana din care incepe afisarea
mov ah, 13h ; Codul functiei de afisare a unui sir mov al, 1
; Modul de afisare
mov bh, 0x00 ; Numarul paginii int 0x10 pop dx pop cx pop bx
; Call video interrupt
pop ax ret ReadSector: mov ah, 02h mov al, 1 mov ch, 0 mov cl, 9 mov dh, 0 mov bx, 0600h mov es, bx mov bx, 0 int 13h ; pass control to kernel: jmp
0600h:0000h
ret CheckSector: push ax push bx push cx push dx mov ah, 02h mov al, 1 mov ch, 0 mov cl, 9 mov dh, 0
mov bx, 0400h mov es, bx mov bx, 0 int 13h mov bx, 0800h mov es, bx cmp al, 0 jne c call Error b: mov ah , 00h int 16h cmp al, 1bh jne b int 19h c: pop dx pop cx pop bx pop ax ret
Error: push ax push bx
push cx push dx mov bp, offset err_msg mov bl, 4
; salvam offsetul mesajului in bp (Hello World!)
; setam codul culorii
mov cx, 29 ; incarcam in cx numarul de caractere a sirului mov dh, 8 mov dl, 28
; rindul din care incepe afisarea ; coloana din care incepe afisarea
mov ah, 13h ; Codul functiei de afisare a unui sir mov al, 1
; Modul de afisare
mov bh, 0x00 ; Numarul paginii int 0x10
; Call video interrupt
mov bp, offset reb mov bl, 4
; salvam offsetul mesajului in bp (Hello World!)
; setam codul culorii
mov cx, 36 ; incarcam in cx numarul de caractere a sirului mov dh, 13 mov dl, 24
; rindul din care incepe afisarea ; coloana din care incepe afisarea
mov ah, 13h ; Codul functiei de afisare a unui sir mov al, 1
; Modul de afisare
mov bh, 0x00 ; Numarul paginii int 0x10 pop dx pop cx pop bx pop ax ret
; Call video interrupt
Message: push ax push bx push cx push dx mov bp, offset msg mov bl, 15
; salvam offsetul mesajului in bp (Hello World!)
; setam codul culorii
mov cx, 9 ; incarcam in cx numarul de caractere a sirului mov dh, 11 mov dl, 36
; rindul din care incepe afisarea ; coloana din care incepe afisarea
mov ah, 13h ; Codul functiei de afisare a unui sir mov al, 1
; Modul de afisare
mov bh, 0x00 ; Numarul paginii int 0x10 pop dx pop cx pop bx pop ax ret
LoadMess: push ax push bx push cx
; Call video interrupt
push dx ;mov bp, offset load25+si mov bl, 15
; salvam offsetul mesajului in bp (Hello World!)
; setam codul culorii
mov cx,2 ; incarcam in cx numarul de caractere a sirului mov dh, 11
; rindul din care incepe afisarea
mov dl, 44
; coloana din care incepe afisarea
mov ah, 13h ; Codul functiei de afisare a unui sir mov al, 1
; Modul de afisare
mov bh, 0x00 ; Numarul paginii int 0x10
; Call video interrupt
pop dx pop cx pop bx pop ax ret LoadComplete: push ax push bx push cx push dx mov bp, offset load100 mov bl, 15
; salvam offsetul mesajului in bp (Hello World!)
; setam codul culorii
mov cx, 3 ; incarcam in cx numarul de caractere a sirului mov dh, 11 mov dl, 44
; rindul din care incepe afisarea ; coloana din care incepe afisarea
mov ah, 13h ; Codul functiei de afisare a unui sir mov al, 1
; Modul de afisare
mov bh, 0x00 ; Numarul paginii int 0x10 mov ah, 01h mov cx, 2607h
; Call video interrupt ;ascundem ;cursorul
int 10h pop dx pop cx pop bx pop ax ret PrintRAM: push ax push bx push cx push dx mov bp, offset ram_mess mov bl, 2
; salvam offsetul mesajului in bp ; setam codul culorii
mov cx, 17
; incarcam in cx numarul de caractere a sirului
mov dh, 0
; rindul din care incepe afisarea
mov dl, 0
; coloana din care incepe afisarea
mov ah, 13h mov al, 1 mov bh, 0x00
; Codul functiei de afisare a unui sir ; Modul de afisare ; Numarul paginii
int 0x10 mov ah, 01h mov cx, 2607h int 10h pop dx pop cx pop bx pop ax ret
DisplayRAM: push ax push bx push cx push dx int 12h mov bl,10 div bl or ah, 30h mov di,offset result mov byte ptr[di+2],ah xor ah, ah div bl or ah, 30h mov di,offset result
; Call video interrupt ;ascundem ;cursorul
mov byte ptr[di+1],ah xor ah, ah div bl or ah, 30h mov byte ptr[di],ah xor ah, ah mov bp, offset result mov bl, 2 mov cx, 3
; salvam offsetul mesajului in bp (Hello World!)
; setam codul culorii ; incarcam in cx numarul de caractere a sirului
mov dh, 0
; rindul din care incepe afisarea
mov dl, 12
; coloana din care incepe afisarea
mov ah, 13h ; Codul functiei de afisare a unui sir mov al, 1
; Modul de afisare
mov bh, 0x00 ; Numarul paginii int 0x10 mov ah, 01h mov cx, 2607h int 10h pop dx pop cx pop bx pop ax ret
main:
; Call video interrupt ;ascundem ;cursorul
call PrintRAM call DisplayRAM call DrawBar
;desanam cite o bara la inceput si sfirsit
call Message
;afisam mesajul "Loading"
call DrawPercent
;afisam mesajul "%"
mov bp, offset load25 mov cx, 15
;incarcam in bp adresa ce contine valoarea 25
; setam contorul ciclului(desenam 15 elemente)
l: call CheckSector push bp
;salvam continutul bp pentru a incrementa valoarea acestuia
ulterior(incrementam offsetul 25, 50, 75) call DrawBox
;desenam un element
call Delay1 pop bp mov ax, cx
;restabilim continutul bp ;incarcam contorul in ax pentru impartirea ulterioara
mov bl, 4 div bl cmp ah, 0 jnz et2
;impartim la 4 ;verificam daca restul inmpartirii este 0 ;daca da incrementam culoarea si offsetul pentru valoarea
procentelor, daca nu- salt la et2 inc color call LoadMess add bp, 3 et2: inc x loop l
;incrementam coordonata x pentru box
call LoadComplete
;afisam mesajul "Loading 100%"
call Delay1 call ReadSector jmp $ bar db 124 x db 34 y db 10 symbol db 222, 0 msg db 'Loading ',48,0 percent db 37, 0 load25 db 50,53,0 load50 db 53,48,0 load75 db 55,53,0 load100 db 49,48,48,0 ram_mess db 'Memory size: KB',0 color db 1 result db 0,0,0,0,0 err_msg db 'ERROR: Floppy disk not found!',0 reb db 'Enter disk and press [ESC] to reboot',0
db 512 - ($ - $$) DUP(0)
;Fill the rest of sector with 0
;DW 0xAA55
;Add boot signature at the end of bootloader
View more...
Comments