Monday, 12 December 2016

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/

Friday, 9 December 2016

FreeRTOS Visual Studiossa

Virtuaalikoneen käyttöönoton ja bootloaderin asentamisen välissä halusimme kokeilla harjoitustyössä käytettävän lähdekoodin toimintaa jo meille ennestään tutussa Visual Studiossa. Näin pääsisimme testaamaan lähdekoodia ja harjoittelemaan reaaliaikaisen käyttöjärjestelmän käyttöä hyödyntäen Windowsin rajapintaa. Tarkoituksena oli siis tuottaa annettulla lähdekoodilla projekti, joka jolla saataisiin tulostettua konsoliin tekstiä, jonka jälkeen luomme oman taskin koodiin, joka tulostaa haluamamme merkkijonon lähdekoodin tuottamaan viestijonoon.

Pienen googlettamisen jälkeen, päädyimme käyttämään tästä linkistä löydettävää FreeRTOS-latausta:


Latasimme omaan projektiin tarvittavan zip-kansion, josta pystyimme valitsemaan tähän testaukseen sopivan demon. Pienen hampaiden kiristelyn (unohdettiin purkaa zip-tiedosto yhdessä välissä...) jälkeen saatiin solution avattua Visual Studiolla, vaikka Studio varoittelikin vanhentuneen versionsa käytöstä. Koodi saatiin siis käännettyä ja konsoliin saatiin tekstiä aikaan, mutta ajan puutteen (ja allekirjoittaneen totaalisen hermojen menetyksen) vuoksi omien taskien viilaaminen lähdekoodiin jäi tässä vaiheessa tekemättä. 

Harjoitustyön tarkoituksena olisi kuitenkin saada tämä käyttöjärjestelmä toimimaan suoraan raudalla, eikä käyttäen Windowsin rajapintaa. Koko tehtävän tarkoitus oli tutustua reaaliaikaisen käyttöjärjestelmän käyttöön ja toimintaan ja tässä kyseisessä tehtävässä käyttis on kaikkea muuta kun reaaliaikainen, koska se toimii Windowin päällä. Tämä oli siis vain yksi askel matkalla itse harjoitustyön tavoitteeseen. 

Jos ja kun kokeilemme koodin ajamista uudestaan VS:ssa, pitää oman taskin luonnissa ottaa huomioon mm. luodun taskin prioriteetti, ettei oma taski nälkiinnyta muita, esim. tulostus-taskeja. Kun oman taskin laittaa tulostamaan merkkijonon viestijonoon, nähdään sen prioriteetti ja suoritusjärjestys muihin taskeihin verrattuna. Prioriteettejä pääsee muokkaamaan esim. kohdasta mainQUEUE_PRIORITY_ tms. Varsinaisessa harjoitustyössä ei voida myöskään käyttää tässä koodissa mainiin includattuja kirjastoja, koska kyseisiä kirjastoja ei ole olemassa, kun koodi ajetaan suoraan raudalla.

Seuraavaksi sukelletaan takaisin varsinaiseen harjoitustyön aiheeseen ja perehdytään virtuaalilevyn bootloaderiin.

Thursday, 1 December 2016

Virtuaalikoneen valinta ja käyttöönotto


FreeRTOS -käyttöjärjestelmää ei ole tarkoitettu millekään tietylle suoritinarkkitehtuurille, vaan siitä löytyy versioita monille arkkitehtuureille ja se voidaan portata myös monille muille. Nyt on tarkoituksena saada FreeRTOS toimimaan x86-raudalla. Tätä pystytään simuloimaan helposti ilmaisilla virtuaalikone-ohjelmistoilla, vaikka FreeRTOS:n reaaliaikaisuus jääkin silloin puuttumaan. Käyttöjärjestelmän asentaminen ja toimivuus pystytään kuitenkin testaamaan.

Virtuaalikone-ohjelmistoksi valittiin ilmainen VirtualBox, joka tukee x86 ja AMD64/Intel64 -virtualisointia.

VirtualBoxin asennuksen jälkeen aloitetaan luomalla uusi x86-virtuaalikone, jolle FreeRTOS pyritään saamaan pyörimään.

VirtualBox virtuaalikoneen luonti for dummies:

Klikkaa ikkunan vasemmasta ylälaidasta New. Aukeaa uuden koneen luonti-ikkuna

Kuva 1: Tyypiksi ja versioksi voi valita other. 

Kuva 2: Piskuinen käyttöjärjestelmämme pärjää minimimäärällä käyttömuistia.

Seuraavana käske luomaan uusi virtuaalinen levy.
Tässä blogissa käytimme VDI-tyyppistä levykuvaa.

Kuva 3: Valitse levykuvan tyypiksi kiinteä / fixed size, muuten bootloaderin asennus ei onnistu (aiheesta lisää seuraavassa blogipostauksessa)

 Kuva 4: Myös levyn koossa riittää minimi.

Virtuaalikoneen luonti on valmis! Sen saa käynnistettyä VirtualBoxin start-painikkeella. Mitään ei vielä tietenkään tapahdu, koska koneen levy on täysin tyhjä.

Blogin seuraavassa osassa asennamme koneen virtuaaliselle levylle bootloader-osion, jonka avulla saamme käyttöjärjestelmän käynnistettyä.



Projekti: FreeRTOS x86

reaaliaikakäyttöjärjestelmän porttaus x86-ympäristöön

Osana TAMK:n käyttöjärjestelmäkurssia kokeilemme, miten FreeRTOS -käyttöjärjestelmän saisi toimimaan x86-suoritinarkkitehtuurin ympäristössä. Tarkoituksena on tehdä operaatio alusta loppuun lähdekoodeista toimivaan järjestelmään. Lähdekoodeja ei tehdä alusta asti itse, vaan etsitään sopivaa pohjaa, jota voidaan muutella. Tavoitteena on oppia jotakin käyttöjärjestelmien kehittämisestä sekä tietokoneen käynnistämisen vaiheista nollasta työpöydälle asti. Tutustumme myös joihinkin perustyökaluihin.

Alustana käytetään virtuaalikonetta oikean raudan puutteessa ja projektin virtaviivaistamiseksi. Virtuaalikone pyörii Windowsin päällä, joten FreeRTOS:n reaaliaikaisuus menetetään, mutta muuten asennus ja toimivuus saadaan testattua.

Projektissa tulee eteen ainakin seuraavat vaiheet:
  • Virtuaalikone-ohjelmiston valinta ja virtuaalikoneen asennus sopivilla spekseillä
  • Sopivan bootloaderin etsintä, kääntäminen ja sen asennus virtuaaliselle levykuvalle
  • FreeRTOS:n lähdekoodin mahdollinen muokkaaminen sekä kääntäminen ja asentaminen
  • Käynnistysketjun testaus
Lista saattaa olla näin alussa vielä puutteellinen ja sitä päivitetään projektin edetessä, tai sitten ollaan päivittämättä.

Vastuuta emme voi ottaa, jos luet tätä ja tuhoat koneesi/tiedostosi/järkesi.

 Terveisin Lauri, Mikko, Pauliina, Joona


Seuraavassa postauksessa otetaan virtuaalikone käyttöön.