Page 1 of 1

Oman "käyttöjärjestelmän" tekeminen

Posted: Sun Nov 04, 2012 3:15 pm
by naputtelija
Käyttöjärjestelmän teko Episodi 1: Bootloader

Vaikka tämä nyt ei mitenkään coolbasiciin liity, ajattelin, että hyvin monelle aloittelevalle assembly-ohjelmoijalle (kuten minulle) voisi olla tästä tutoriaalista hyötyä.

Kyseessä on siis oman käyttöjärjestelmän koodaaminen ihan perusteista lähtien käyttäen assemblyä ja C-kieltä. Pyrin tässä oppaassa antamaan ohjeet sekä windowsille että linuxille, mutta suosittelen kuitenkin käyttämään linuxia siksi, että sillä on huomattavasti helpompi asentaa tarvittavat ohjelmat jos vain terminaali on hallussa. Netistä kyllä löytyy kohtuullisen helposti muitakin oppaita aiheesta, mutta ne ovat usein englanniksi ja käsittelevät melko vanhoja ohjelmia, joita ei vättämättä ole enää saatavilla tai toimivat eri lailla nykyään. (Hyviä esimerkkejä ovat qemu ja partcopy.exe) No niin, jaarittelu seis ja aloitetaan.
  • Tarvittavat laitteet/työkalut:
  • Tietokone, jossa on käyttöjärjestelmänä windows tai linux (tässä käytän ubuntua)
  • Nasm-assembler. Voidaan asentaa ubuntulle kirjoittamalla terminaaliin sudo apt-get install build-essential nasm
  • 3,5 tuuman tyhjä korppu ja sille asema tai:
  • Mikä tahansa virtuaalikone, joka tukee boottaamista virtuaaliselta korpulta. Itse käyttäisin ubuntulla qemua, mutta jostain syystä en saanut sitä toimimaan ja sivutkin näyttävät olevan kaatuneet.
Koodaaminen:

Tämä osio on kohtuullisen helppo, vaikka aikaisempaa kokemusta assembly-ohjelmoinnista ei olisikaan. Tässä koodaamme assemblyllä bootloaderin, eli 512 tavun (jep, luit oikein, se on noin lyhyt) mittaisen ohjelman, joka lataa tulevaisuudessa käyttöjärjestelmämme muun datan. Nyt kuitenkin laitamme sen vain tulostamaan klassisen tekstin Hello World, että saamme jotain boottaamaan.

Tässä vaiheessa kannattaa luoda oma kansio käyttöjärjestelmällesi. Kun olet luonut kansion haluamaasi paikkaan, tee tyhjä tiedosto nimellä boot.txt kansioosi. Avaa tiedosto ja kirjoita sinne seuraava koodi:

Code: Select all

BITS 16

org 0x7c00

Start: jmp loader

msg db "Hello, World!", 0

Print:

lodsb
or al, al
jz PrintDone
mov ah, 0eh
int 10h
jmp Print

PrintDone:

ret

loader:

xor ax, ax
mov ds, ax
mov es, ax
mov si, msg
Call Print

xor ax, ax
int 0x12

cli
hlt

times 510 - ($-$$) db 0

dw 0xAA55
Tarkastellaanpa koodia:

BITS 16 kertoo prosessorille että tämä koodi käyttää 16-bittisiä komentoja. Kaikki bootloaderit käyttävät vain niitä.
org 0x7c00 kertoo prosessorille, mihin muistiosoitteeseen ohjelma pitää asettaa. Bootloaderit käynnistyvät aina osoitteesta 0x7c00 eivätkä mistään muualta.

Start: jmp loader hyppää (jump) seuraavat koodirivit yli loader-kohtaan.

msg db "Hello, World!" kertoo kääntäjälle, että tässä kohtaa tiedostoa on msg-niminen kohta, joka sisältää dataa. Tämä on melkein kuin muuttuja.

Print: "funktio", joka käy läpi kaikki tavut tietyssä kohtaa ja tulostaa ne näytölle.
-lodsb lataa seuraavan tavun rekisteriin. Rekisterit ovat vähän niin kuin koneen sisäisiä muuttujia, joille voidaan tehdä laskutoimituksia.
-or al, al tarkistaa, onko ladattu tavu 0, eli onko tekstiä jäljellä.
-jz PrintDone jos on, on valmis ja hypätään kohtaan PrintDone.
-mov ah, 0eh siirtää (move) luetun tavun rekisteriin ah, josta
-int 10h-ohjelmakeskeytys (interrupt) sen ottaa ja tulostaa näytölle.
-jmp Print hyppää takaisin alkuun.
-PrintDone: tässä kohtaa ollaan valmiita, joten
-ret palauttaa (return) "funktion" takaisin sinne, mistä kutsuttiin.

loader: on osio, johon hypättiin alussa.

xor ax, ax asettaa ax-rekisterin nollaksi, koska ax XOR ax on aina 0.
mov ds/es, ax siirtää ax-rekisterin arvon (0) rekistereihin ds ja es.
mov si, msg löytää lähdeindeksin "Hello, World!"-tekstille Print-kohtaa varten.
Call Print kutsuu print-kohtaa, joka tulostaa tekstin näytölle.
xor ax, ax nollaa taas ax-rekisterin.
int 0x12 on taas yksi kätevä ohjelmakeskeytys. Tämä asettaa ax-rekisterin arvoksi nykyisen työmuistin määrän kilotavuina. Tätä tarvitaan myöhemmin.

cli puhdistaa ohjelmakeskeytykset (clear interrupts)
hlt pysäyttää (halt) järjestelmän nykyiseen tilaansa. Silloin näytöllä ehtii näkyäkin jotain.

times 510 - ($-$$) db 0 täyttää bootsektorin nollilla 510 tavuun asti.
dw 0xAA55 antaa sektorille oman allekirjoituksen, että järjestelmä tunnistaa sen lopun. Näin boottisektori on tasan 512 tavua pitkä (510 + 2)

Kääntäminen:

Nyt käännämme koodimme konekieleksi nasm-assemblerilla. Nimeä ensiksi uudelleen boot.txt boot.asm-nimellä.

Windows:
Lataa nasmin uusimman version asentaja windowsille tästä. Kun asentaja on asettanut tiedostot valitsemaasi kansioon, siirrä nasm.exe järjestelmäkansioosi, joka on Windows xp:llä C:\WINDOWS\System32 tai Windows vistalla/7:llä C:\WINDOWS\SysWOW64. Avaa komentorivi. Siirry cd-komennolla kansioosi, jossa boot.asm sijaitsee. Kirjoita:

nasm Kansiosi/boot.asm -f bin -o Kansiosi/boot.bin,

missä Kansiosi kuvastaa kansiota, johon olet tallentanut boot.asmin.
Linux/ubuntu:
Olet jo asentanut nasmin yllä. Avaa vain terminaali (Ctrl+Alt+T), siirry cd-komennolla kansioosi, jossa boot.asm sijaitsee ja kirjoita:

nasm Kansiosi/boot.asm -f bin -o Kansiosi/boot.bin,

missä Kansiosi kuvastaa kansiota, johon olet tallentanut boot.asmin.
Bootloaderin tallentaminen korpulle:

Ennen tätä vaihetta tarkista, että boot.binin koko on 512 tavua. Jos se ei ole, olet tehnyt jotain väärin. Nyt siirrämme bootloaderimme korpulle, jolta voimme käynnistää sen.

Windows:
Aseta korppu asemaan A: ja alusta se haluamallasi työkalulla. komentorivin format a: käy hyvin. Mikäli haluat hoitaa homman nopeasti, lisää perään /q pikaformatointia varten. Mikäli käytät virtuaalikonetta, luo vain uusi virtuaalinen korppu ja nimeä se vaikka bootiksi.

Nyt voimme siirtää bootloaderimme korpulle. Avaa komentorivi, siirry kansioon, jossa boot.bin sijaitsee ja kirjoita:

debug boot.bin

Odota hetki. Nyt komentoriville pitäisi ilmestyä pieni viiva (-). Kun se on ilmestynyt, kirjoita:

w 100 0 0 1
q,

niin boot.binin kaikki tavut kopioidaan aseman A: ensimmäiselle sektorille.

Jos käytät virtuaalista korppua, käytä partcopya kopioidaksesi boot.binin kaikki 512 tavua virtuaalisen korppusi levykuvatiedoston alkuun.
Linux/ubuntu:
Aseta korppusi asemaan ja alusta se haluamallasi työkalulla. Avaa sitten terminaali, siirry cd:llä kansioon, jossa boot.bin sijaitsee ja kirjoita

dd if=boot.bin bs=512 of=/dev/fd0

niin boot.binin kaikki 512 tavua kopioidaan korpun ensimmäiselle sektorille. Jos äsköinen ei toimikaan, vaihda fd0 fd1:ksi. Jos käytät virtuaalista korppua, vaihda /dev/fd0 poluksi virtuaalisen korppusi levykuvaan.
Käynnistys:

Kaikki pitäisi olla valmista. Käynnistä tietokoneesi/vrtuaalikoneesi uudelleen korppu asemassa ja varmista, että tietokoneesi käynnistysjärjestyksessä on Floppy drive ennen Hard disk driveä. Käynnistysjärjestykseen pääsee käsiksi tietokoneesta riippuen painamalla jotain funktionäppäintä tietokoneen käynnistyessä. Jos kaikki meni oikein, Tietokoneesi pitäisi käynnistyä ja kirjoittaa näytölle teksti "Hello, world!"

Onneksi olkoon, olet juuri tehnyt ensimmäisen bootloaderisi!
Erilaista palautetta oppaasta otetaan vastaan.
EDIT:

Ohhoh, tämähän on ensimmmäinen tutoriaalini :shock: Toivottavasti tykkäätte :)


Re: Oman käyttöjärjestelmän tekeminen

Posted: Mon Nov 05, 2012 12:11 am
by valscion
Koska tutoriaalisi aihe ei liittynyt CoolBasiciin, siirsin sen Yleinen-alueelle.

Re: Oman käyttöjärjestelmän tekeminen

Posted: Mon Nov 05, 2012 12:18 am
by naputtelija
VesQ wrote:Koska tutoriaalisi aihe ei liittynyt CoolBasiciin, siirsin sen Yleinen-alueelle.
Kiitos. Alussa mietinkin, pitäisikö topic laittaa yleisiin vai tutoriaaleihin. Nyt tiedän.

Re: Oman käyttöjärjestelmän tekeminen

Posted: Tue Nov 06, 2012 7:45 am
by Timblex
Hieno tuto oli mutta ainakin minulla tuo kääntäminen ei toiminut antamallasi komennolla vaan se piti muuttaa tällaiseksi:

Code: Select all

nasm  Kansiosi/boot.asm -f bin -o Kansiosi/boot.bin

Re: Oman käyttöjärjestelmän tekeminen

Posted: Tue Nov 06, 2012 8:42 am
by naputtelija
timpe99 wrote:Hieno tuto oli mutta ainakin minulla tuo kääntäminen ei toiminut antamallasi komennolla vaan se piti muuttaa tällaiseksi:

Code: Select all

nasm  Kansiosi/boot.asm -f bin -o Kansiosi/boot.bin
Niin, nähtävästi kopioin rimpsun jostain vanhasta oppaasta, joka käytti kääntäjän eri versiota. Nyt on kunnossa.

Re: Oman käyttöjärjestelmän tekeminen

Posted: Tue Nov 06, 2012 9:38 pm
by esa94
älä tee tutoriaalia aiheesta josta et tiedä mitään

Re: Oman käyttöjärjestelmän tekeminen

Posted: Tue Nov 06, 2012 10:35 pm
by legend
esa94 wrote:älä tee tutoriaalia aiheesta josta et tiedä mitään
Turhan karu totuus naputtelijalle :o

Re: Oman käyttöjärjestelmän tekeminen

Posted: Tue Nov 06, 2012 11:46 pm
by naputtelija
Mistä te tiedätte, kuinka paljon minä tästä tiedän? Sitä paitsi, sen takiahan osittain minä tämän teen, että oppisin. Jos joku on sitä mieltä, että tutoriaalissa on virheitä tai epäkohtia, voitte ilmoittaa suoraan epäkohdat sen kummemmin haukkumatta yleistietämystäni. Ei nyt anneta modeille munalukkoa hopealautasella.
EDIT:

Oppaan toinen osa on tulossa, joka käsittelee tiedon lukemista korpulta bootloaderilla. Tämähän ei ole valmis bootloader vielä, jos sitä tarkoitatte. Tämän osan tarkoituksena oli vain sisäistyttää se, miten saadaan ohjelma buuttaamaan korpulta, eikä se, mitä se tekee.


Re: Oman "käyttöjärjestelmän" tekeminen

Posted: Wed Nov 07, 2012 2:15 am
by TheFlash
Ei tuossa kyllä ihan kauheasti asiavirheitä ollu. Turhan demoralisoiva asenne.

Mutta jospa listaan ne asiavirheet:
"BITS 16 kertoo prosessorille että tämä koodi käyttää 16-bittisiä komentoja. Kaikki bootloaderit käyttävät vain niitä.
org 0x7c00 kertoo prosessorille, mihin muistiosoitteeseen ohjelma pitää asettaa."

Nämä kaksi direktiiviä ei kerro prosessorille oikeastaan yhtään mitään, niistä ei generoida ainuttakaan konekielistä käskyä. Nämä on ohjeita assemblerille.

"cli puhdistaa ohjelmakeskeytykset (clear interrupts)"
Ei tämä mitään ohjelmakeskeytyksiä puhdista. Komennon koko "nimi" on clear interrupt flag. Tämä siis asettaa nollabitin suorittimen statusrekisteriin IF-bitin kohdalle. Tämän bitin ollessa nolla, suoritin ignoroi _rauta_keskeytykset, ei ohjelmakeskeytyksiä.

Elämäähelpottavana vinkkinä vielä:
Tuo listaus kääntyy melkein semmosenaan validiksi DOS:n .com-tiedostoksi, vaihtaa vain org direktiivin tilalle "org 0x100". Voi ajaa esim. DOSBoxissa.

Re: Oman "käyttöjärjestelmän" tekeminen

Posted: Thu Nov 08, 2012 10:26 am
by KilledWhale
Aika turhaa tehdä suomenkielistä opasta käyttöjärjestelmän tekemisestä kun netistä löytyy kiljoonittain parempia oppaita englanniksi.
Jos joku ei sen vertaa osaa englantia että voisi kyseisiä oppaita lukea, voi kyseinen henkilö puolestani painua vittuun Internetistä.

Re: Oman "käyttöjärjestelmän" tekeminen

Posted: Thu Nov 08, 2012 11:32 am
by naputtelija
KilledWhale wrote:Aika turhaa tehdä suomenkielistä opasta käyttöjärjestelmän tekemisestä kun netistä löytyy kiljoonittain parempia oppaita englanniksi.
Jos joku ei sen vertaa osaa englantia että voisi kyseisiä oppaita lukea, voi kyseinen henkilö puolestani painua vittuun Internetistä.
Niin, mitä järkeä onkin tehdä jotain, jonka joku muu on tehnyt? Tällä ajattelutavalla mm. Kaikki pong-kloonit ovat täysin turhia. Älä unohda, että kaikella tiedolla on itseisarvo.

Re: Oman "käyttöjärjestelmän" tekeminen

Posted: Thu Nov 08, 2012 12:16 pm
by KilledWhale
naputtelija wrote:
KilledWhale wrote:Aika turhaa tehdä suomenkielistä opasta käyttöjärjestelmän tekemisestä kun netistä löytyy kiljoonittain parempia oppaita englanniksi.
Jos joku ei sen vertaa osaa englantia että voisi kyseisiä oppaita lukea, voi kyseinen henkilö puolestani painua vittuun Internetistä.
Niin, mitä järkeä onkin tehdä jotain, jonka joku muu on tehnyt? Tällä ajattelutavalla mm. Kaikki pong-kloonit ovat täysin turhia. Älä unohda, että kaikella tiedolla on itseisarvo.
Kaikki pong-kloonit ovat täysin turhia.

Re: Oman "käyttöjärjestelmän" tekeminen

Posted: Thu Nov 08, 2012 12:35 pm
by naputtelija
Ovat ne sinulle. Niiden tekijöille ei välttämättä. Tämänkin oppaan kirjoittamisesta opin paljon, ja olen varma että jokin muukin oppi. Levitin siis tietoa. Mitä väärää tässä sitten on??

Re: Oman "käyttöjärjestelmän" tekeminen

Posted: Thu Nov 08, 2012 1:48 pm
by ItzRaines
Taidanpa jopa odottaa, että opas valmistuu kokonaisuudeksi.
On muuten taas todella kypsää käytöstä täällä. :shock:

Re: Oman "käyttöjärjestelmän" tekeminen

Posted: Thu Nov 08, 2012 4:02 pm
by Awaclus
naputtelija wrote:Ovat ne sinulle. Niiden tekijöille ei välttämättä.
Ovat ne kyllä täysin turhia niiden tekijöillekin. Hyöty on tekemisprosessissa, yhdestäkään valmiista pong-kloonista ei ole ikinä ollut mitään hyötyä kenellekään.

Re: Oman "käyttöjärjestelmän" tekeminen

Posted: Thu Nov 08, 2012 4:48 pm
by legend
Awaclus wrote:
naputtelija wrote:Ovat ne sinulle. Niiden tekijöille ei välttämättä.
Ovat ne kyllä täysin turhia niiden tekijöillekin. Hyöty on tekemisprosessissa, yhdestäkään valmiista pong-kloonista ei ole ikinä ollut mitään hyötyä kenellekään.
Itse olen oppinut pong pelin pong-kloonista :D

Re: Oman "käyttöjärjestelmän" tekeminen

Posted: Fri Nov 09, 2012 1:34 am
by esa94
legend wrote:
Awaclus wrote:
naputtelija wrote:Ovat ne sinulle. Niiden tekijöille ei välttämättä.
Ovat ne kyllä täysin turhia niiden tekijöillekin. Hyöty on tekemisprosessissa, yhdestäkään valmiista pong-kloonista ei ole ikinä ollut mitään hyötyä kenellekään.
Itse olen oppinut pong pelin pong-kloonista :D
No ei kai kukaan olettanutkaan kenenkään yrittävän nykypäivänä Pong-konetta etsiä.

Re: Oman "käyttöjärjestelmän" tekeminen

Posted: Sat Nov 10, 2012 9:03 pm
by Pettis
Ei helvetti...

Tämä viestiketju ei käsittele sitä, että tuleeko tietyistä aiheista kirjoittaa suomeksi eikä sitä, että mitkä aiheet ovat turhia. Mielestäni keskustelu järkevistä asioista kielellä kuin kielellä ei ole turhaa. Turhuudesta valittaminen tässä viestiketjussa on turhaa - samoin offtopic liittyen johonkin pongiin.

Isken tässä moderaattorikortin tiskiin ja totean seuraavaa: offtopic, lapsellinen itku ja turha kitinä tässä viestiketjussa tulee aiheuttamaan mielivaltaisen suuruisia rangaistuksia riippumatta kohteen foorumirankista tai viestilaskurin poskettoman suuresta koosta.

Mikäli teillä ei ole mitään rakentavaa sanottavaa, niin jättäkää postaamatta.

Re: Oman "käyttöjärjestelmän" tekeminen

Posted: Wed Nov 28, 2012 10:34 pm
by skorpioni-cb
Autetaas vähän naputtelijaa hädässä ja ahdingossa, koska mulla on pikkusen kokemusta kerneleiden ja bootloadereiden kanssa.
tuo bootloader minkä naputtelija näytti oli ns. real modessa, josta esimerkkinä voisin sanoa M$-DOS

Protected modeen pääsee vaihtamalla yhden bitin, lisää tietoa sivulla wiki.osdev.org täällä kaikki käyttöjärjestelmän tekoon on listattu selkeästi, ja niin että saat käyttää omia aivojasi:
anyways ;D

sä käytät BIOSsin keskeytystä 13h, h tuossa tarkoittaa heksadesimaalia, eli toi 13h olisi javassa ja muissa c-sukuisissa kielissä 0x13
kutsut tuota keskeytystä laittamalla koodiisi

Code: Select all

int 13h
jossa int ei ole integer vaan interrup
mutta ei tuossa kaikki, sinun täytyy laittaa kasa parametreja eri rekistereihin, en viitsi luetella niitä kaikkia koska menisi varmaan merkkirajan yli, mutta tässä on kaikki tarvittava: http://en.wikipedia.org/wiki/INT_13H#Li ... h_services

Re: Oman "käyttöjärjestelmän" tekeminen

Posted: Sat Dec 08, 2012 8:11 pm
by esa94
Eihän sitä nyt hullukaan ala suoraan protected modessa ohjelmoida.

Siihen on ihan syynsä että x86-assemblyn oppaat aloittavat real modesta; muutamina voidaan mainita esimerkiksi laitteistokeskeytyksien käyttömahdollisuus. I/O-ajureiden kirjoittaminen ei varmaankaan ole monellekaan ohjelmoitsijalle niin yksinkertaista että sitä kannattaisi pitää lähtökohtana, ja ellei sitten halua vaihtoehtoisena keinona opetella hyppimään protected moden ja real moden välillä, taitaa se olla ainoa tapa lukea näppäimistösyötettä.

Jos tietenkin ohjelma itsessään sisältää koko oman datasarjansa niin mikäs siinä, mutta ymmärrykseni oli että tässä pyrittiin rakentamaan käyttäjäinteraktiivista järjestelmää.

--

Dollarimerkit taasen ei ollu hauskoja ees 90-luvulla.