Oma bootloader virtuaalilevylle
Jotta oman käyttöjärjestelmän saa käyntiin, täytyy tietää, mitä tietokone tekee, kun sen käynnistää.PC:n emolevylle on tallennettu BIOS, joka on alkeellinen ja pienikokoinen kokoelma ohjelmia ja toimintoja, joiden tarkoituksena on tarkistaa, mitä peruslaitteita tietokoneeseen on kytketty. Se suoritetaan ensimmäisenä aina tietokoneen käynnistyessä. BIOS mm. suorittaa pikaisen muistin tarkistuksen ja tunnistaa näytön, näppäimistön ja kiintolevyt sekä aloittaa käyttöjärjestelmän käynnistysprosessin. Käyttöjärjestelmä on tallennettu levylle tiettyyn tiedostojärjestelmään, mutta BIOS on niin simppeli, että sillä ei ole mitään tietoa tiedostojärjestelmistä. Ongelma on ratkaistu siten, että BIOS lukee raakaa dataa levyltä tietystä sijainnista, joka on standardein määrätty. Tämä tietty sijainti on käynnistysosio, joka sisältää ns. bootloaderin. Bootloader taas on simppeli ohjelma, joka osaa esim. aloittaa varsinaisen käyttöjärjestelmän ytimen käynnistämisen. Bootloaderit ovat yleensä erilaisia eri käyttöjärjestelmille, mutta samaankin bootloaderiin voidaan liittää useita eri käyttöjärjestelmiä.
FreeRTOSin käynnistämistä varten tarvitsemme oman bootloaderin. Tämä postaus kertoo, mistä bootloaderin voi hankkia, miten sen voi kääntää ja miten se saadaan asennettua VirtualBoxin levylle.
Käytämme MBR-tyyppistä käynnistysosiota. MBR alkaa aivan levyn alusta ja päättyy tiettyyn lopetusmerkkijonoon. MBR on julkaistu jo vuonna 1983 ja se on edelleen yleisesti käytössä, joten se on varma valinta tähänkin projektiin. MBR:n tietyssä kohdassa on tallennettuna bootloader.
Bootloaderin lähdekoodina käytimme valmista koodia, joka ei käynnistä vielä käyttöjärjestelmää, mutta tulostaa ruudulle tekstiä Hello World -tyyppisesti. Sen avulla voimme testata bootloaderin kääntämistä ja sen kirjoittamista virtuaalisen levykuvan MBR:ään.
Bootloader ladataan tietokoneen käynnistyessä BIOSin jälkeen ja se suoritetaan 16-bittisessä real modessa ja sen maksimikoko on 512 tavua. Bootloader täytyy kirjoittaa matalan tason ohjelmointikielellä ja esimerkissämme se on kirjoitettu assemblylla.
Bootloaderin lähdekoodi täytyy tietenkin kääntää konekielelle ennen käyttöä. Kääntäjänä käytimme NASMia Windowsissa. Lähdekoodi tallennetaan tekstimuodossa. NASMia käytetään komentoriviltä ja sille annetaan argumenttina ulostulotyyppi sekä kohde- ja lähdetiedostot. Tyyppinä käytetään puhdasta binääriä. Komento NASMille: nasm -f bin -o ulostulotiedosto sisäänmenotiedosto
Heksaeditorilla voidaan avata mitä tahansa tiedostoja ja tässä tapauksessa sillä voidaan kopioida MBR-osio virtuaaliseen levykuvatiedostoon.

Kuva 1 Käännetty bootloaderin binääri heksaeditorissa
Ennen kopiointia täytyisi tietää, mihin kohtaan tiedostoa data pitää kopioida. Edellisessä postauksessa loimme VirtualBox-levykuvan. Se sisältää virtuaalisen kopion fyysisestä kiintolevystä sekä ennen sitä hieman VirtualBoxin omaa metadataa. MBR pitäisi saada varsinaisen levyn alkuun. Internetistä löytyvät tiedonjyväset viittaavat, että VBoxin levykuvan metadata on 200 kilotavua pitkä ja varsinainen levy alkaa sen jälkeen. Tämä tarkoittaa, että oma MBR:mme pitää kopioida viime postauksessa luomamme virtuaalikoneen levykuvatiedoston kohtaan, joka alkaa tavusta 200 000. Heksaeditorilla pystyy hyppäämään suoraan oikeaan indeksiin goto-toiminnolla.

Kuva2 MBR kopioitu VirtualBoxin levykuvatiedostoon
Levykuvatiedoston tallentamisen jälkeen, jos kaikki meni hyvin, niin virtuaalikoneemme pitäisi nyt käynnistyä omaan bootloaderiimme.

Kuva 3 Bootloader toimii
Lähteet:
Nick Blundell, Writing a Simple Operating System from Scratch, https://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf
Fisnik Hasani, Building Your Own Bootloader, http://fisnikhasani.com/building-your-own-bootloader/
No comments:
Post a Comment