lab1_somipp

download lab1_somipp

of 14

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