lab3_somipp

October 26, 2017 | Author: Jen4ik | Category: N/A
Share Embed Donate


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

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF