Moi!
Olen väsännyt pienen C-käyttöjärjestelmän (tällä hetkellä 4 filua). Milläs tavalla tuon saa käännettyä? Sain jonkin bin-höskän mutta sehän on tietenkin linux-ohjelma. Millä tavalla esim. make-ohjelma kääntää Linuxin ytimen? Sain kuitenkin objektitiedoston koodista.
Ymmärrän mitä koodini tekee ja tällä hetkellä koko höskän pitäisi tulostaa joku "Loading"-teksti ja "Error", ja sitten hangata (tyhjäkäynti).
Itse olen ymmärtänyt, että esim. Linuxin starttikoodi on jossain c-filussa (komentorivillä linuxin sourcefolderissa "whereis main.c":llä saa selville), ja siellä on vain kasa voideja, jotka starttaa systeemin.
Käytän käynnistyslataimena GRUBia.
Ymmärsinkö oikein että olet itse ohjelmoinut c-kielisen käyttöjärjestelmän, mutta et ole koskaan kääntänyt sitä?
Make-ohjelma ei käännä ohjelmakoodia vaan käyttää siihen erillistä kääntäjää. C:lle tällainen on esim. gcc ja sitä voi käyttää ilmankin make-ohjelmaa.
No siis olen kääntänyt ja saanut linux-binäärin, mutta sitähän ei voi suorittaa suoraan (se vaatii sen linuxin). gcc:llä olen tehnyt objektitiedostot, mutta en osaa linkittää niitä binääriksi. Makella olen pari kertaa Linuxinkin (3.2.1-version) konffannut ja kääntänyt. Ilmeisesti moduulit eivät asentuneet, koska se herjasi Kernel Panic:ia heti alussa. Tietysti parametrit olivat myös väärät.
Palaan tänne illemmalla, koittakaa vastailla! :D
Voisitko laittaa koodit ja makefilen jonnekkin saataville? Sattaisin saada selville ongelman.
Uskallan epäillä, että tässä "käyttöjärjestelmässä" ei ole mitään järkeä. Jos et osaa kääntää ja ladata sitä (tai selvittää asiaa netistä), tuskin olet myöskään perehtynyt asioihin muuten tarpeeksi, että osaisit tehdä käyttöjärjestelmän edes alkuun. Alku on nimittäin se osa, joka on vaikein keksiä tyhjästä itse.
Katso mallia vaikka PutkaOS:n tiedostoista. Ydin voi olla tavallinen ELF-tiedosto, jossa on kelvollinen multiboot-otsikko, jolloin GRUB pystyy lataamaan sen.
Toinen vaihtoehto on tallentaa koodi suoraan levyn (mielellään tietysti virtuaalikoneen levykuvan) ensimmäiselle sektorille, nimittäin BIOS aloittaa käynnistyksen lataamalla ajettavaksi tuon yhden sektorin (512 tavua). Tämä on vaikeampi lähestymistapa, koska ensimmäiseksi täytyy osata itse ladata loput käyttöjärjestelmästä.
Metabolix kirjoitti:
Uskallan epäillä, että tässä "käyttöjärjestelmässä" ei ole mitään järkeä.
No paremmin sanottuna se on boottihärpäke. :)
Olen perehtynyt juuri näihin laitteisto- ja käyttöjärjestelmäasioihin aika hyvin. Tässä se ongelma on juuri siinä, kun en vain osaa tehdä ytimestä kunnon binarya.
Tuosta PutkaOSin lähdekoodista sainkin idean tuohon start- ja main-höskään.
EDIT:
nörtti kirjoitti:
Voisitko laittaa koodit ja makefilen jonnekkin saataville? Sattaisin saada selville ongelman.
Ei ole makefileä. Pitääpi heti värkätä kunnollinen systeemi.
Jos kiinnostaa tehdä "boottihärpäke" eli boot loader, ei varmaan kannata puhua ollenkaan käyttöjärjestelmästä.
Ei bootloaderkaan. Ehkä paremminkin se käyttöjärjestelmä. Mutta ei siitä suurikokoinen tule.
Jos joku antaa ohjeet kääntämiseen, niin saisin projektiani eteenpäin. Itse en ole Linuxin käännösjutskiin perehtynyt paljoakaan, pari C-ohjelmaa olen gcc:llä kääntänyt.
Lataa ja pura tämä pieni esimerkki. Mene kyseiseen hakemistoon ja kirjoita komento make. Asenna testausta varten QEMU ja käynnistä ydin komennolla qemu-system-i386 -kernel kernel tai vastaavalla. Kun saat tämän toimimaan, voit yrittää lisätä mukaan omia koodejasi hakemistoon src.
Pukkas erroria, mutta sain siitä jokseenkin toimivan. QEMUa en asentanut. Kopsasin Makefilun ja linkkeriskriptin, ja muoksin niitä omiin tarpeisiini sopivaksi. Suurkiitos!
EDIT: Nyt kun minulla on kaksi eri hakemistoa, missä on koodeja, niin haluaisin tehdä rekursiivisen makefilun joka siis käy kaikki hakemistotkin läpi. Mitenköhän tuon voisi jollain for-loopilla toteuttaa? En löytänyt Googlellakaan paljoa apua.
ErroR++ kirjoitti:
QEMUa en asentanut.
Kai sentään käytät jotain muuta emulaattoria, vai tuhlaatko todella aikaasi jonkin oikean koneen käynnistelyyn?
ErroR++ kirjoitti:
haluaisin tehdä rekursiivisen makefilun
Makefile on teknisesti hieman rajoittunut, mutta voit käyttää useampaa wildcard-kutsua tai ulkoista find-ohjelmaa:
FILES_C := $(wildcard src/*.c) $(wildcard src/*/*.c) $(wildcard src/*/*/*.c) FILES_C := $(shell find src -name "*.c")
ErroR++ kirjoitti:
Ei bootloaderkaan. Ehkä paremminkin se käyttöjärjestelmä. Mutta ei siitä suurikokoinen tule.
Jos joku antaa ohjeet kääntämiseen, niin saisin projektiani eteenpäin. Itse en ole Linuxin käännösjutskiin perehtynyt paljoakaan, pari C-ohjelmaa olen gcc:llä kääntänyt.
"Pari ohjelmaa kääntänyt" ja oman käyttöjärjestelmän tekeminen (edes pelkkä hello world) ei oikeen sovi yhteen.
ErroR++ kirjoitti:
Ei bootloaderkaan. Ehkä paremminkin se käyttöjärjestelmä. Mutta ei siitä suurikokoinen tule.
Jos joku antaa ohjeet kääntämiseen, niin saisin projektiani eteenpäin. Itse en ole Linuxin käännösjutskiin perehtynyt paljoakaan, pari C-ohjelmaa olen gcc:llä kääntänyt.
http://wiki.osdev.org/Introduction
http://wiki.osdev.org/Required_Knowledge
http://wiki.osdev.org/Beginner_Mistakes
http://wiki.osdev.org/Getting_Started
http://wiki.osdev.org/How_To_Ask_Questions
http://wiki.osdev.org/Category:FAQ
Lue nuo ja viisastu. Tule vasta sen jälkeen kyselemään udestaan.
Metabolix kirjoitti:
Makefile on teknisesti hieman rajoittunut, mutta voit käyttää useampaa wildcard-kutsua tai ulkoista find-ohjelmaa: ...
Kiitos taas!
nörtti kirjoitti:
(linkkejä)
Lue nuo ja viisastu. Tule vasta sen jälkeen kyselemään udestaan.
Vain viimeisestä linkistäsi oli jonkin verran apua. Suurimman osan muista olen jo jostain lukenut.
John Woodenin sanoin "Never mistake activity for achievement". Kannattaa lukemisen ohessa panostaa myös ymmärtämiseen ja testailuun. Käyttöjärjestelmäprojekti voi kuulostaa hienolta ja hurjalta, mutta siitä ei saa juuri mitään irti ellei ymmärrä mitä on tekemässä ja miksi.
Niin juuri. Opettelen ja yritän ymmärtääkin koko ajan. Kiitos vinkeistä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.