lab2_somipp

download lab2_somipp

of 17

Transcript of lab2_somipp

  • 7/25/2019 lab2_somipp

    1/17

    Universitatea Tehnic a Moldovei

    Catedra Automatic i Tehnologii Informaionale

    RaportLa Sisteme de Operare: Mecanisme interne i principii de proiectare

    Lucrarea de laborator Nr.2

    Tema :Dezvoltarea kernel-ului

    A efectuat: A verificat:

    st.gr. SI-131 Popov Eugen lect. asist.Ostapenco S.

    Chiinu 2015

  • 7/25/2019 lab2_somipp

    2/17

    Condiii

    Una din concepiile de baz, care servete pentru nelegerea corect a structurii sistemelor de

    operare (SO), este concepia procesului. Acest termen a fost pentru prima dat utilizat n anii 60

    de ctre elaboratorii SO MULTIX i se folosete pe larg n teoria SO. Exist mai multe definiii a

    termenului proces, dintre care menionm:1. Programul ce se execut;

    2. Exemplarul programului, ce se executa la calculator;

    3. Obiect, care poate fi identificat i executat de ctre procesor;

    4. Unitatea de lucru, ce se caracterizeaz printr-un lan de activiti consecutive, stare

    curent i setul de resurse de sistem alocate.

    Procesul conine patru componente:

    1. Codul ce trebuie executat;

    2. Date necesare pentru lucrul programului (variabile, spaiul de lucru, bufer, .a.)

    3. Contextul programului (cuvntul de stare a procesului).

    4. Stiva procesului (counterul operatiilor proceselor)

    Sarcina

    Dezvoltarea nucleului se va efectua conform condiiilor de mai jos :

    a) sectorul unde va fi nscris nucleul se va seta conform numrului de ordine din

    registrul grupei.

    b) se vor utiliza ntreruperile : int 10h, 13h, 16h, 20h

  • 7/25/2019 lab2_somipp

    3/17

    Mersul lucrrii

    Lucrarea de laborator const din dou pari: elaborarea bootloader-ului i elaborarea

    kernel-ului. Acestea trebuie nscrise pe sectorul de boot i respectiv pe sectorul 9 (conform

    variantei).

    n bootloader i n kernel am folosit urmtoarele proceduri:- WriteString procedur de afiare a unui ir de caractere pe eran , care folosete funcia

    0x13 a ntreruperii 0x10.

    - Delay procedur de realizeare a unei reineri de 5 secunde , 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 coordonata

    anumit a ecranului. Procedura data apeleaz procedura WriteString.

    - Beep procedura ce efectueaz un sunet la accesarea tastei enter.

    - ReadSector procedura citete kernelul de pe sectorul dischetei i l ncarc n memorie

    - 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.

    Pentru a nscrie fiierele pe dischet am folosit programul Emu8086.

    Fig. 1 Folosirea Emu8086 pentru nscrierea pe floppy virtual

  • 7/25/2019 lab2_somipp

    4/17

    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 urmtoarele:

    Fig. 3 ncrcarea bootloader-ului

  • 7/25/2019 lab2_somipp

    5/17

    n continuare la accesarea tastei ENTER se va ncrca kernel-ul.

    Fig. 4 ncrcarea kernel-ului

  • 7/25/2019 lab2_somipp

    6/17

    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 kernel , am studiat ntreruperile BIOS 10h, 13h, 16h i diverse

    funcii ale acestora, care le-am folosit pentru realizarea sarcinii de afiare dinamic a mesajelor i

    citire de pe sectorul dischetei.

  • 7/25/2019 lab2_somipp

    7/17

    Bibliogfie

    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. Emu documentation. making your own operating system. [Resurs electronic].- Regim

    de acces :

    file:///C:/emu8086/documentation/index.html

    http://www.dreamincode.net/forums/topic/262898-asm-load-kernel-from-bootloader/http://www.dreamincode.net/forums/topic/262898-asm-load-kernel-from-bootloader/http://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://c/emu8086/documentation/index.htmlhttp://c/emu8086/documentation/index.htmlhttp://c/emu8086/documentation/index.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://www.dreamincode.net/forums/topic/262898-asm-load-kernel-from-bootloader/
  • 7/25/2019 lab2_somipp

    8/17

    Anex

    Anexa A. Codul surs a boorloader-ului

    #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, 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 ; salvam offsetul mesajului in bp (Hello World!)

    mov bl, 0ch ; setam codul culorii

    mov cx, word[str1_len] ; incarcam in cx numarul de caractere a sirului

    mov dh, 10 ; rindul din care incepe afisarea

  • 7/25/2019 lab2_somipp

    9/17

    mov dl, [str1_x] ; 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] ; 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

    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 ; in dx bitul inferior (800 milisecunde)

    int 0x15 ; Apelarea intreruperii BIOS

  • 7/25/2019 lab2_somipp

    10/17

    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

  • 7/25/2019 lab2_somipp

    11/17

    mov dh, 0

    ;mov dl, 0

    mov bx, 0800h

    mov es, bx

    mov bx, 0

    int 13h

    ; integrity check:

    ;cmp es:[0000],0E9h ; first byte of kernel must be 0E9 (jmp).

    ;je 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

  • 7/25/2019 lab2_somipp

    12/17

    ;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

  • 7/25/2019 lab2_somipp

    13/17

    Anexa B. Codul surs al kernel-ului

    #fasm# ; this code is for flat assembler

    #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 ;;

  • 7/25/2019 lab2_somipp

    14/17

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    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 ; 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

  • 7/25/2019 lab2_somipp

    15/17

    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 ; rindul din care incepe afisarea

    mov dl, 35 ; coloana din care incepe afisarea

    call WriteString1

    mov bp, str2 ; salvam offsetul mesajului in bp (Hello World!)

    mov bl, 4 ; setam codul culorii

    mov cx, 10 ; incarcam in cx numarul de caractere a sirului

    mov dh, 8 ; rindul din care incepe afisarea

    mov dl, 34 ; coloana din care incepe afisarea

  • 7/25/2019 lab2_somipp

    16/17

    call WriteString1

    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 ; Afisam mesajele

    call Delay1

    cmp byte[color], 15

    jne et

    mov byte[color], 0

    et:

    inc byte[color]

    jmp main

  • 7/25/2019 lab2_somipp

    17/17

    ;Data

    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