You are on page 1of 17

Universitatea Tehnic a Moldovei

Catedra Automatic i Tehnologii Informaionale

Raport
La 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

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

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

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

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

Fig. 4 ncrcarea kernel-ului

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.

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

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


mov bl, 0ch

; salvam offsetul mesajului in bp (Hello World!)


; setam codul culorii

mov cx, word[str1_len]


mov dh, 10

; incarcam in cx numarul de caractere a sirului

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


#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

;;
;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
mov ch, 0

; Codul functiei
; Numarul de rinduri care vor fi scroll-ate (al=0 -curata ecranul)
; Setarile grafice (culoarea fundalului pentru liniile curatate)
; 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


; coloana din care incepe afisarea

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
call Delay1
cmp byte[color], 15
jne et
mov byte[color], 0
et:
inc byte[color]
jmp main

; Afisam mesajele

;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