Scrierea propriul sistem de operare №1

1) Vectorul de întrerupere sunt după cum urmează (acest lucru avem nevoie atunci când facem o masă capcană):

IRQ INT cauza
8h IRQ0 Sistem temporizator






9h IRQ1 Tastatură
controler Slave IRQ2 10h
IRQ3 11h Port COM2, modemul
IRQ4 12h Port COM1, mouse-ul
IRQ5 13h Port LPT2
IRQ6 14h unitate
IRQ7 15h Port LPT1, imprimantă
70h IRQ8 ceas de timp real
71h IRQ9 întrerupere obturare
IRQ10 72h Pentru dispozitive suplimentare
IRQ11 73h Pentru dispozitive suplimentare
IRQ12 74h PS mouse
IRQ13 75h coprocessor Eroare la matematică
IRQ14 76H origine IDE-controler
IRQ15 77H doua IDE-controler, un hard disk

2) BIOS. Acest lucru este, în general, o digresiune, deoarece Aici considerăm nu atât de mult dispozitivul BIOS-ului ca să învețe cum să adăugați-l să funcționeze. Folosind cele, desigur, face sistemul de operare nostru, intolerabil, dar ele pot fi foarte utile pentru etapa inițială. În scrierea sistemului de operare nu voi menționa, este cititorul întrebător ca un exercițiu. =)

Deci, BIOS-ul (voi vorbi despre PREMIUL BIOS, deoarece este cea mai populară versiune, deci poate discrepanțe minore cu alte
BIOS) - o secvență de fișiere ambalate care se termină cu bootblock fișierul. Structura primului megabyte de memorie este alocată pentru BIOS:

original.tmp si bytes pentru CRC

Până la spațiul este partea principală a BIOS-ului, și anume:

original.tmp - partea principală, care se află de rutină BIOS Setup, precum și piese necesare pentru inițializare.
CRC - control BIOS
awardext.rom - O configurație de rutină a calculatorului
awardepa.bin - imagine
De asemenea, puteți întâlni alte module opționale.

Deci, atunci când computerul este pornit bootblock inițializează registrele de chipset-uri, despacheta arhivate (folosind LHA), module și le trimite în memorie.
Prin urmare, fișierele de date pot fi reprogramat prin schimbarea sau adăugarea de ceva în BIOS. Astfel, puteți modifica toate setările BIOS-ului (de la inscripții și se termină cu adaos de posibilitatea de a lucra cu noile dispozitive, informații care nu sunt în această versiune
BIOS). Acest lucru se face destul de usor, de exemplu, folosind modbin (program standard de atribuire), puteți extrage fișierele de date
(Să luăm, de exemplu, de pe Internet) pentru a le schimba pe cont propriu și de a scrie în
BIOS. Numai atunci când modulele arhivate nu uitați să stabilească CRC, în caz contrar BIOS-ul va crede că el este distrus.







Deci, ce ai nevoie pentru un BIOS mai gravă decât o modificare minoră a codurilor existente. În primul rând permiteți-mi să vă reamintesc
vă că există multe companii producătoare de plăci de bază, precum și procesoare și un standard unic pentru chipset-ul nu exista, asa ca a scrie un BIOS generic pe toate placile de baza nu este posibil, trebuie să scrie pentru fiecare placa de baza funcțiilor lor și să le combine într-un singur BIOS. Dar acest lucru necesită o mulțime de om-ore, astfel încât să facă față acestei sarcini este destul de dificil, sau pur și simplu imposibil.

Deci, programul nostru va fi amplasat într-un ROM (memorie numai pentru citire). BIOS-ul va transfera controlul la ea, dar pentru aceasta el trebuie să o găsească. Prin urmare, programul nostru ar trebui să fie în regiune cu S800: 0 până la E000: 0 în memorie, deoarece această zonă este scanat pentru prezența anumitor semnături BIOS 0AA55H. În acest octet semnătură pentru octet conta pentru calcularea sumei de control. În cazul în care suma de control este zero, atunci acest ROM, și controlul este transferat în zona de memorie în cazul în care această semnătură, cu un offset a fost găsit 3. Pentru a „egaliza“ suma de control, este necesar, la sfârșitul programului pentru a adăuga un octet, care este numărul egal cu 100H diferența și suma de control a primit.

Deci, asta e, programul ar trebui să arate, scrieți în ROM.

Booting Linux și Windows

Pentru a înțelege mai precis dispozitivul de încărcare a sistemului de operare, înainte de a începe să ia în considerare principiile testelor inițiale ale cele mai populare descărcare în timpul nostru sistem de operare: Linux și
Windows.

Linux poate porni printr-un bootloader specializat (Lilo), cât și prin sectorul de boot al discului. Hamal avem, dar există doar dorința de a afla mai multe pe deplin despre dispozitivul de pornire, ia în considerare al doilea caz:

Acum ia în considerare descărcarea pentru Windows (NT, deoarece versiunile anterioare perimate):

Mai aproape de practica

Deci, ne-am uitat la exemplele de download-uri gata făcute OS etape, precum și un dispozitiv de memorie. Mai departe direct la scrierea de sistem de operare. Vom începe prin scrierea dispozitivul de încărcare, care ar trebui să ofere o încărcare și să se pregătească totul pentru începerea sistemului de operare. Acesta va fi împărțit în două (diviziune cod). Prima sarcină de a pregăti terenul, ci mai degrabă a pus în memorie codul de pe o dischetă, și apoi se transferă controlul la al doilea încărcător, a cărui sarcină este de a traduce procesorul în modul protejat și de a face alte preparate pentru transferul de control are de fapt de bază.

1) bootloader primar

tabel: db «0123456789ABCDEF»
PE:
// cod ASCII transforma în reprezentarea hexazecimală și afișare
Pusha
xor bx, bx
mov bl, ah
și bl, 11110000b
SHR bl, 4
mov al, [masă + bx]
PC apel
mov bl, ah
și bl, 00001111b
mov al, [masă + bx]
PC apel
Popa
putrezi
// De la ieșire caracter AL la ecran
PC:
Pusha
mov ah, 0x0E
int 0x10
Popa
putrezi
// string SI afișare a
ps:
Pusha
.buclă:
lodsb
testa al, al
JZ .quit
mov ah, 0x0E
int 0x10
JMP scurt .loop
.renunțe la:
Popa
putrezi
// Mesajele de serviciu
msg_startup: db «OS loading ...», 0x0A, 0x0D, 0
msg_cyl: db «Cilindrul:», 0
msg_head: db «cap:», 0
msg_er: db «Eroare! Codul de ea: », 0
msg_end: db «Erori în timp ce citesc», 0x0A, 0x0D, «Repornește calculatorul, vă rugăm să», 0
msg_crlf: db 0x0A, 0x0D, 0

// butsektora Semnătura:
ORI 510 - ($ - $$) 0 dB
db 0xAA, 0x55

2) Încărcător secundar

Și acum, un încărcător de boot secundar:

Atât încărcătorul gata. Rămâne doar să le compilați și trimite-l la o bootsector dischetă. Pentru simetrie cu prima parte am terminat, în partea următoare vom scrie kernel.

Arată acest articol unui prieten: