Aloittaminen
On 2 lokakuun, 2021 by adminEnsinnäkin käyttöjärjestelmän kehittäminen on luultavasti yksi haastavimmista asioista, joita voit tehdä tietokoneella (Doomin loppupomon tappamisen jälkeen Nightmare-vaikeustasolla). Käyttöjärjestelmän laatiminen vaatii paljon tietoa useista monimutkaisista tietotekniikan osa-alueista. Sinun on ymmärrettävä, miten laitteisto toimii, ja sinun on osattava lukea ja kirjoittaa monimutkaista assemblerikieltä sekä korkeamman tason kieltä (kuten C, C++ tai Pascal). Mielesi on kyettävä kietoutumaan abstraktien teorioiden ympärille ja hallitsemaan lukemattomia ajatuksia. Oletko vielä lannistunut? Älä pelkää! Sillä kaikki nämä asiat ovat myös asioita, jotka tekevät käyttöjärjestelmäohjelmoinnista hauskaa ja viihdyttävää.
Mikään ei voita saavutuksen tunnetta, kun vihdoin, tuntikausien ponnistelun jälkeen, ratkaiset ongelman. Ja jonkin ajan kuluttua voit katsoa taaksepäin ja nähdä kaikki ne asiat, jotka olet luonut tyhjästä. Käsin kirjoittamasi järjestelmä pystyy käynnistymään, tekee taikoja laitteistoa vastaan ja antaa käyttäjälle käyttöliittymän ja ohjelmia, joilla leikkiä.
Käyttöjärjestelmää luodessa ei ole mitään absoluuttista polkua, jota on pakko kulkea. Kun olet saanut alkuperäisen järjestelmäsi toimimaan (ja teet sen etsimällä sopivia opetusohjelmia), voit valita polun, jota haluat kulkea seuraavaksi. Käyttöjärjestelmäsi on juuri sitä – sinun. Sinulla on täysi kontrolli, ja taivas on rajana!
Sisältö
- 1 Kova totuus
- 2 Vastuu
- 3 Vaadittavat tiedot
- 4 Järjestä suunnitelmasi
- 5 Kehitysympäristön valinta
- 5.1 GNU/Linux
- 5.2 Windows
- 5.3 MacOS
- 6 Käyttöjärjestelmän testaaminen
- 7 Koodin suojaaminen
- 8 Yleiset lähtökohdat
- 9 Lisätiedon hankkiminen
- 10 Katso myös
- 10.1 Artikkeleja
- 10.2 Säikeet
- 10.3 Ulkoiset linkit
Kova totuus
Toivottavasti se perusasia, että käyttöjärjestelmien kehittäminen on monimutkainen ja jatkuva prosessi, ei lannista sinua. Totuus on, että käyttöjärjestelmäkehitys on todella vertaansa vailla, koska se vaatii äärimmäisen paljon kärsivällisyyttä ja huolellista koodin suunnittelua, ja se palauttaa hyvin vähän tai ei lainkaan ”välitöntä tyydytystä”, jota saat esimerkiksi pelien ja web-pohjaisten komentosarjojen kehittämisestä.
Sinua on varoitettu melkoisesti edessä olevasta kovasta työstä, mutta jos olet edelleen kiinnostunut, niin jatka eteenpäin käyttöjärjestelmäohjelmoijan valtakuntaan. Varaudu ajoittaiseen hämmennykseen, lannistumiseen ja joillekin meistä… tilapäiseen hulluuteen. Ajan myötä ja riittävällä omistautumisella löydät itsesi niiden harvojen eliitin joukosta, jotka ovat osallistuneet toimivan käyttöjärjestelmän kehittämiseen. Jos lannistut matkan varrella, virkistäydy tämän kirjan sisällön avulla. Toivottavasti se muistuttaa sinua siitä, miksi ylipäätään aloitit näin mielettömän matkan.
Tässä vaiheessa kannattaa lukea myös Aloittelijan virheet -sivu. Foorumin käyttäjät ovat huomanneet, että monet näistä virheistä toistuvat ajan mittaan, ja niiden välttäminen on hyvä tapa olla tekemättä itsestäsi hölmöä.
Vastuu
Väitetään usein, että on ihan ok kirjoittaa tehottomia ohjelmistoja, ja väitetään, että tietokonejärjestelmät ovat nykyään niin nopeita, että niiden vaikutusta ei huomaa. Tällainen ajattelutapa on vaarallinen käyttöjärjestelmien suunnittelussa. Saattaa olla OK kirjoittaa huolimatonta koodia, kun tehdään yksinkertaista sovellusta, mutta kun on kyse kriittisestä koodista, jota saatetaan kutsua tuhansia kertoja sekunnissa, on poistettava kaikki mahdollinen yleiskustannus. Käyttöjärjestelmän pitäisi tarjota tietokoneen perusresurssi käynnissä oleville sovelluksille mahdollisimman vähällä komplikaatiolla, abstraktiolla ja ylikuormituksella.
Tänä päivänä käyttöjärjestelmiä suunnittelevilla ihmisillä on taipumus omaksua ”kaikki paitsi tiskiallas” -mentaliteetti. He ottavat asiakseen ottaa kaiken huomioon, mikä on tietysti hyvä asia, mutta sitä ei pitäisi tehdä sen kustannuksella, että huonosti kirjoitetut ohjelmat pääsevät kukoistamaan. On monia asioita, jotka tapahtuvat ”konepellin alla”, kun ohjelmavirheitä ilmenee. Huonosti kirjoitetut ohjelmat maksavat arvokasta suoritusaikaa ja sisältävät tehtävävaihdoksia, jotka ovat kalliita sekä muistin että taajuuden kannalta. Kannustamme sinua ehkäisemään huonosti kirjoitettuja ohjelmia.
Vaadittavat tiedot
Pääartikkeli: Vaadittava tietämys
Jos luulet voivasi ohittaa tämän, tämä on juuri sinua varten.
Tämä osio on siirretty erilliselle sivulle, koska siihen viitataan niin usein foorumikeskusteluissa.
Järjestä suunnitelmasi
Ennen kuin jatkat, mieti, mitä haluat saada irti käyttöjärjestelmän kirjoittamisesta. Mitkä ovat motiivisi ryhtyä tähän projektiin? On monia mahdollisia syitä ryhtyä harrastuskäyttöjärjestelmäprojektiin, ja useimmilla os-kehittäjillä on useampi kuin yksi. Jo pelkkä toteamus ”haluan vain” voi riittää, mutta mitä enemmän pohdit ja selkiytät tavoitteitasi ja motiivejasi, sitä paremmin voit keskittyä siihen, mitä todella haluat.
Ole rehellinen myös itsellesi. Ei ole häpeällistä, jos sinulla on suurempia tavoitteita projektillesi, vaikka (tai varsinkin) jos ne eivät olisikaan ensisijainen tavoite. Yritä tunnustaa kaikki tavoitteesi, etkä vain sitä, jonka luulet olevan päätavoitteesi.
Yritä asettua siihen, mitkä käyttöjärjestelmäsuunnittelun osa-alueet kiinnostavat sinua eniten tai joiden parissa näet tarvetta työskennellä. Suurin osa käyttöjärjestelmän kehittämisestä, varsinkin alkuvaiheessa, on ytimen suunnittelua ja kehittämistä, mutta itse ydin on vain pieni osa useimmista käyttöjärjestelmistä; jos ensisijainen kiinnostuksesi kohdistuu käyttöliittymään, verkostoitumiseen tai ajurien ohjelmointiin, sinun pitäisi miettiä, onko sinun todella tarpeen (nyt tai tulevaisuudessa) kirjoittaa omaa käyttöjärjestelmääsi lainkaan vai olisitko yhtä tyytyväinen, jos kehittäisit noita asioita jo olemassa olevan ytimen pohjalta. Useammat kuin muutamat ihmiset ovat ryhtyneet kehittämään käyttöjärjestelmää, vaikka he ovat oikeasti halunneet suunnitella työpöytäympäristön, joten tämä on erittäin tärkeä kysymys, joka kannattaa kysyä itseltään.
Yritä miettiä, mitä muita kuin käyttöjärjestelmäprojekteja haluaisit tehdä ensin tai samaan aikaan, erityisesti sellaisia, jotka voisivat toimia harjoitteluna tai valmistautumisena käyttöjärjestelmäprojektiin. Yleensä ei ole tarvetta työskennellä käyttöjärjestelmäprojektin parissa juuri nyt, ja mitä enemmän olet valmistautunut etukäteen, sitä paremmin pärjäät (ainakin tiettyyn pisteeseen asti – valmistautuminen on yksi asia, vitkuttelu on jotain muuta).
Samoin, jos tarkoituksesi on työskennellä olemassa olevan mallin haarauttamiseksi kokeilua varten tai muokkaamiseksi johonkin tiettyyn tarkoitukseen, keskity siihen pikemminkin kuin yleisiin kehityskysymyksiin. Mieti, mitä osaa olemassa olevasta koodipohjasta tarvitset ja mitä haluat muuttaa.
Yritä hahmottaa joitain erityisiä projektisi tavoitteita ja ole valmis suunnittelemaan erillisiä projekteja, jos siitä on apua. Jos aiot vain pähkäillä ja katsoa, mihin se johtaa, se on hienoa; jos tarkoituksesi on kaataa Microsoft, sekin on hienoa (joskin luultavasti epärealistista). Kun tiedät, mitä haluat tehdä, voit pilkkoa sen yksityiskohdat konkreettisiksi tavoitteiksi ja selvittää, mitä niiden saavuttaminen vaatisi. Älä yritä pakottaa liian monia toisistaan poikkeavia tavoitteita yhteen projektiin – jos sinulla on eri asioita, joita haluat kokeilla ja joilla on keskenään ristiriitaiset tavoitteet, jaa ne eri projekteihin.
Voi auttaa, jos kirjoitat yleiskatsauksen suunnitellusta käyttöjärjestelmäsuunnittelustasi, johon on liitetty kaikki erityiset vaatimukset tai yksityiskohdat, jotka ovat mielestäsi huomionarvoisia tai jotka voisivat selventää sitä, mihin tarvitset apua, ja lisäät sen julkiseen arkistoosi, jos voit. Tämä ei ainoastaan helpota muiden auttamista, vaan auttaa myös organisoimaan ja vakiinnuttamaan suunnitelmasi, aivan kuin kirjoittaisit hahmotelman tarinaa tai paperia varten. Varaudu ylläpitämään sitä tavoitteidesi ja suunnitelmiesi muuttuessa, mutta säilytä kopio vanhemmista versioista (tai vielä parempi, pidä dokumentti versionhallinnan alaisena), jotta näet, miten työsi kehittyy ajan mittaan.
Katsele lopuksi aikaa ja resursseja, joita projekti vaatii, ja päätä, ovatko ne toteutettavissa. Jos tiedät, että sinulla on vain tietty määrä aikaa käytettävänäsi projektiin, ota se huomioon, ja mitä ikinä teetkin, älä sitoudu ulkopuoliseen määräaikaan, vaikka olisit varma, että pystyt saavuttamaan sen. Käyttöjärjestelmän kehittäminen vie aikaa – paljon aikaa – ja se, että yrität saada kokonaisen käyttöjärjestelmäprojektin valmiiksi lukukaudessa, ei ole realistista.
Kehitysympäristön valinta
Tarvitset alustan, jolle kehität uutta järjestelmääsi. Yleisen tietojenkäsittelyn trendien mukaisesti suosituin on GNU/Linux, mutta monet käyttävät myös Windowsia. GNU/Linux-järjestelmää käyttävillä kehittäjillä on pieni etu työkalujen saatavuudessa, mutta tämä voidaan ratkaista Windowsissa käyttämällä esimerkiksi Cygwin- tai MinGW-järjestelmää.
- Binutils: Perustyökalut objektitiedostojen käsittelyyn.
- GCC: GNU Compiler Collection. GCC sisältää kääntäjät muun muassa C:lle, C++:lle, Fortranille ja Adalle.
- Make: Rakennusprosessin automatisointiin, josta tulee todella hyödyllistä, kun tiedostoja on enemmän kuin kourallinen.
- Grep ja sed: Tehokkaampien hakujen ja haku-ja-korvaushakujen tekemiseen (hyödyllisiä, kun täytät taulukoita tiedoilla).
- Diffutils: Uskomattoman hyödyllinen kahden tiedoston välisten erojen näyttämiseen.
- Perl tai Python: Toinen näistä kahdesta skriptikielestä tulisi olla asennettuna. Hyödyllisiä muun muassa merkkijonojen käsittelyyn. Perl oli ennen suositus, mutta Python on nyt melko kypsä ja mahdollisesti helpompi oppia. Molemmissa on saatavilla satoja paketteja/moduuleja erilaisten tehtävien suorittamiseen.
- Assembler: Esimerkiksi NASM tai GAS. Tämä vaihtelee kohdesuorittimen arkkitehtuurin mukaan.
- Editori: Assembly-, C- ja muiden (koodi)tiedostojen kirjoittamiseen.
Et ehkä käytä kaikkia näitä työkaluja, mutta on parasta, että sinulla on ne käsillä ”kaiken varalta” ja että osaat käyttää niitä edes perustasolla. Mutta jos päätät käyttää toista kieltä, niin työkalut ovat suurimmaksi osaksi sinusta itsestäsi kiinni, ja ehkä yllä oleva lista ei vain auta sinua millään tavalla. Alla on lähinnä C/C++- tai Assembly-kehittäjille suunnattua tietoa.
GNU/Linux
Käyttöjärjestelmäkehitykseen suositeltavin järjestelmä on GNU/Linux. GNU/Linuxia käytettäessä useimmat GNU-kehitystyökalut ovat todennäköisesti jo olemassa. Jos näin ei ole, käytä jakelusi paketinhallintatyökaluja (APT, RPM, Portage, Pacman, Apk jne.) asentaaksesi ne tarpeen mukaan. Jälleen kerran ristiinkääntäjän tekeminen on tarpeen, jotta kehitysjärjestelmän ajotiedostoja ei linkitetä sisään.
Yleisiä editoreita ovat Vim, Emacs, KDevelop, Komodo Edit jne. Jotkut suosivat kevyitä editoreita IDE:n sijaan, kuten gedit, Geany ja SciTE. Monet pitävät Midnight Commanderista, jossa on teksti-käyttöliittymä ja sisäänrakennettu editori (mcedit) ja joka on siksi erittäin kevyt ja salamannopea.
Mitä jakeluita kannattaa käyttää, selviää Linux-jakeluiden luettelosta. Niitä tuli joka muotoa ja kokoa, eivätkä kaikki sovellu ytimen kehittämiseen. Älä käytä distroa, jolla on tietty tavoite, kuten tietoturva (Kali, Qubes, BackTrack, Parrot jne.), tiedesovellukset (esim. Scientific), palomuurit ja reititys (esim. DD-WRT), järjestelmän palautus tai sulautetut ympäristöt (Knoppix, Rescatux, TinyCore) tai nimenomaan aloittelijoille suunnattu (kuten Linux Mint, Nitrux jne.) Vaikka aloittelijoille ystävällinen Linux voisikin kelvata, kannattaa valita yleiskäyttöinen distro. Käytä myös distroa, jossa on ajantasaiset paketit, parasta valita sellainen, joka käyttää rolling-releasea. Debiania on helppo käyttää, mutta siitä toimitetaan usein vanhoja ja korjattuja versioita (työkalut eivät välttämättä käyttäydy kuvatulla tavalla). Monet aloittelijat pitävät Ubuntusta, mikä on hyvä, mutta sillä on raportoitu olevan ongelmia joidenkin työkaluketjujen ja kääntämisympäristöjen kanssa (jos käännät oman ristiinkääntäjän asennetun sijasta, tämä ei ole ongelma).
Parhaat distrot ytimen kehittämiseen ovat (mutta pidä mielessä, että tämä on myös henkilökohtaisen maun asia, joten näitä distroja ei vaadita, pikemminkin ehdotetaan, ja ne vaativat yleensä jonkin verran kokemusta): Arch, Gentoo, Solus, Slackware, void jne. jopa Puppy.
Jos olet epävarma, kokeile Ubuntua tai Manjaroa.
Windows
Tarvittavien työkalujen saamiseksi kannattaa asentaa Cygwin-ympäristö. MinGW tai DJGPP ovat vaihtoehtoja, mutta MSYS2:ta suositellaan vahvasti, koska se on täydellisin ja yhteensopivin ympäristö ja sisältää myös pakettihallinnan kirjastojen ja työkalujen asentamiseen.
Microsoft on hiljattain (tätä kirjoitettaessa) julkaissut Windows Subsystem for Linuxin valinnaisena ominaisuutena Windows 10:een. Se on periaatteessa oikea Ubuntu-komentorivijakelu, joka toimii Windowsin päällä ILMAN VM:n käyttöä. Uusimmat GCC ja Binutils (6.1.0 ja 2.27 tätä kirjoitettaessa) kääntyvät ja toimivat oikein tässä ympäristössä. Käyttämällä Bash-kuorta pääset käsiksi Windowsin kiintolevyihin /mnt/<drive letter> kautta. Tämän ratkaisun etuna on, että voit työskennellä haluamillasi Windows- tai Linux-työkaluilla ilman, että sinun tarvitsee selvittää, toimivatko ne Cygwinissä. Monet tarvittavista työkaluista voidaan asentaa ”apt-get”-ohjelmalla.
Kaikkiin edellä mainittuihin suositellaan vahvasti ristiinkääntäjän rakentamista, ei vain siksi, että oletuskääntäjät kohdistuvat erilaisiin suoritettaviin tiedostomuotoihin, vaan myös siksi, että se on yleensä hyvä idea. Katso lisätietoja ja ohjeita GCC Cross-Compiler -sivulta.
Tarvitset myös editorin. Notepadin käyttäminen toimii, mutta on helpompaa, jos sinulla on kattavampi editori. Esimerkiksi Notepad++ tai Notepad2 ovat monien käytössä. Jos Unix-editorit ovat sinulle tuttuja, voit valita jonkin Cygwinin tarjoamasta valikoimasta (johon kuuluvat esimerkiksi Vim ja Emacs, jotka vaativat totuttelua, mutta ovat erittäin tehokkaita).
Käyttöjärjestelmän kirjoittamiseen ja kääntämiseen voi käyttää myös Visual Studiota tai vapaasti ladattavaa Visual C++ Express Editionia. Tarvitset erityisen konfiguraatiotiedoston, ja olet varmasti vähemmistössä, mutta se toimii melko hyvin. Voit jopa asentaa Windows SDK:n päälle, mikä mahdollistaa 64-bittisen kehityksen. Ainoa sudenkuoppa on se, että tämä ei tue Inline Assemblya.
Muitakin työkaluja, kuten Watcomia tai Borlandia voi käyttää, mutta niillä kaikilla on omat erityisvaatimuksensa, eikä niitä käytetä laajalti tämäntyyppiseen työhön.
MacOS
Mikäli se käyttää konepellin alla FreeBSD:n userlandia, se on täysin POSIX-yhteensopiva. Kaikki tavalliset työkalut ovat käytettävissä (vi, bash, dd, cat, sed, tar, cpio, jne.) Lähes kaikki opetusohjelmat toimivat valmiiksi. Puuttuvat työkalut liittyvät enimmäkseen tiedostojärjestelmään: ei loopback-laitetta, ei fdiskiä, ei mkfs.vfat:ia eikä mtools:ia. Mutta voit käyttää diskutiliä näihin tarkoituksiin, tai käyttää brew:tä tai macportsia asentaaksesi nuo puuttuvat työkalut.
Gcc:n saamiseksi sinulla oli ennen mpkg 2. Asennus-DVD:llä vanhemmille versioille. Uudemmat MacOS-versiot (10.13 ja uudemmat) voivat asentaa komentoriviltä XCoden (ei IDE:tä, vain toolchainin) ajamalla ”xcode-select –install” terminaalista. Tämä asentaa gcc:n, binutilsin ja make:n. Tämä gcc on itse asiassa masquaraded CLang, mutta tarpeeksi monipuolinen, jotta voit rakentaa oman ristiinkääntäjän ongelmitta. On parempi käyttää virallista kääntäjää gcc:n käynnistämiseen kuin asentaa sellainen brew:stä tai macportsista.
Käyttöjärjestelmän testaaminen
Pääartikkeli: Testaus
Yllä olevassa artikkelissa käsitellään perusteellisesti käyttöjärjestelmän testaustavan valintaa ja sen integroimista kehitysprosessiin. Sekä fyysisiä että emuloituja testausympäristöjä käsitellään.
Koodisi suojaaminen
Koodin rakentamisen aikana kirjoitat satoja, jopa tuhansia rivejä koodia. Käytät sanoinkuvaamattoman määrän tunteja ja istut myöhään illalla koodaamassa, kun sinun pitäisi oikeastaan mennä nukkumaan. Viimeinen asia, mitä tarvitset, on levyn kaatuminen tai huonosti kirjoitettu ’rm’- tai ’format’-komento, joka heittää kaiken työsi hukkaan.
Mitä tarvitset, on versionhallintajärjestelmä. CVS:ää on käytetty useita vuosia, mutta se on viime aikoina saanut paljon kilpailua Subversionin, Bazaarin, Mercurialin ja Gitin taholta. Jos voit, sinun kannattaa perustaa etäkone tai -palvelin versionhallintapalvelimeksi, mutta jos sinulla ei ole tällaista konetta käytettävissäsi, voit myös isännöidä versionhallintajärjestelmää paikallisella kehitystietokoneellasi. Muista vain silloin tällöin varmuuskopioida koodisi CD:lle tai FTP:lle.
Emme voi painottaa tätä kohtaa tarpeeksi voimakkaasti: jos et vielä käytä lähdekoodinhallintaa, sinun pitäisi aloittaa se välittömästi. Sinun tarvitsee vain kerran tehdä vakava virhe koodissasi tajutaksesi, miten tärkeää on, että koodisi on turvallisesti versioitu ja helposti löydettävissä. Vaikka se saattaa tuntua ylivoimaiselta pienelle, yksityiselle harrasteprojektille, kun olet omaksunut tavaksi käyttää versiohallintaa, tulet ihmettelemään, miten ikinä pärjäsit ilman sitä.
Gitiä varten voit luoda projektisi GitHubiin. Bitbucket on myös hyvä vaihtoehto, sillä se tukee sekä Gitiä että Mercurialia. Molempien mukana tulee ilmaisia, yksityisiä arkistoja.
Ylimääräinen hyöty versiohallinnan käyttämisestä verkon kautta saavutettavassa arkistossa on se, että se tekee paljon helpommaksi tehdä yhteistyötä muiden kanssa ja saada apua muilta. Tämä voi olla varsin hyödyllistä erityisesti foorumeilla, sillä sen avulla voidaan välttää tarve lähettää jatkuvasti päivitettyjä versioita koodistasi viestiketjuun — osoitat vain keskustelun kohti arkistoasi, ja ketjun muut jäsenet pääsevät suoraan käsiksi uusimpiin muutoksiisi. Se on myös ratkaisevan tärkeää, jos projektin kasvaessa alat työskennellä projektissa muiden kehittäjien kanssa (älä vain odota, että se tapahtuu yhdessä yössä).
Yleiset lähtökohdat
Helpoin tapa saada ”hello world” -ydin käyntiin on Bare Bones -opetusohjelma. Toisenlainen lähestymistapa olisi opetella, miten itse tietokone käynnistyy, Boot Sequence -sivulla.
Myös monia muita opetusohjelmia on saatavilla.
Lisätiedon hankkiminen
Internetissä on nykyään saatavissa hämmästyttävä määrä tietoa käyttöjärjestelmien kehittämisestä. Se on vain löydettävä. Ensinnäkin on itse tämä wiki. Sieltä löytyy muun muassa paljon opetusohjelmia. Koska olet täällä, olet luultavasti jo löytänyt ne. Tällä sivustolla on myös foorumi, jossa monet kehittäjät hengailevat ja voivat auttaa sinua (mutta lue ensin How To Ask Questions). Käyttöjärjestelmien kehittämisestä on kirjoitettu melko paljon kirjoja. Useita niistä on esitelty Kirjat-sivullamme, ja lisää myös osoitteessa osdever.net.
Vastaa