Terve vaan kaikille...
Elikkäs, olisin kiinnostunut miten saisi C/C++:lla koodattua oman "käyttöjärjestelmän" boot loaderin. En ole tässä nyt mitään ihmeitä tekemässä, vaan ihan koe mielessä yrittämässä tehdä consoli pohjaista käyttöjärjestelmää.
Tutkiskelin jo Linux v0.01 eli ensimmäisen version boot loaderi kodia, mutta tämä oli kirjoitettu assemblyllä ja tästä kielestä en ole niin paljoo perillä kuin C/C++:ta.
Eli millä periaatteella tämä boottaaminen toimii. Eli mitä tietoja koneelle pitää antaa, että se osaa boottia minun kirjoittamani ohjelman.
Kuulostaa varsin mielenkiintoiselta.
Googlesta löysin äkkisilmäyksellä tämmöisen
Tuolta kannattanee vinkkiä katsella. Jotenkin olisi itsellä sellainen muistikuva, että bootloaderista se ensimmäiseksi suoritettava koodi on pakko kirjoittaa assemblyllä, koska C ei siihen taipuisi.
Suosittelisin kuitenkin katsomaana vaikka Grubia ja miten saat sillä boottaamaan käyttiksesi. Se hoitaa asiansa hyvin. Tietty tee itse tai katso koodia, jos haluat oppia kunnolla miten se bootloaderi toimii.
Yleisestihän boottaaminen toimii niin, että BIOS lukee bootattavalta laitteelta (cd-levy, kiintolevy, jne.) ensimmäiset 512 tavua ja rupeaa suorittamaan sitä. Tuossa sitten joko ladataan se ydin tai sitten loput bootloaderista (näin Grub tekee), joka sitten myöhemmin sen ytimen lataa. Kovin monimutkaista tai osaavaa bootloaderiahan tuohon 512 tavuun ei saa mahtumaan.
Näin vinkkinä, että kannattaa sitä assemblyä opetella, siitä on hyötyä. Tuut tartteen sitä myöhemmin, jos kerta käyttiksen aiot tehdä.
Kiitos paljon teille... Olen jo päässyt himen liikeellekin, eli saan jo bootattua tekemäni C kernelin ja tyhjennettyä ruudun ja tulostettua dataa ruutuun. Ajattelin tosin, että voisin tähän väliin opetella sitä Assemblyä, joten lainasin kirjastosta Assemblyä käsittelevän kirjan. Tosin kirja käsittelee Microsoftan Macro Assemblyä eli MASMia ja kirja on muutenki aika vanha (vuodelta 99).
Eihän se tieto siitä mihinkään muutua (tietääkseni), mutta kyllähän on paljon uutta varmaan tuohon MASM:iinkin tullut. Minua vain kiinostaisi, että onko MASM:i miten hyvä vaihto etho jos väsää omaa ns. OS:ää ja onnistuuko tuon MASM:in kääntö Linux:ta käsin esim GCC:n avulla???
Aijai :( En kyllä MASMia suosittelisi, jos tarkoituksesi on koodailla käyttiksiä ja käytät vieläpä linuxia. MASM on pääasiassa suunnattu korkeamman tason hommiin, kuten Win32-sovellusten koodaamiseen, vaikka ehkä muuhun taipuukin. MASMia ei myöskään taida saada linuxille, ellei sitten winen kanssa säädä. Suosittelin että käyttäisit mielummin FASMia tai NASMia, joista NASM lienee mukavampi linuxistille ja pienellä tuurilla se voi löytyä vieläpä valmiiksi koneelta (whereis nasm
)
x86 assembly ei ole mihinkään vuosien saatossa muuttunut, mutta jos luet MASM-kirjaasi niin pidä mielessä että MASMin syntaksi (?) on vähän harhaanjohtava ja poikkeaa muista assemblereista. Ottaen nyt esimerkiksi MASMin tapa käsitellä hakasulkeita, kun ne voidaan välillä jättää pois miten sattuu ja taas välillä niitä ei tahdo saada toimimaan ollenkaan.
dwMuuttuja DWORD 123 labeli: ; Viitataan muistiin ilman []-merkkejä mov eax, dwMuuttuja -> MOV EAX,DWORD PTR DS:[404000] ; Ja nyt se labelin kanssa ei onnistu mov eax, labeli -> MOV EAX,401000 ; Ei vaikka yrittäisi mov eax, [labeli] -> MOV EAX,401000 ; Väännetään rautalangasta sitten mov eax, dword ptr ds:[labeli] -> MOV EAX,DWORD PTR DS:[401000]
Makuasioita ehkäpä (epäloogista ja sekavaa IMHO)
Joo niin ajattelinkin, että se ei sovellu. Harmi kun kirjastossa ei ollut yhtään NASMI:ta kervoaa kijraa. Olisiko jollai ntiedossa jotain hyvää netistä löytyvää NASMi opasta?
http://www.drpaulcarter.com/pcasm/
Katseleppa tuolta lyötyvää opasta, pätevältä vaikuttaisi assemblyn opiskeluun. Ainakin joku esimerkki mitä vilkaisin, niin kääntyi kuulemma NASM:lla. Lueppa sieltä, että saat selville ne assemblyn perusjutut. Assemblyhän on hyvin yksinkertaista.
Sitten, kun perusjutut ja tiedot on hallussa, niin kattele vaikka jostain listaus x86-käskykannasta ja siitä, mitä kukin käsky tekee. Ei tarvitse opetella jokaista ulkoa, mutta saat kuvan millaisia käskyjä on käytössä.
Sitten vielä kaveriksi NASM:n dokumentaatio, että josta voi tarvittaessa katsoa apua NASM:n käyttöön ja syntaksiin. En tiedä miten hyvin tuo tarjoamani opas kattaa sen käytön.
Ja käyttistä tehdessä ainakin Intel Developer Manual -sarja on hyvää luettavaa, jos ei tietämystä sen prosessorin sielunelämästä vielä löydy. Suosittelen tutustumaan, jos et vielä ole tehnyt.
Tietty NASM:lle pitää vielä vaihtoehtona mainita Gas (GNU Assembler). Syntaksi on AT&T kun NASM käyttää Intel -syntaksia. Eroja on jonkun verran. Makuasioita kummasta sitten tykkää enemmän.
x86-assemblysta tarvitsee käytännössä tietää sen verran, että on perillä eri rekistereistä ja osaa käyttää yhteen- ja vähennyslaskua ja loogisia operaatioita sekä siirrellä dataa muistin ja rekisterien välillä ja kutsua funktioita. Käytännössä kaiken mutkikkaamman laskennan voi hoitaa C:llä. Lisäksi täytyy osata käyttää muutamaa juuri kernelissä käytettävää käskyä (lgdt
yms.). C on niin paljon helpompi kieli, että kannattaa ehdottomasti käyttää sitä niin suurelta osin, kuin vain voi.
Tosiaan ehdottomasti kannattaa C:tä käyttää niin paljon kuin vain voi, kuten Metabolix mainitsi ja tekee sillä assemblyllä vain pakollisen. Sitten, jos välttämättä jossain kohti tarvitsee ne viimeisetkin teho puristaa irti, niin taas assembly käyttöön (jos C-kääntäjä ei samaan pysty). C -koodi on kuitenkin paljon helpommin ymmärrettävää kuin assembly.
Aihe on jo aika vanha, joten et voi enää vastata siihen.