Kuinka kirjoittaa käyttöjärjestelmä tyhjästä. Rakennamme oman käyttöjärjestelmän Linuxin pohjalta

Kysymykseen Kuinka luoda oma käyttöjärjestelmä? kirjoittajan antama kysymys paras vastaus on Ajatus on kiitettävä.
Ensinnäkin sinun on tiedettävä sen koneen komentojärjestelmä, jolle aiot kirjoittaa käyttöjärjestelmän.
Komentojärjestelmä näkyy suoraan assembly-kielessä.
Siksi sinun on ensin keksittävä oma kokoonpanokielesi ja kirjoitettava sille ohjelma (assembler), joka kääntää aakkosnumeeriset symbolit konekielelle
koodi.
Jos olet kiinnostunut, voit nähdä, mitä vaatimuksia uudella (ihanteellisella) käyttöjärjestelmällä pitäisi olla.
Joitakin tällaisia ​​ominaisuuksia on lueteltu tässä:
.ru/D_OS/OS-PolyM.html#IdealOS
On tarpeen tutkia materiaalejaa. Esimerkiksi Intel ja AMD.
Saatat olla hyödyllinen videoluentokurssi OS:stä, joka on esitelty täällä:
.ru/D_OS/OS_General.html
PS: Älä kuuntele pessimistejä. Pohjautuu kanaa jahtaavan kukon ideologiaan:
"En tule kiinni, ainakin lämmitän."
Lähde: Verkkosivusto "Käytä tietokonettasi oikein!"

Vastaus osoitteesta I-palkki[aloittelija]
Tietenkin) Täällä istuu vain portit) Kysy Microsoftilta)



Vastaus osoitteesta Laite[aloittelija]
ota kaikki käyttöjärjestelmät ja pakata ne yhteen


Vastaus osoitteesta Aleksanteri Tuntsov[guru]
Tutustu Linux-käyttöjärjestelmään, opettele ohjelmointi ja mene


Vastaus osoitteesta ~Liikeissä~[guru]
Opi ohjelmointi korkeimmalla tasolla, kerää koko joukko samoja tietokoneneroja, ja sitten voit tehdä sen.


Vastaus osoitteesta Rasul Magomedov[guru]
Aloita luomalla hauska taustakuva


Vastaus osoitteesta Kapteeni Google[guru]
Älä kuuntele "10 vuotta oppiaksesi perusasiat"; Torvalds kirjoitti ensimmäisen Linux-version 22-vuotiaana, ja hän sai tietokoneen 12-vuotiaana. Kuten ymmärrät, hän ei opiskellut vain perusteita.
Aloita tutkimalla, mitä on jo olemassa - toisaalta Tannenbaumin "Modern Operating Systems", toisaalta rakentaa Linux From Scratch, kolmanneksi opi Assembly, C, C++. Kaikki kaikesta voidaan tehdä 3-4 vuodessa. Sen jälkeen voit aloittaa järjestelmän kehittämisen... jos vielä haluat.


Vastaus osoitteesta Joanya Semenov[guru]
Tiedätkö mitä Gates teki? kokeile samaa, he sanovat, että se osoittautuu kannattavaksi..
kun hänen vanhempansa rankaisivat häntä, hän, jolla ei ollut parempaa tekemistä, alkoi hypätä näppäimistöllä ja myi sen sitten kutsuen saamaansa "ikkunat"
ps ja jos se on totta, kirjoita ensin "Hello World" C++:lla ja ymmärrät heti, että idea on vainoharhainen


Vastaus osoitteesta Kostafey[guru]
Mitä varten? Mikä pohjimmiltaan on tyytymätön olemassa oleviin? Eikö todellakaan ole sellaista, joka täytä ainakin osittain käyttöjärjestelmän vaatimuksiasi? Ehkä on parempi liittyä kehitystiimiin? Siinä on 100500 kertaa enemmän järkeä.
Ja sitten hylkäät tämän idean vielä 0.(0)1 % sen toteuttamisesta.


Vastaus osoitteesta Jevgeni Lomega[guru]
E. Tanenbaum "Käyttöjärjestelmät: kehitys ja toteutus"
Onnea
PS Valitettavasti et todennäköisesti menesty kuten Bill Gates. Hänen äitinsä on siisti pankkiiri, onko sinun?


Vastaus osoitteesta Krabin kuori[guru]
Voit kirjoittaa yksinkertaisen käyttöjärjestelmän itse, mutta se ei koskaan pysty kilpailemaan Windowsin, MAC OS:n tai Linuxin kaltaisten käyttöjärjestelmien kanssa, joiden parissa sadat tai tuhannet ohjelmoijat ovat työskennelleet vähintään kymmenen vuoden ajan. Lisäksi käyttöjärjestelmä on vain perusta. On välttämätöntä, että laitekehittäjät kirjoittavat omat ajurinsa tälle käyttöjärjestelmälle, sovellusohjelmakehittäjät kirjoittavat siihen editoreja, soittimia, selaimia, pelejä, paholainen laastissa... Ja ilman tätä käyttöjärjestelmä jää hyödyttömäksi pohjaksi talolle jota kukaan ei rakenna.


Vastaus osoitteesta Vadim Stakhanov[aktiivinen]
Olisi parempi, jos menisin opiskelemaan filologiksi. Ja sitten hän huusi "Ilmainen kassa!"


Vastaus osoitteesta =Serge=[guru]
Hurraa! Lopuksi sivuston kysymys 58 "oman" käyttöjärjestelmän luomisesta))
Tässä on kysymyksiä "oman käyttöjärjestelmän kirjoittamisesta" - niitä on vain 34))
Lue...92 kysymystä*10 vastausta = noin 920 vastausta))
Samalla ymmärrät todennäköisesti mitä "ei tylsä ​​taustakuva" tarkoittaa).


Vastaus osoitteesta Uusintamaton[guru]
toinen Denis Popov toisen BolgenOS:n kanssa?


Vastaus osoitteesta Ivan Tatarchuk[aloittelija]
käynnistä Notepad, lataa toadscript-kääntäjä ja aloita hyppääminen näppäimistöllä
koota 60 minuutissa ja se on siinä
osasi on valmis

Kirja "The Operating System from 0 to 1" on julkaistu GitHubissa, ja siinä on yli 2000 tähteä ja 100 haarukkaa. Kuten otsikko kertoo, sen lukemisen jälkeen voit luoda oman käyttöjärjestelmän - ja ehkä muutama asia ohjelmoijien maailmassa voisi olla siistimpää.

Tämän kirjan avulla opit seuraavat asiat:

  • Opit luomaan käyttöjärjestelmän laitteiston teknisen dokumentaation perusteella. Näin se toimii todellisessa maailmassa, et voi käyttää Googlea nopeisiin kysymyksiin.
  • Ymmärrät kuinka tietokoneen komponentit ovat vuorovaikutuksessa toistensa kanssa ohjelmistosta laitteistoon.
  • Opi kirjoittamaan koodi itse. Koodin sokea kopioiminen ei ole oppimista, vaan itse asiassa opit ratkaisemaan ongelmia. Muuten, sokea kopiointi on myös vaarallista.
  • Hallitse tutut työkalut matalan tason kehittämiseen.
  • Tutustu assembly-kieleen.
  • Selvitä, mistä ohjelmista on tehty ja miten käyttöjärjestelmä ajaa niitä. Annoimme aiheesta lyhyen yleiskatsauksen uteliaille vuonna .
  • Saat selville, kuinka voit korjata ohjelman virheenkorjauksen suoraan laitteistolla GDB:n ja QEMU:n avulla.
  • C-ohjelmointikieli Voit hallita sen nopeasti seuraamalla.
  • Linuxin perustiedot. Opiskele vain verkkosivuillamme.
  • Fysiikan perustiedot: atomit, elektronit, protonit, neutronit, jännite.
  • Ohmin laki jännitteen, virran ja vastuksen välisestä suhteesta.

Kirjaa parannetaan ja muokataan lähes päivittäin: voit itse tehdä muutoksia tai korjata kirjoitusvirheen. Käyttöjärjestelmä, jonka kehitys toimi tämän kirjan "juonena",

Alkuperäinen: "Roll your your toy UNIX-clone OS"
Kirjailija: James Molloy
Julkaisupäivä: 2008
Käännös: N. Romodanov
Käännöspäivä: tammikuu 2012

Nämä opetusohjelmat on suunniteltu näyttämään sinulle yksityiskohtaisesti, kuinka yksinkertainen UNIX-tyyppinen käyttöjärjestelmä ohjelmoidaan x86-arkkitehtuurille. Näissä opetusohjelmissa ohjelmointikieli on valittu C, jota täydennetään tarvittaessa assembly-kielellä. Opetusohjelmien tarkoituksena on kertoa luomamme käyttöjärjestelmän luomisessa käytettävien ratkaisujen suunnittelusta ja toteutuksesta, joka on rakenteeltaan monoliittinen (ajurit ladataan ydinmoduulitilassa, ei käyttäjätilassa, kuten ohjelmat), koska tällainen ratkaisu on yksinkertaisempi.

Tämä opassarja on luonteeltaan erittäin käytännöllinen. Jokainen osa sisältää teoreettista tietoa, mutta suurin osa käsikirjasta käsittelee käsiteltyjen abstraktien ideoiden ja mekanismien toteuttamista käytännössä. On tärkeää huomata, että ydin on toteutettu koulutusytimenä. Tiedän, että käytetyt algoritmit eivät ole tilatehokkaimpia eivätkä optimaalisia. Ne valittiin yleensä niiden yksinkertaisuuden ja helppouden vuoksi. Tämän tarkoituksena on antaa sinulle oikea ajattelutapa ja perusta työskentelyyn. Tämä ydin on laajennettavissa ja voit helposti yhdistää parhaat algoritmit. Jos sinulla on ongelmia teorian suhteen, on monia sivustoja, jotka voivat auttaa sinua selvittämään sen. Suurin osa OSDev-foorumilla käsitellyistä kysymyksistä liittyy toteutukseen ("My gets-funktio ei toimi! apua!") ja monille teoriakysymys on kuin raitista ilmaa. Linkit löytyvät tämän lopusta. esittely.

Alustava valmistelu

Kääntääksesi ja suorittaaksesi esimerkkikoodin oletan, että tarvitset vain GCC, ld, NASM ja GNU Make. NASM on avoimen lähdekoodin x86-asentaja, ja se on monien x86-käyttöjärjestelmän kehittäjien valinta.

Ei kuitenkaan ole mitään järkeä yksinkertaisesti koota ja ajaa esimerkkejä, jos et ymmärrä niitä. Sinun on ymmärrettävä, mitä koodataan, ja tehdäksesi sen sinun on osattava C-kieli erittäin hyvin, varsinkin kun on kyse osoittimista. Sinun tulisi myös ymmärtää joitakin kokoonpanokieliä (näissä opetusohjelmissa käytetään Intelin syntaksia), mukaan lukien se, mihin EBP-rekisteriä käytetään.

Resurssit

Resursseja on monia, jos tiedät miten niitä etsitään. Erityisesti seuraavat linkit ovat hyödyllisiä:

  • RTFM! Intelin käyttöohjeet ovat jumalan lahja.
  • Sivuston osdev.org Wiki-sivut ja foorumi.
  • Osdever.net-sivustolla on monia hyviä opetusohjelmia ja artikkeleita ja erityisesti Branin ytimen kehitystutoriaaleja, joiden aiempaan koodiin tämä opetusohjelma perustuu, käytin itse näitä opetusohjelmia aloittaakseni, ja niissä oleva koodi oli niin hyvä, että tein ei muuta sitä moneen vuoteen.
  • Jos et ole aloittelija, voit saada vastauksia moniin kysymyksiin ryhmässä

Tämä artikkelisarja on omistettu matalan tason ohjelmointiin, eli tietokonearkkitehtuuriin, käyttöjärjestelmien suunnitteluun, kokoonpanokieliohjelmointiin ja niihin liittyviin alueisiin. Toistaiseksi kaksi habrauseria kirjoittaa - iley ja pehat. Monille lukiolaisille, opiskelijoille ja jopa ammattiohjelmoijille nämä aiheet osoittautuvat erittäin vaikeiksi oppia. Matalan tason ohjelmointiin on omistettu paljon kirjallisuutta ja kursseja, mutta täydellisen ja kaiken kattavan kuvan saaminen on vaikeaa. On vaikeaa luettuaan yhden tai kaksi assembly-kieltä ja käyttöjärjestelmiä käsittelevää kirjaa, ainakin yleisellä tasolla kuvitella, kuinka tämä monimutkainen raudasta, piistä ja monista ohjelmista koostuva järjestelmä - tietokone - todella toimii.

Jokainen ratkaisee oppimisongelman omalla tavallaan. Jotkut ihmiset lukevat paljon kirjallisuutta, jotkut yrittävät siirtyä nopeasti harjoittelemaan ja ottamaan selvää siitä, kun he menevät, toiset yrittävät selittää ystävilleen kaiken, mitä he opiskelevat. Ja päätimme yhdistää nämä lähestymistavat. Joten tässä artikkelien kurssissa osoitamme askel askeleelta kuinka kirjoittaa yksinkertainen käyttöjärjestelmä. Artikkelit tulevat olemaan katsausluonteisia, eli ne eivät sisällä tyhjentävää teoreettista tietoa, vaan pyrimme aina tarjoamaan linkkejä hyviin teoreettisiin aineistoihin ja vastaamaan kaikkiin esille tuleviin kysymyksiin. Meillä ei ole selkeää suunnitelmaa, joten monia tärkeitä päätöksiä tehdään matkan varrella palautteesi huomioiden.

Saatamme tietoisesti estää kehitysprosessin, jotta sinä ja me voimme täysin ymmärtää huonon päätöksen seuraukset ja hioa siihen liittyviä teknisiä taitoja. Joten sinun ei pitäisi nähdä päätöksiämme ainoina oikeina ja uskoa meihin sokeasti. Korostetaan vielä kerran, että odotamme lukijoiden olevan aktiivisia artikkeleista keskustelemassa, minkä pitäisi vaikuttaa suuresti seuraavien artikkeleiden kehittämis- ja kirjoitusprosessiin. Ihannetapauksessa haluaisin ajan myötä joidenkin lukijoiden osallistuvan järjestelmän kehittämiseen.

Oletetaan, että lukija tuntee jo assembly- ja C-kielten perusteet sekä tietokonearkkitehtuurin peruskäsitteet. Eli emme selitä mitä rekisteri tai esimerkiksi RAM on. Jos sinulla ei ole tarpeeksi tietoa, voit aina kääntyä lisäkirjallisuuden puoleen. Lyhyt luettelo viitteistä ja linkkejä sivustoille, joilla on hyviä artikkeleita, on artikkelin lopussa. On myös suositeltavaa osata käyttää Linuxia, koska kaikki käännösohjeet annetaan erityisesti tätä järjestelmää varten.

Ja nyt - lähempänä asiaa. Artikkelin loppuosassa kirjoitamme klassisen "Hello World" -ohjelman. Helloworld on hieman täsmällinen. Sitä ei käynnistetä mistään käyttöjärjestelmästä, vaan suoraan niin sanotusti "paljaalle metallille". Ennen kuin aloitamme koodin kirjoittamisen, selvitetään tarkasti, kuinka yritämme tehdä tämän. Ja tätä varten meidän on harkittava tietokoneen käynnistysprosessia.

Joten ota suosikkitietokoneesi ja paina järjestelmäyksikön suurinta painiketta. Näemme iloisen näytönsäästäjän, järjestelmäyksikkö piippaa iloisesti kaiuttimellaan ja jonkin ajan kuluttua käyttöjärjestelmä latautuu. Kuten ymmärrät, käyttöjärjestelmä on tallennettu kiintolevylle, ja tässä herää kysymys: kuinka käyttöjärjestelmä latautui maagisesti RAM-muistiin ja aloitti suorittamisen?

Tiedä tämä: missä tahansa tietokoneessa oleva järjestelmä on vastuussa tästä, ja sen nimi - ei, ei Windows, käännä kieltäsi - sitä kutsutaan BIOSiksi. Sen nimi tulee sanoista Basic Input-Output System, eli perustulo-lähtöjärjestelmä. BIOS sijaitsee emolevyn pienellä sirulla ja käynnistyy heti suuren ON-painikkeen painamisen jälkeen. BIOSilla on kolme päätehtävää:

  1. Tunnista kaikki kytketyt laitteet (prosessori, näppäimistö, näyttö, RAM, näytönohjain, pää, kädet, siivet, jalat ja hännän...) ja tarkista niiden toiminta. POST (Power On Self Test) -ohjelma on vastuussa tästä. Jos elintärkeää laitteistoa ei havaita, mikään ohjelmisto ei voi auttaa, ja tässä vaiheessa järjestelmän kaiutin narisee jotain pahaenteistä ja käyttöjärjestelmä ei pääse asiaan ollenkaan. Älkäämme puhuko surullisista asioista, oletetaan, että meillä on täysin toimiva tietokone, iloitaan ja siirrytään toisen BIOS-toiminnon pohtimiseen:
  2. Käyttöjärjestelmälle tarjotaan perustoimintoja laitteiston kanssa työskentelyä varten. Esimerkiksi BIOS-toimintojen kautta voit näyttää tekstiä näytöllä tai lukea tietoja näppäimistöltä. Siksi sitä kutsutaan perustulo/lähtöjärjestelmäksi. Tyypillisesti käyttöjärjestelmä käyttää näitä toimintoja keskeytysten kautta.
  3. Käyttöjärjestelmän latausohjelman käynnistäminen. Tässä tapauksessa yleensä luetaan käynnistyssektori - tallennusvälineen ensimmäinen sektori (levyke, kiintolevy, CD, flash-asema). Mediapollausjärjestys voidaan asettaa BIOS SETUPissa. Käynnistyssektori sisältää ohjelman, jota joskus kutsutaan ensisijaiseksi käynnistyslataimeksi. Karkeasti sanottuna käynnistyslataimen tehtävänä on käynnistää käyttöjärjestelmä. Käyttöjärjestelmän latausprosessi voi olla hyvin spesifinen ja riippuvainen suuresti sen ominaisuuksista. Siksi käyttöjärjestelmän kehittäjät kirjoittavat ensisijaisen käynnistyslataimen suoraan, ja se kirjoitetaan käynnistyssektoriin asennuksen aikana. Kun käynnistyslatain käynnistyy, prosessori on reaalitilassa.
Surullinen uutinen on, että käynnistyslataimen tulisi olla vain 512 tavua kooltaan. Miksi niin vähän? Tätä varten meidän on tutustuttava levykkeen rakenteeseen. Tässä informatiivinen kuva:

Kuvassa on levyaseman pinta. Levykkeellä on 2 pintaa. Jokaisella pinnalla on renkaan muotoisia polkuja (raitoja). Jokainen raita on jaettu pieniin kaaren muotoisiin osiin, joita kutsutaan sektoreiksi. Joten historiallisesti levykesektorin koko on 512 tavua. BIOS lukee levyn ensimmäisen sektorin, käynnistyssektorin, nollamuistisegmenttiin 0x7C00:ssa, ja sitten ohjaus siirretään tähän osoitteeseen. Käynnistyslataaja ei yleensä lataa itse käyttöjärjestelmää, vaan toista käynnistyslatausohjelmaa tallennettu levylle, mutta jostain syystä (todennäköisimmin tämä syy on koko) ei sovi yhteen sektoriin Ja koska käyttöjärjestelmämme roolia esittää toistaiseksi banaali Helloworld, päätavoitteemme on tehdä tietokoneesta. usko käyttöjärjestelmämme olemassaoloon, vaikka vain yhdellä sektorilla, ja käynnistä se.

Miten käynnistyssektori on rakennettu? PC:ssä käynnistyssektorin ainoa vaatimus on, että sen kaksi viimeistä tavua sisältävät arvot 0x55 ja 0xAA - käynnistyssektorin allekirjoitus. Joten on jo enemmän tai vähemmän selvää, mitä meidän on tehtävä. Kirjoitetaan koodi! Annettu koodi on kirjoitettu yasm-asentajaa varten.

-osio. teksti

käyttö 16

org 0x7C00 ; ohjelmamme on ladattu osoitteeseen 0x7C00

alkaa:

mov ax, cs

mov ds, ax ; valitse datasegmentti



mov si , viesti

cld ; merkkijonokomentojen suunta

mov ah, 0x0E ; BIOS-ominaisuuden numero

mov bh , 0x00 ; videomuistisivu

puts_loop:

lodsb ; lataa seuraava symboli kohtaan al

testi al, al ; tyhjä merkki tarkoittaa rivin loppua

jz puts_loop_exit

int 0x10 ; kutsu BIOS-toiminto

jmp puts_loop

puts_loop_exit:

jmp$; ikuinen kierto



viesti:

db "Hei maailma!" , 0

suorittaa loppuun:

kertaa 0x1FE - maali + aloitus db 0

db 0x55, 0xAA ; käynnistyssektorin allekirjoitus

Tämä lyhyt ohjelma vaatii joitakin tärkeitä selityksiä. Rivi org 0x7C00 tarvitaan, jotta assembler (eli ohjelmaa, ei kieltä) laskee oikein tarrojen ja muuttujien osoitteet (puts_loop, puts_loop_exit, message). Joten ilmoitamme hänelle, että ohjelma ladataan muistiin osoitteessa 0x7C00.
Linjoissa
mov ax, cs

mov ds, ax
datasegmentti (ds) on sama kuin koodisegmentti (cs), koska ohjelmassamme sekä data että koodi on tallennettu samaan segmenttiin.

Seuraavaksi silmukassa näkyy viesti "Hei maailma!" Tätä tarkoitusta varten käytetään keskeytyksen 0x10 funktiota 0x0E. Siinä on seuraavat parametrit:
AH = 0x0E (funktion numero)
BH = videon sivunumero (älä vielä vaivaudu, merkitse 0)
AL = ASCII-merkkikoodi

Rivillä "jmp$" ohjelma pysähtyy. Ja aivan oikein, sen ei tarvitse suorittaa ylimääräistä koodia. Jotta tietokone kuitenkin toimisi uudelleen, sinun on käynnistettävä uudelleen.

Rivillä “times 0x1FE-finish+start db 0” muu ohjelmakoodi (lukuun ottamatta kahta viimeistä tavua) täytetään nolilla. Tämä tehdään niin, että kääntämisen jälkeen ohjelman kaksi viimeistä tavua sisältävät käynnistyssektorin allekirjoituksen.

Olemme ilmeisesti selvittäneet ohjelmakoodin, yritetään nyt koota tämä onnellisuus. Kokoamista varten tarvitsemme tarkasti ottaen kokoonpanijan - edellä mainitun

Tämä artikkelisarja on omistettu matalan tason ohjelmointiin, eli tietokonearkkitehtuuriin, käyttöjärjestelmien suunnitteluun, kokoonpanokieliohjelmointiin ja niihin liittyviin alueisiin. Tähän mennessä kaksi habrauseria kirjoittaa - ja . Monille lukiolaisille, opiskelijoille ja jopa ammattiohjelmoijille nämä aiheet osoittautuvat erittäin vaikeiksi oppia. Matalan tason ohjelmointiin on omistettu paljon kirjallisuutta ja kursseja, mutta täydellisen ja kaiken kattavan kuvan saaminen on vaikeaa. On vaikeaa luettuaan yhden tai kaksi assembly-kieltä ja käyttöjärjestelmiä käsittelevää kirjaa, ainakin yleisellä tasolla kuvitella, kuinka tämä monimutkainen raudasta, piistä ja monista ohjelmista koostuva järjestelmä - tietokone - todella toimii.

Jokainen ratkaisee oppimisongelman omalla tavallaan. Jotkut ihmiset lukevat paljon kirjallisuutta, jotkut yrittävät siirtyä nopeasti harjoittelemaan ja ottamaan selvää siitä, kun he menevät, toiset yrittävät selittää ystävilleen kaiken, mitä he opiskelevat. Ja päätimme yhdistää nämä lähestymistavat. Joten tässä artikkelien kurssissa osoitamme askel askeleelta kuinka kirjoittaa yksinkertainen käyttöjärjestelmä. Artikkelit tulevat olemaan katsausluonteisia, eli ne eivät sisällä tyhjentävää teoreettista tietoa, vaan pyrimme aina tarjoamaan linkkejä hyviin teoreettisiin aineistoihin ja vastaamaan kaikkiin esille tuleviin kysymyksiin. Meillä ei ole selkeää suunnitelmaa, joten monia tärkeitä päätöksiä tehdään matkan varrella palautteesi huomioiden.

Saatamme tietoisesti estää kehitysprosessin, jotta sinä ja me voimme täysin ymmärtää huonon päätöksen seuraukset ja hioa siihen liittyviä teknisiä taitoja. Joten sinun ei pitäisi nähdä päätöksiämme ainoina oikeina ja uskoa meihin sokeasti. Korostetaan vielä kerran, että odotamme lukijoiden olevan aktiivisia artikkeleista keskustelemassa, minkä pitäisi vaikuttaa suuresti seuraavien artikkeleiden kehittämis- ja kirjoitusprosessiin. Ihannetapauksessa haluaisin ajan myötä joidenkin lukijoiden osallistuvan järjestelmän kehittämiseen.

Oletetaan, että lukija tuntee jo assembly- ja C-kielten perusteet sekä tietokonearkkitehtuurin peruskäsitteet. Eli emme selitä mitä rekisteri tai esimerkiksi RAM on. Jos sinulla ei ole tarpeeksi tietoa, voit aina kääntyä lisäkirjallisuuden puoleen. Lyhyt luettelo viitteistä ja linkkejä sivustoille, joilla on hyviä artikkeleita, on artikkelin lopussa. On myös suositeltavaa osata käyttää Linuxia, koska kaikki käännösohjeet annetaan erityisesti tätä järjestelmää varten.

Ja nyt - lähempänä asiaa. Artikkelin loppuosassa kirjoitamme klassisen "Hello World" -ohjelman. Helloworld on hieman täsmällinen. Sitä ei käynnistetä mistään käyttöjärjestelmästä, vaan suoraan niin sanotusti "paljaalle metallille". Ennen kuin aloitamme koodin kirjoittamisen, selvitetään tarkasti, kuinka yritämme tehdä tämän. Ja tätä varten meidän on harkittava tietokoneen käynnistysprosessia.

Joten ota suosikkitietokoneesi ja paina järjestelmäyksikön suurinta painiketta. Näemme iloisen näytönsäästäjän, järjestelmäyksikkö piippaa iloisesti kaiuttimellaan ja jonkin ajan kuluttua käyttöjärjestelmä latautuu. Kuten ymmärrät, käyttöjärjestelmä on tallennettu kiintolevylle, ja tässä herää kysymys: kuinka käyttöjärjestelmä latautui maagisesti RAM-muistiin ja aloitti suorittamisen?

Tiedä tämä: missä tahansa tietokoneessa oleva järjestelmä on vastuussa tästä, ja sen nimi - ei, ei Windows, käännä kieltäsi - sitä kutsutaan BIOSiksi. Sen nimi tulee sanoista Basic Input-Output System, eli perustulo-lähtöjärjestelmä. BIOS sijaitsee emolevyn pienellä sirulla ja käynnistyy heti suuren ON-painikkeen painamisen jälkeen. BIOSilla on kolme päätehtävää:

  1. Tunnista kaikki kytketyt laitteet (prosessori, näppäimistö, näyttö, RAM, näytönohjain, pää, kädet, siivet, jalat ja hännän...) ja tarkista niiden toiminta. POST (Power On Self Test) -ohjelma on vastuussa tästä. Jos elintärkeää laitteistoa ei havaita, mikään ohjelmisto ei voi auttaa, ja tässä vaiheessa järjestelmän kaiutin narisee jotain pahaenteistä ja käyttöjärjestelmä ei pääse asiaan ollenkaan. Älkäämme puhuko surullisista asioista, oletetaan, että meillä on täysin toimiva tietokone, iloitaan ja siirrytään toisen BIOS-toiminnon pohtimiseen:
  2. Käyttöjärjestelmälle tarjotaan perustoimintoja laitteiston kanssa työskentelyä varten. Esimerkiksi BIOS-toimintojen kautta voit näyttää tekstiä näytöllä tai lukea tietoja näppäimistöltä. Siksi sitä kutsutaan perustulo/lähtöjärjestelmäksi. Tyypillisesti käyttöjärjestelmä käyttää näitä toimintoja keskeytysten kautta.
  3. Käyttöjärjestelmän latausohjelman käynnistäminen. Tässä tapauksessa yleensä luetaan käynnistyssektori - tallennusvälineen ensimmäinen sektori (levyke, kiintolevy, CD, flash-asema). Mediapollausjärjestys voidaan asettaa BIOS SETUPissa. Käynnistyssektori sisältää ohjelman, jota joskus kutsutaan ensisijaiseksi käynnistyslataimeksi. Karkeasti sanottuna käynnistyslataimen tehtävänä on käynnistää käyttöjärjestelmä. Käyttöjärjestelmän latausprosessi voi olla hyvin spesifinen ja riippuvainen suuresti sen ominaisuuksista. Siksi käyttöjärjestelmän kehittäjät kirjoittavat ensisijaisen käynnistyslataimen suoraan, ja se kirjoitetaan käynnistyssektoriin asennuksen aikana. Kun käynnistyslatain käynnistyy, prosessori on reaalitilassa.
Surullinen uutinen on, että käynnistyslataimen tulisi olla vain 512 tavua kooltaan. Miksi niin vähän? Tätä varten meidän on tutustuttava levykkeen rakenteeseen. Tässä informatiivinen kuva:

Kuvassa on levyaseman pinta. Levykkeellä on 2 pintaa. Jokaisella pinnalla on renkaan muotoisia polkuja (raitoja). Jokainen raita on jaettu pieniin kaaren muotoisiin osiin, joita kutsutaan sektoreiksi. Joten historiallisesti levykesektorin koko on 512 tavua. BIOS lukee levyn ensimmäisen sektorin, käynnistyssektorin, nollamuistisegmenttiin 0x7C00:ssa, ja sitten ohjaus siirretään tähän osoitteeseen. Käynnistyslataaja ei yleensä lataa itse käyttöjärjestelmää, vaan toista käynnistyslatausohjelmaa tallennettu levylle, mutta jostain syystä (todennäköisimmin tämä syy on koko) ei sovi yhteen sektoriin Ja koska käyttöjärjestelmämme roolia esittää toistaiseksi banaali Helloworld, päätavoitteemme on tehdä tietokoneesta. usko käyttöjärjestelmämme olemassaoloon, vaikka vain yhdellä sektorilla, ja käynnistä se.

Miten käynnistyssektori on rakennettu? PC:ssä käynnistyssektorin ainoa vaatimus on, että sen kaksi viimeistä tavua sisältävät arvot 0x55 ja 0xAA - käynnistyssektorin allekirjoitus. Joten on jo enemmän tai vähemmän selvää, mitä meidän on tehtävä. Kirjoitetaan koodi! Annettu koodi on kirjoitettu yasm-asentajaa varten.

-osio. teksti

käyttö 16

org 0x7C00 ; ohjelmamme on ladattu osoitteeseen 0x7C00

alkaa:

mov ax, cs

mov ds, ax ; valitse datasegmentti



mov si , viesti

cld ; merkkijonokomentojen suunta

mov ah, 0x0E ; BIOS-ominaisuuden numero

mov bh , 0x00 ; videomuistisivu

puts_loop:

lodsb ; lataa seuraava symboli kohtaan al

testi al, al ; tyhjä merkki tarkoittaa rivin loppua

jz puts_loop_exit

int 0x10 ; kutsu BIOS-toiminto

jmp puts_loop

puts_loop_exit:

jmp$; ikuinen kierto



viesti:

db "Hei maailma!" , 0

suorittaa loppuun:

kertaa 0x1FE - maali + aloitus db 0

db 0x55, 0xAA ; käynnistyssektorin allekirjoitus

Tämä lyhyt ohjelma vaatii joitakin tärkeitä selityksiä. Rivi org 0x7C00 tarvitaan, jotta assembler (eli ohjelmaa, ei kieltä) laskee oikein tarrojen ja muuttujien osoitteet (puts_loop, puts_loop_exit, message). Joten ilmoitamme hänelle, että ohjelma ladataan muistiin osoitteessa 0x7C00.
Linjoissa
mov ax, cs

mov ds, ax
datasegmentti (ds) on sama kuin koodisegmentti (cs), koska ohjelmassamme sekä data että koodi on tallennettu samaan segmenttiin.

Seuraavaksi silmukassa näkyy viesti "Hei maailma!" Tätä tarkoitusta varten käytetään keskeytyksen 0x10 funktiota 0x0E. Siinä on seuraavat parametrit:
AH = 0x0E (funktion numero)
BH = videon sivunumero (älä vielä vaivaudu, merkitse 0)
AL = ASCII-merkkikoodi

Rivillä "jmp$" ohjelma pysähtyy. Ja aivan oikein, sen ei tarvitse suorittaa ylimääräistä koodia. Jotta tietokone kuitenkin toimisi uudelleen, sinun on käynnistettävä uudelleen.

Rivillä “times 0x1FE-finish+start db 0” muu ohjelmakoodi (lukuun ottamatta kahta viimeistä tavua) täytetään nolilla. Tämä tehdään niin, että kääntämisen jälkeen ohjelman kaksi viimeistä tavua sisältävät käynnistyssektorin allekirjoituksen.

Olemme ilmeisesti selvittäneet ohjelmakoodin, yritetään nyt koota tämä onnellisuus. Kokoamista varten tarvitsemme tarkasti ottaen kokoonpanijan - edellä mainitun