1.Structura SO
Nucleul are componentele:
- "Nucelul propriu zis"
- Driverii device-urilor
- Apelurile de sistem
In dependenta de organizarea interactiunii interne, nuceleele se impart in "micronuclee (microkernel)" si nucleee monolit.
Sistemele cu microkernel se construiesc dupa principu modular, au nucleu distinct, si mecanizam de interactiune intre driverele de dispozitiv si procese. Dupa asa principiu se contruiesc sistemele de tipm real (QNX, HURD).
Nucleul monolit are o structura interna mai rigida. Toate driverele instalate sunt puternic legate intre ele, de obicei prin apeluri directe. Dupa asa principii se construiesc SO obisnuite (Linux, FreeBSD).
2. Capacitățile hardware ale calculatoarelor
Un procesor, intr-un moment de timp, poate executa doar o singura programa. In legatura cu acest lucru dezvoltatorii au creat posibilitati multitasc.
Aceasta consta in faptul ca, procesorul executa o programa(proces).Apoi, dupa un timp oarecare(microsecunde), SO schimba procesorul la alta programa. Toate registrele programei curente se pastreaza. Acest lucru este necesar pentru ca peste un timp, sa se transmita controlul din nou acestei programe. Programa nu observa careva schimbari, pentru ea procesul de trecere ramine neobservat.
Pentru ca programa sanu poate, in vreun fel, sa strice eficienta sistemei sau al altor programe, dezvoltatorii proceselor au prevazut mecanizme de securitate.
Procesorul ofera 4 "inele de securitate" (niveluri de privelegii), se poate de folosit toate, dar asta este legat de complexitatea interactiunii prtogramelor cu difetite nivele de securitate. De aceia in majoritatea sistemelor se folosesc doua nivele.
0 - nivel privelegiat(nucleu) si
3 - neprivelegiat (aplicatii utilizator)
Cu aceste lucruri se asigura functionarea sistemei si independena programelor una fata de alta.
3.Nucleul
"Nucleul propriu zis" are functia de management a memoriei si al proceselor. Schimbarea proceselor - este principalul moment in functionarea normala a sistemei. Drivele nu trebuie sa "frineze", sau sa blocheze lucrul nucleului.
Driverele sunt programe speciale, care asigura lucrul componentelor hardware ale comp. In sistemele existente sunt prevazute mecanizme de intrerupere a lucrului driverelor dupa un anumit timp (depinde de cum este scris driverul). Se poate de scris drivere care pot bloca in intregime sistema. Pentru a nu admite astfel de situatii, driverele se programeaza minutios.
Apelurile de sistem - sunt interfata intre procese si nucleu. Nu exista alte metode de interactiune intre componentele hardware ale comp. Apeluri de sistem sunt destul de multe (Linux-190, FreeBSD - 350). multe din ele se suprapun(POSIX). Diferenta este in modul de transmitere al parametrilor.
4.Procesorul si memoria
In procesor sunt registrii de baza, care pot crea ofsetul. Pe arhitectura de 16biti, ofsetul maxxim este de 64 Kbyte (este putin). De asemenea in arhitecturi de 16biti existau si registtri de segment, care indicau adresa segmentului in memorie. In procesoarele incepnd cu i386, registrii de baza sunt de 32biti, ceia ce permite adresarea pna la 4 GB. Regisrtrii de segment au ramas de 16 biti, si mod protejat ei nu contin adrese, ei contin indexii descriptorilor. In regim real acesti registri lucreaza la fel ca si pe procesoarele de 16biti.
In regim real registrii de segment indica adresa de inceput al segmentului in memorie. Acest lucru ne permite sa adresam 1 MB de memorie. Dar se creaza probleme pentru securitate(este nevoie de multa). De exemplu. nu putem da posibilitatea aplicatiilor utilizator sa se adreseze direct la codul sau datele din kernel sqau din alte programe. Din aceasta cauza a fost inventat regimul protejat al procesorului (prima data la i286).
Securitatea acetui regim consta in:
- Registrul de segment nu indica la adresa in memorie. In acest registru acum se afla indexul in tabelul descriptorilor;
- Tabelul descriptorilor poate fi globala saiu locala, si reprezinta un masiv de inregistrari, de 8byte fiecare, unde se descriu adresele, limitele si dreptul de acces la segmente. Limita - se descrie marimea segmenteului. la adresarea peste limitele segmentului, procesorul genereaza execudere(intrerupere speciala al modului protejat). la fel exceptii se creaza si la incalacrtea dreptului de acces la segment. Cimpul dreptului de acces descrie posibilitatea de scriere/citire, posibilitatea de axecuta codul segmentului, nivelul de privelegii pentru acces la segment.
la adresare catre segment din descriptor seia adresa de baza si se aduna cu deplsamentul segmentului.In asa fel se primeste o adresa liniara de 32 biti (i286 - 24biti).
5.Paginarea memoriei
In procesoarele, incepind cu i836, a aparut, asa numita, organizarea paginata a memoriei. Pagina are marimea de 4 kilobyte sau 4 megabyte. pagini mari pot fi doar in procesoare >pentrium.
Daca posibilitatea dresarii paginate nu se foloseste, atunci dresa linirara, ca si la i286, este egakla cu cea fizica. Daca se foloseste - atunci adresa liniara se imprate in trei parti. Prima, cite 10 biti, este indexul in catalogul paginilor, la care se adreseaza registrul de sistem CR3. Inregistrarea in catalogul paginilor indica adresa tabelului paginii. A doua, cite 10biti, parte a adresei este indexul tabelulului paginei. Inregistrarea in tabelul paginilor indica adresa fizica a aflarii paginii in memorie. Ultimii 12 biti ai adresei indica deplasarea in acreasta pagina.
In inregistrarile paginilor, cit si in inregistrarile descriptorilor, sunt bitii de serviciu, care descriu dreptul de acces, si alte detalii ale paginii. Unul din aceste detalii este bitul axistentei paginii in memorie. In cazul care pagina lipseste, procesorul genereaza o exeptie, in care se poate de scris aceasta p[agina din fisier sau din swap.Acest lucru usureaza realizarea memoriei virtuale.
6.Multitasc
Posibilitatile multitask in procesoar au aparut incepind cu i286. Pentru realizarea acestui lucru, procesorul pentru fiecare sarcina foloseste asa zisul "segmentul de starea a sarcinii(TSS)". In acest segment, la schimbarea sarcinii, se pastreaza toti registrii de baza, segmentele si pointerii stivei pentru trei niveluri de securitate, segmentul adreselor al tabeleli locale al descriptorilor. In procesoarele, incepind cu i386, se mai pastreaza si adresa catalogului paginilior(registrul CR3). Acest segment mai asigura si alte mecanizme de securitate
7.Ce urmeaza
Nucleul sistemei in distribuirea memoriei opereaza cu pagini de 4 Kbyte. Paginile pot fi folosite de nucleu, pentru necesitatile driverelor (cash), sau pentru procese.
Programa sau procesul este compus din:
- Segment de cod. Se poate doar executa. Programa nu il poate citi sau rescrie. Folosirea segmentului swap, aici nu este necesar, pentru ca codul se citeste direct din fisier.
- Segjmentul de date este compus din trei parti:
1 - Date constante, ele se pot incarca din fisier,pentru ca nu se modifica in timpul rularii programei
2. - Date initializate
3. - Date neinitializate
- Segmentul stivei
De obicei, sistemel impart segmentul de date in doua parti: initializate si neinitializate.
Toate segmentele se impart in pagini. Segmentul de cod are marime constanta. Segmentul de date se poate mari in partea adreselor adreselor mai mari. Segmentul de stiva, pentru ca creste in jos, se mareste in partea micsorarii adreselor. paginile memoriei pentru datele suplimentare sau ale stivei se aloca de catre sistema conform necesitatii
la executatea programei SO:
- Pregateste pentru programa tabelul local al descriptorilor;
- Pregateste pentru programa catalogul paginilor, toate paginile sunt insemnate ca nefiind in memorie.
La transmiterea controlului acestei programe procesorul genereaza exceptie pentru lipsa paginii, in care pagina necesara se incarca din fisier, sau se initializeaza
Cind in sistema se incarca doua sau mai multe programe identice - nu este necesar ca pentru fiecare din ele sa se aloce spatiu pentru segmentul de cod, ele pot utiliza un singur cod pentru toti
8.Etapele de incarcare a diferitor SO
Procesul de incarcare incepe cu BIOS-ul
La start,procesorul se afla in regim real, prin urmare mai mult de un MByte de memorie nu poate adresa. Dar nici nu este necesar
BIOS verifica partea hardware, de unde poate initia incarcarea. Ordinea de verificare se poate seta.
Esenta incarcarii:
Pe hardware se gaseste boot sector-ul. BootSector se incarca in memorie la adresa 0:7c00. Comportarea ultrioara a BootSectorului depinde de sistema.
9.Incarcare Linux
Pentru Linux sunt specifica doua moduri de incarcare
- Prin boot sector-ul nucleului
- Prin boot manager LILO (Linux Loader)
Procesul de incarcare prin nucleu se folosetse de obicei pe Floppy si se petrece in urmatoarea ordine:
1. boot sectorul rescrie codul sau la adresa 9000h:0
2. Incarca de pe disc Setup-ul, care este srcis pe citeva sectoare urmatoare, pe adresa 9000h:0200h;
3. Se incarca nucleul pe adresa 1000h:0. Nucleul de asmenea urmareste in urmatoarele sectoare Setup-ul. Nucleul nu poate fi mai mare de 508 KByte (dar des el se arhiveaza)
4. Se porneste Setup-ul
5. Se verifica Setupul
6. Se verifica partea hardware prin mijloacele BIOS. Se determina marimea memoriei, se initiaza claviatura si sisteme video, daca sunt hard-uri, magistrala MCA(micro chanel bus), PC/2 mouse, APM BIOS
7. Se trece in regim protejat
8. Controlul se transmite la adresa 1000h:0 la nucleu
9. Daca nucleul este arhivat, se dezarhiveaza, daca nu , se rescrie la adresa 100000h (dupa limita primului MB)
10. Controlul se transmite la aceasta adresa
11. Se activieaza adresarea paginata
12. Se initiaza idt si gdt, in segmentul de cod si in segmentul de date al nucleului intra toata memoria virtuala
13. Se initiaza driverele
14. Controlul se transmite procesului init
15. init porneste toate celellate programe coorespunzatoare cu fisierul configuratiei
Incarcarea prin LILO
1. boot sectorul LILO rescrie codul sau la adresa 9a00h:0
2.Pina la adresa 9b00:h se pozitioneaza stiva
3.Se incarca al doilea incarcator la adresa 9b00:0 si-i transmite controlul
4. Al doilea incarcator icarca boot sectorul la adresa 9000h:0
5. incarca Setup la adresa 9000h:0200h
6. incarca nucleul la adresa 1000h:0
7. Contrlul se transmite programei Setup.
Incarcare FreeBSD
1. bootSector-ul incarca al doilea incarcator
2. Al doilea incarcator trece sistema in mod protejat si porneste loader-ul
3.Loader-ul ofera utilizatorului posibilitatea de a alege modulele necesare sau sa porneasca alt nucleu
4. Controlul se transmite nucleului si incepe initializarea driverelor
Incarcare DOS
boot sectorul DOS incarca in memorie doua fisiereL io.sys si msdos.sys. Denumirea acestor fisiere se deosebeste in diferite versiuni de DOS. Fisierul io.sys contine functii de intrerupere int 21h, fisierul msdos.sys prelucreaza config.sys, si porneste interpretorul de comenzi command.com,care la rindul sau prelucreaza fisierul de comanda autoexec.bat
Incarcare windows 9x
Deosebirea fata de DOS este in faptul ca, msdos.sys incorporeaza io.sys, iar msdos.sys a ramas doar pentru compatibilitate ca si fisier de configurare. Dupa ce interpretorul de comenzi command.com prelucreaza autoexec.bat se apeleaza programa win.com, care trece sistema in mod protejat, si porneste alte programe, care asigura lucrul sistemei
Incarcare Windows NT
Boot sector-ul NT depinde de formatul FS, pentru FAT se instaleaza unul, pentru NTFS -altul, in el se afla codul de citire FS, fara prelucrarea subcataloagelor
1.boot sectorul incarca NTLDR din directoriul radacina, care se porneste in mod real
2.NTLDR trece sistema in mod protejat
3. Se creaza tabelele necesare pentru pagini pentru a accesa primul MB de memorie
4.Se activeaza mecanizmul transformarii paginate
5. NTLDR citeste boot.ini, pentru asta el foloseste codul FS incorporat read only. Poate citi si subdirectoare
6. Se afiseaza meniul de selectare a modului de incarcare
7. Dupa selectare, sau la timeout, NTLDR din fisierulboot.ini determina aflartea directoriuklui de sistem Windows
8. Daca in boot.ini este indicat incarcarea DOS(sau Win9x), atunci fisierul bootsect.dos se incarca in memorie si se produce un restart fierbinte
9. Se prelucreaza boot.ini
10. Se incarca ntdetect.com, care afiseaza mesaj desp[redetectarea diferitor componente
11. NTLDR afiseaza "OSLOADER V4.0"
12. Din directorul winnt\system32 se incarca ntoskrnl.exe, care contine nucleul si subsiteme de xecutare, si fisierul hall.dll,
13. NTLDR ofera posibilitatea de a alege ultimele configuratii reusite
14. Se incarca toate driverele si alte fisiere
15.La terminare porneste functia main din ntoskrnl.exe si termina lucrul
10.Creare bootsector
Boot sectorul se incarca in memorie la adresa 0:7c00h si are lungimea de 512 byte. Aceasta nu este foarte mult, de acea posibilitatile boot sectorului sunt limitate la incarcarea unui al doilea incarcator.
Boot sectorul nostru , ca si linux, va incarca n memorie doua blocuri de memorie. Primul este acel al doilea incarcator, care se numeste setup. Al doilea este insasi nucleul. Acest boot sector serveste pentru incarcarea nucleului de pe discheta, si de aceia este strins legat de discul "a".
BIOS ofera posibilitatea de a citi citeva sectoare o data, dar nu mai mult de limita trackului. Asa posibilitate, mareste viteza de citire de pe disc, dar reprezinta dificultati mari in programare, pentru ca trebnuie de luat in considerare limitelele segmentelor si limitele trackurior
Noi vom citi pe sectoare.
%define SETUP_SEG 0x07e0
%define SETUP_SECTS 10
%define KERNEL_SEG 0x1000
%define KERNEL_SECTS 1000
Pentru inceput descriem locul si marimea fiecarui blod de incarcare
marimile deocamdfata sunt arbiotrare, pentru ca restul inca trebuie de scris:
section .text
BITS 16
org 0x7c00
Boot sectorul se incarca si se porneste de la adresa 0:7c00h. Continutul registrilor la start este astgel
* cs contine 0
* ip contine7c00h
Intreruperile sunt interzise!
entry_point:
mov ax,cs
cli
mov ss,ax
mov sp,entry_point
sti
mov ds, ax
Stiva se afla inaintea programei, pina la domeniul de serviciul BIOS mai sunt aprx. 30 KByte. Se permite intreruperile. Se initializeaza registrul de segment ds cu 0
;salvare forma cursor
mov ah,3
xor bh, bh
int 0x10h
push cx
;intreruper cursor
mov ah,1
mov ch,0x20
int 10h
Pentru a fi totul frmos, in timpul citirii se intrrupe curosul. De altfel el va lumnina pe ecran. Ca sa-l reintoarcem, cum a fost, pastra foerma lui ion stiva
;incarcam setup-ul
mov ax, SETUP_SEG
mov es,ax
mov ax,1
mov cx,SETUP_SECTS
mov si,load_setup_msg
call load_block
call utstring
mov si, complete_msg
call outstring
Incarcam primul block (setup).
;incarcam nucleul
mov ax,KERNEL_SEG
mov es,ax
mov ax, 1+SETUP_SECTS
mov cx,KERNEL_SECTS
mov si,load_kernel_msg
call load_block
call outstring
mov si,complete_msg
call outstring
Incarcam al doilea block(kernel)
;restaurare cursor
pop cx
mov ah,1
int 0x10h
restaurare forma cursor
;transmite control la setup
jmp SETUP_SEG:0
lucrul boot sectorului sa incheiat. Se transmite control programei setup
Urmeaza functiile
;Incarcare bloc
;cx - numarul de sectoare
;ax - sectorul de inceput
;es - pointer la memorie
;si - loading message
Functia de incarcare al blocului. Ea afiseaza la ecran contor de procent
load_block:
mov di,cx ; salvare numar de blocuri
.loading:
xor bx,bx
call load_sector
inc ax
mov bx, es
add bx, 0x20
;afisare mesaj de spre incarcare
call outstring
push ax
;afisare procente
;((di - cx) / di) * 100
mov ax, di
sub ax,cx
mov bx,100
mul bx
div di
call outdec
push si
mov si, percent_msg
call outstring
pop si
pop ax
loop .loading
ret
Functia urmatoare incarca de pe disc un sector, operind cu adresa limniara. Sunt asa zisele int13 extensii, create de MicroSoft si Intel. Aceasta este o extensie BIOS lucreaza in mod analogic, contorizind sectoarele conform adresei liniare, dar nu este sustinuta de toate BIOS.
in lucrarea noastra ne orientam la citirea de pe floppy, cu marime de 1,4 MB. De aceia vom folosi o functie mai veche, care in calitate de parametri se dau numarul trackului, al capului si al sectorului
[/code]
;incarcare sector
;ax - numarul sectorului (0...max(2880))
;es:bx - adresa pentru deplsare al sectorului
[/code]
Numarul sectorului se calculeaza dupa formula: AbsSectNo = (CylNo * SectPerTrack * Heads) + (HeadNo * sectPerTrack) + (SectNo - 1) Inseamna ca este adevarat si : Cylno = AbsSectNo / (SectPerTrack * Heads), Headno = restul / SectorPerTrackSectNo = restul + 1
load_sector: push ax push cx cwd mov cs, 18; SectPerTrack div cx mov cx, dx inc cx; numarul de sectoare
Impartind numarul de sectorului la numarul sectoarelor pe track, in rest obtinem numarul sectorului pe track. Aceasta valoare se pastreaza in 6biti inferiori ai registrului cl
xor dx,dx ; dl - disc - 0!
numarul discului se pastreaza in dl si se initializeaza cu 0 (discul a)
shr ax,1
rcl dh, 1 ;numarul capului
bitul inferior al citului determina numarul capului (0 sau 1)
mov ch,al
shl ah,4
or cl,ah ;numarul de trackuri
Bitii ramasi din cit determina numarul cilindrului(trackurlui). opt biti inferiori se pastreaza in registrul ch, doi biti superiori ai numarului se pastreaza in doi biti superiori ai registrului cl
.rept:
mov ax, 0x201
int 0x13
jnc .read_ok
push si
mov si,read_error
call outstring
movzx ax, ah
call outdec
mov si, crlf
call outstring
xor dl,dl
xor ah,ah
int 0x13
pop si
jmp short. rept
In caz de eroare la citire nu vom returna din functie niciun rezultat, dar se va repeta citirea, pina nu va deveni adevarata
.read_ok:
pop cx
pop ax
ret
In continuare sunt doua functii interfete, care asigura afisarea la ecran a sirurilor si acifrelor zecimale. Pentru afisare se foloseste intreruperea teletype (ah = 0eh, int 10h), care asigura afisarea unui simbol cu prelucrarea citorva coduri
;afisare sir
;ds:si - sir
outstring:
push ax
push si
mov ah, 0eh
jmp short .out
.loop:
int 10h
.out
lodsb
or al,al
jnz .loop
pop si
pop ax
ret
Aceasta functie este limitata la afisarea cifrelor pina la 99, in caz de depasire se se afiseaza ca '##'
; afisare cifre zecimale de la 0 la 99
; ax - numar
outdec:
push ax
push si
mov bl,10
div bl
cmp al,10
jnc .overflow
add ax, '00'
push ax
mov ah, 0eh
int 0x10
pop ax
mov al, ah
mov ah, 0eh
int 0x10
jmp short .exit
.verflow:
mov si, overflow_msg
call outstring
.exit:
pop si
pop ax
ret
Urmeaza citeva mesaje de serviciu
load_setup_msg:
db 'Setup loading:', 0
load_kernel_msg:
db 'Kernel loading:', 0
complete_msg:
db 'complete', 0
crlf:
db 0ah,0dh, 0
percent_msg:
db '%:', 0dh,0
overflow_msg:
db '##', 0
read_error:
db 0ah, 0dh
db 'Read error #', 0
TIMES 510-($-$$) db 0
aceasta combinatie umple restul spatiului din sector cu zerouri, Si mai ramin aprx 200 byte
dw 0aa55h
Ultimii doi byte se numesc "Partition table signature", dar nu este chiar corect, De fapt aceasta signatura spune BIOS-ului, ca acest sector este incarcator
acest boot sector, in afara de faptul ca, citeste pe sectoare, se deosebeste de cel de la linix prin localizarea in memorie. Dupa incarcare el nu se muta in memorie, dar lucreaza pe aceiasi adresa, pe care la incarcat BIOS-ul. La fel setup se incarca imediat dupa boot sectorul cu adresa 7e00h, ceia ce in principiu nu incurca sa lucreze cu al;te adrese, daca incarca nucleul prin LILO
11.Principiile regimului protejat
Istoria organizarii memoriei
Primele modele de la Intel aveau 16 biti de date si 20 de adrese. Aceasta ducea la limitarea la adresarea memoriei, un registru pe 16biti nu putea fi folosit la adresarea a mai mult de 64 KByte de memorie. pentru a inlatura aceatsa limitare specialistii au prevazut registri de segment. Un registru de segment pastreaza 16 bti superiori de adrese si pentru a primi adresa completa la segmentul de adrese se adauga deplasamentul in segment.
In asa fel, a devenit posibil de adresat pina la 1 MB de memorie. Aceasta a permis crearea programelor mai putin legate de memorie si a simplificat adresarea. Segmentele se pot incepe cu orice adresa, divizibila la 16, acestste 16 blocuri de memorie sunt denumnite paragrafe. dar acest lucru creaza si incomoditati. Una din ele este ca, la o adresa de memorie indica 4096 combinatii segment/deplasare. alta incomoditate este ca nu se poate de limitat accesul prgramelor la one de memorie. Introducerea regimului protejat a rezolvat aceste probleme, dar pentru compatibilitate cu procesoarele moderne procesoarele pot lucra in ambele mduri
12. Securitate
Pentru asigurarea lucrului SO si aplicatiilor, dezvoltatorii au prevazut in ele mecanizeme de securitate. In procesoarele Intel sunt 4 nivele de privelegii pentru programe si date. Nivelul sero se considera cel mai privelegiat, al treile cel mai putin
La fel in regim protejat alcreaza altfel mecanizmele de transformare a adreselor. In registrul de segment acum se pastreaza nu bitii superiori ai adreselor, dar selectorul. Selectorul reprezinta indexul in tabelul descriptorilor. In afara de asta el mai contine citiva biti de serviciu
13.Regimul virtual al procesoarelor 8086
Pentru posibilitatea pronirii din regim protejat, exista asa numit "regim virtual".Dar lucreaza si mecanizmele de transformare a adreselor in regim protejat. La fel si sistemele multitask,care pot concomitent indeplini sarcinile protejate cit si virtuale. Adresarea in sarcini virtuale se face prin segmen/deplasament
Adresarea la intreruperi se face prin IDT, dar tabelul intreruperilor regimului real poate fi prelucrata de functii care sunt in IDT
Adresarea sarcinii virtuale la proturi poate fi facute prin intreruperi al regimului protejat. La adresarea catre porturile interzise se produce o excludere.
14. SO VARIANTA 2
Initial trebuie de scris sectorul de incarcare pentru mini - SO, pe care il vom crea. Deoarece procesorul se incarca in regim de 16 biti, pentru crearea sectorului de incarcare se vor folosi asemblerul si link-editorul din pachetul bin86.