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