Linux (ydin)
Linux on alun perin suomalaisen Linus Torvaldsin kehittämä käyttöjärjestelmäydin, joka on lisensoitu GPLv2-lisenssillä. Ydin eli kerneli () on tietokoneen käyttöjärjestelmän alin osa, joka mahdollistaa kaikkien muiden tietokoneen ohjelmien toiminnan. Torvalds julkaisi ensimmäisen Linuxin version vuonna 1991.
Arkikielessä Linuxilla tarkoitetaan usein kokonaista käyttöjärjestelmää, jonka ytimenä Linux toimii, eli Linux-jakelua, joka sisältää ytimen lisäksi muun muassa erilaisia kirjastoja, apuohjelmia, käyttöliittymiä ja sovelluksia valmiiksi paketoituna loppukäyttäjää varten.
Helsingin yliopistossa tietojenkäsittelytiedettä opiskellut Linus Torvalds aloitti Linuxin kehittämisen 21-vuotiaana vuonna 1990. Linux lähti liikkeelle töiden jakamisen () harjoitustyöstä, jota Torvalds kehitteli tehtävänantoa monipuolisemmaksi. Työstä kehkeytyi kokonaisen käyttöjärjestelmän toimintoja sisältävä ohjelma.
Torvalds oli tyytymätön MS-DOS-käyttöjärjestelmään, joka hyödynsi huonosti hänen vasta hankkimansa Intel 80386 -koneen ominaisuuksia. Häntä kiinnosti Unix, sillä se oli vakaa ja siinä oli sellaisia ominaisuuksia, joita hän halusi. Unix oli suosittu ja sitä pidettiin hakkerien keskuudessa ainoana oikeana käyttöjärjestelmänä. Se oli kuitenkin liian vaativa ja kallis PC-käyttöön. Unixin lähdekoodi ei myöskään ollut enää vapaasti saatavilla. Helsingin Yliopistolla Unix oli tuolloin otettu hiljattain käyttöön ja Torvalds oli käynyt C:tä ja Unixia käsittelevän kurssin.
Torvalds sai yliopistosta käsiinsä Andrew Tanenbaumin ohjelmoiman Minixin. Se oli PC:lle tarkoitettu, Unixia muistuttava käyttöjärjestelmä, joka oli suunniteltu opetuskäyttöön. Minixin lähdekoodi oli vapaasti kaikkien niiden saatavilla, jotka olivat ostaneet Tanenbaumin kirjan. Ohjelmoijat pystyivät näin opiskelemaan olemassa olevaa käyttöjärjestelmää ensimmäisen kerran sitten Unixin alkuaikojen.
Asennettuaan koneeseensa Minixin sekä Bruce Evansin siihen tekemät laajennokset, Torvalds totesi, että siinäkin oli paljon puutteita. Se kuitenkin mahdollisti ja inspiroi Linuxin ohjelmoinnin aloittamisen. Aluksi Torvalds lähti tekemään vain terminaali-emulaattoria, joka toimi suoraan hardwaressa käyttöjärjestelmän ohittaen. Projektit kuitenkin laajenivat koko käyttöjärjestelmän ytimen luomiseen tähtääväksi.
Vähitellen hän kokosi konekielellä ja C-ohjelmointikielellä käyttöjärjestelmän ytimen. Työ eteni hitaasti eikä hän kertonut hankkeestaan vielä muille. Torvaldsin alkuperäisenä tarkoituksena ei ollut luoda käyttöjärjestelmää koko maailmalle, vaan ainoastaan omiin tarpeisiinsa. Jos hän olisi jatkanut yksin, Linuxia olisi tuskin julkaistu, sillä sen kehittäminen olisi pysähtynyt Torvaldsin omien tarpeiden täytyttyä. Torvalds julkisti projektinsa 25. elokuuta 1991 kirjoittamalla comp.os.minix-uutisryhmään, jota pidetään Linuxin syntymäpäivänä. Versio 0.01 valmistui 17. syyskuuta samana vuotena, joka oli ensimmäinen lähdekoodijulkaisu. Torvalds oli itse tehnyt käännökset bash-komentorivitulkista ja GCC-kääntäjästä.
Kesän 1991 Torvalds vietti pääasiassa huoneeseensa sulkeutuneena, verhot ikkunoiden edessä ja kirjoittaen järjestelmäkutsuja (hänellä vieraili kuitenkin melkein viikottain jokin opiskelukavereistaan teellä). Torvalds ei ollut saanut käsiinsä varsinaisia Posix-määritelmiä sisältäviä kirjoja, mutta oli löytänyt materiaalit, joissa oli Sun OS:n (joka oli esim. Suomen armeijan koneissa usein käytetty Unixin versio) systeemikutsut. Hän kirjoitti omaa kerneliään katsoen, mitä Sun OS:n systeemikutsut tekivät ja ohjelmoi vastaavat tehtävät suorittavat kutsut omaan kerneliinsä. Työ alkoi muuttua mukavammaksi siinä vaiheessa, kun komento-shelli alkoi toimia kernelissä ja Torvalds alkoi saada järjestelmältään selkeämmin palautetta siitä, mitä siitä puuttui. Tätä ennen hän joutui testaamaan laatimiaan kutsuja ikään kuin tyhjiössä. Myöhemmin Torvalds sai avukseen myös varsinaiset Posix-materiaalit, joita hän oli huhuillut uutisryhmissä.
Lokakuussa 1991 versio 0.02 oli valmis ja Torvalds päätti laittaa sen vapaasti kaikkien saataville. 5. lokakuuta Internetin keskusteluryhmään lähettämässään viestissä Torvalds kertoi lähdekoodin löytyvän FTP-palvelimen nic.funet.fi hakemistosta /pub/OS/Linux ja antoi ohjeita kääntämistä varten. Hän varoitti, että ohjelma oli hakkerilta hakkereille. Sen toimintakuntoon saattaminen saattoi siis vaatia hakkerin taitoja. Lisäksi hän rohkaisi muuttamaan ohjelmaa vapaasti ja toivoi kommentteja mahdollisista muiden Minixille kirjoittamista apuohjelmista ja funktioista. Toimiakseen Linux vaati vielä Minixin siinä koneessa, jossa sitä haluttiin käyttää. Myöhemmin samassa kuussa julkaistiin versio 0.03.
Alun perin Linus Torvalds oli suunnitellut antavansa ohjelmansa nimeksi Freax, joka olisi johdettu sanoista "free Unix" (vapaa Unix) tai "freaks" (omituiset, intoilijat, friikit). FTP-palvelimen ylläpitäjä Ari Lemmke ei kuitenkaan ollut pitänyt nimestä. Hän oli perustanut omalle xgw:n palvelimelleen Linux -nimisen käyttöalueen Torvaldsia varten. "Linux" -nimi oli ollut Torvaldsin aiempi nimiehdotus, jonka hän oli hylännyt, muttei enää vastustellut Lemmken päätöstä ottaa se käyttöön.
Palautetta ja virheraportteja tuli valtavasti. Internetin ja avoimesti saatavilla olleen lähdekoodin ansiosta ihmiset eri puolilla maailmaa pääsivät kehittämään Linuxia. Ytimen versio 0.10 julkaistiin marraskuun alussa 1991, jolloin käyttäjiä oli 10–20. 0.10 oli ensimmäinen versio, joka oli käyttökelpoinen ilman Minixiä, jolloin Linus päätti nostaa versionumeron suoraan 0.03:sta 0.10:iin. 8. joulukuuta 1991 julkaistu versio 0.11 oli jo täysin itsenäisesti käytettävissä: ydin voitiin kääntää Linuxissa itsessään. Version 0.12 yhteydessä Linus kertoi aikomuksesta käyttää GPL-lisenssiä.
Torvaldsin motivaatio työhön alkoi horjua vuoden 1991 lopussa, kun kernel oli saatu pyörimään ja edessä näytti olevan vain ikävämpää debuggausta. Lisää motivaatiota kuitenkin tuli kahdelta suunnalta. Ensinnäkin, ihmiset Internetin uutisryhmissä eivät jättäneet häntä rauhaan, vaan kysyivät innokaasti jatkokehittelyn perään. Toisekseen Torvalds tuhosi vahingossa koneensa kovalevyn Minix-osion, jolloin hänelle nousi mielenkiinto pyrkiä käyttämään sitä pelkän Linux-osionsa turvin. Ensimmäinen ulkopuolisen ihmisen pyynnöstä Linuxiin luotu toiminto oli vuoden 1991 joulupäivänä valmistunut mahdollisuus jatkaa keskusmuistia levymuistilla. Torvaldsin oma 386-kone (joka oli osista kasattu, merkitön) omasi neljä megaa muistia, mutta pienemmällä määrällä varustetut käyttäjät (erityisesti eräs saksalainen käyttäjä, joka alun perin teki asiasta pyynnön) olivat ongelmissa keskusmuistin vähyyden kanssa. Tämä ominaisuus oli vuoden 1992 alussa merkittävä ja toi osaltaan Linux-kernelille huomiota.
Kun versio 0.12 julkaistiin tammikuussa 1992, Linuxin parissa työskenteli aktiivisesti lähes kaksisataa ihmistä. Tuolloin ydin oli jo vakaa ja toimiva. Yhdessä GNU-hankkeen luomien työkalujen kanssa siitä oli rakennettavissa kokonainen käyttöjärjestelmä. Linux alkoi levitä nopeasti. Vuonna 1992 saatiin valmiiksi ensimmäinen graafisella käyttöliittymällä varustettu jakelu. Näihin aikoihin Linuxista kiinnostuttiin myös yliopistomaailman ulkopuolella.
Linuxin varhaiset versiot oli julkaistu Torvaldsin itse kirjoittamalla lisenssillä, joka ei sallinut ytimen levitystä rahaa vastaan. Linus ilmoitti version 0.12 julkistuksen yhteydessä siirtyvänsä käyttämään GNU GPL -lisenssiä 1. helmikuuta 1992 lähtien. Nykyinen lisenssi on GPL versio 2 ja Torvalds on sanonut vastustavansa siirtymistä versioon 3 sen lisäämien käyttörajoituksien vuoksi.
Torvalds on kuvaillut päätöstään julkaista Linux-ydin GPL-lisenssillä parhaaksi tekemäkseen asiaksi.
Ytimen julkaisun yhteydessä Torvalds ja Tanenbaum kävivät laajalti tunnetun debatin ytimen rakenteesta. Microsoftin palkkaama Ken Brown ajoi väitettä, jossa Torvalds olisi kopioinut Minixiä, mutta Tanenbaum on tyrmännyt tämän väitteen.
Torvalds johtaa edelleen Linuxin ohjelmointityötä. Linux on avoimen lähdekoodin ohjelmisto ja siihen voi kuka tahansa tehdä muutoksia. Mikäli haluaa omat muutoksensa Linuxin viralliseen versioon, ne tulee toimittaa Linux Kernel -postituslistalle, jolloin ohjelmakoodi kulkee Torvaldsin tai hänen luottohenkilöidensä kautta.
Ytimen kehitysprosessia käsitellään laajalti Eric S. Raymondin esseessä "The Cathedral and the Bazaar".
Ytimen version 2.6 kehityksen aikana Torvalds ja Andrew Morton yhdistivät ytimeen muutoksia 10 MB kuukaudessa. Versioon 4.11 otettiin mukaan 12 546 muutosjoukkoa ja ydin kasvoi lähes 300 000 rivillä ohjelmakoodia.
Kehitysprosessin ohjeet seuraavat ytimen lähdekoodien mukana ja sisältävät joukon esimerkkejä hyvistä ja huonoista kehitystavoista.
Kesällä 2015 ytimen versiossa 4.1 oli yli 19,5 miljoonaa lähdekoodiriviä.
Ydintä on aiemmin kehitetty parittomalla numerolla merkityssä versiohaarassa parillisten ollessa vakaita tuotantokäyttöön tarkoitettuja versioita (vrt. 2.2.x, 2.3.x, 2.4.x ja 2.5.x). Nykyisin seuraavaan versioon tulevat muutokset ovat "linux-next" nimisessä kehityshaarassa ja versionumeroinnin erityismerkityksestä on luovuttu. "Longterm support" (LTS) versioihin julkaistaan päivityksiä vielä uuden version jälkeen muutaman vuoden ajan.
Linux-ytimen uudelleenkehittämisen arvosta on esitetty useita arvioita: maaliskuussa 2011 sen arvioitiin olevan 3 miljardia Yhdysvaltain dollaria ja kasvavan.
Linux Foundationin julkaiseman raportin mukaan kehitykseen on osallistunut yli 13 500 kehittäjää yli 1 300 yrityksestä.
Ydin on toteutettu pääasiassa C-kielellä. Torvaldsin mukaan haastavat ongelmat ytimen kehityksessä eivät ratkea ohjelmointikieltä vaihtamalla. Haastavat ongelmat ovat tyypillisesti laitteistotuessa kuten laiteajurit ja alustakohtaiset erot. Eräät henkilöt ja projektit ovat pyrkineet kehittämään tukea C++:lla toteutetuille moduuleille mukaan lukien ajonaikaisen kirjaston, poikkeuskäsittelyn ja RTTI-tyyppimekanismin lisäämisen sekä pinon käsittelyn muutoksia. C++:n käytössä käyttöjärjestelmän ytimessä on ongelmakohtia, joita neuvotaan välttämään.
Linux-ydin tukee ladattavia moduuleja, joita käytetään muun muassa laiteajureille, tiedostojärjestelmätuelle, verkkoprotokollille, uusille järjestelmäkutsuille ja niin edelleen. Ladattavien moduulien tuki on ollut ytimessä versiosta 1.2 (1995) lähtien.
Suorittimet tukevat ytimen "kernel-mode" suoritustilassa erityiskomentoja ja sallii kaiken muistiavaruuden käytön. Käyttäjän "user-mode" tilassa muistialueet käskyt ovat rajatumpia. Suorituksen siirto käyttäjän ja ytimen tilojen välillä järjestelmäkutsujen yhteydessä kuluttaa huomattavasti aikaa. Ytimet, joissa kaikki ajurit ovat kiinteästi osana ydintä ilman ladattavia moduuleja, ovat monoliittisiä ytimiä.
Linux tukee moduulien kryptografista allekirjoittamista. Linux-ytimessä toiminnot voidaan jakaa kaikille moduuleille tai vain GPL-lisenssiä käyttäville moduuleille, jota voidaan käyttää tunnistamaan ytimestä riippuvan toiminnon käyttö ("derivative"). Suljetun lähdekoodin ("ei-GPL") moduulien lataaminen lisää "taint"-merkinnän, joka kertoo kehittäjille että mahdollisen vian tapahtuessa ongelman syy voi olla tuntemattomassa lähdekoodissa.
Koska ytimeen ladattavat moduulit toimivat ilman rajoituksia ytimen suoritustilassa niiden toteutuksessa on otettava huomioon samat seikat kuin muussa itse ytimessä olevaa ohjelmakoodiakin koskee.
Moduuleja voidaan debugata etänä toiselta koneelta muun muassa Eclipse-kehitysympäristössä.
Muita ladattavia moduuleja tukevia käyttöjärjestelmiä ovat esimerkiksi Solaris.
Käyttäjät voivat ladata ja poistaa moduuleja ajon aikana muun muassa codice_1 -komennolla. Moduulit voidaan kääntää ja ladata ytimeen ajonaikana ilman uudelleenkäynnistystä.
Esimerkki minimaalisesta moduulista, joka tulostaa viestin ytimen logiin:
Moduuli ei toteuta codice_2-funktiota, vaan ytimen koodi kutsuu ladatun moduulin toimintoja.
Linux-ydin tukee virtuaalista tiedostojärjestelmää (VFS), joka sallii ytimen tukea useita konkreettisia tiedostojärjestelmiä. Vastaava rakenne on toteutettu esimerkiksi SunOS-käyttöjärjestelmässä.
Keskeisiä olioita VFS:n toteutuksessa ovat:
VFS tarjoaa toiminnot käyttäjäsovelluksille sekä ytimen sisäisen abstraktiorajapinnan ytimen toiminnoille.
VFS:n avulla ydin tukee lohkopohjaisia tiedostojärjestelmiä (Btrfs, ext2/3/4, JFS, XFS, ISO 9660, UDF), verkkopohjaisia (NFS, coda, AFS, SMB, 9P), yhdistelmäjärjestelmiä (overlayfs, unionfs) ja eritystarkoituksiin suunniteltuja (tmpfs, ramfs, sysfs).
Linux ydin tukee usean prosessorin järjestelmiä, ytimen sisäistä moniajoa, asynkronisia keskeytyksiä ja yksittäistä laitetta voi yrittää käyttää useampi prosessi samaan aikaan: laiteajureja on voitava käyttää useita yhtä aikaa ("reentrant"). Laiteajurit voidaan kääntää kiinteästi osaksi ydintä tai ajonaikana ladattaviin moduuleihin.
Yksinkertaisimmillaan ajurit käyttävät vain IO-muistialueita, mutta useimmat laitteet vaativat monimutkaisempaa käsittelyä.
Laiteajurit ovat tapahtumapohjaisia, jotka reagoivat järjestelmäkutsuihin, laitteistokeskeytyksiin ja niin edelleen.
Linux-ydin tukee ulkoista moniajoa ("preempt"), sekä ytimen sisäinen moniajo on mukana 2.6-sarjassa, jota on myöhemmin laajennettu nk. vapaaehtoiseen moniajoon.
Ydin tukee useita menetelmiä ja algoritmeja tehtävien ajoituksen hallintaan. Ytimen versiossa 2.6.23 lisätty CFS korvasi O(1) skedulerin. Ytimeen on kehitetty tuki ladattaville skedulereille eri käyttötarpeita varten.
Ydintä voidaan suorittaa moniajossa yhdellä suorittimella sekä rinnakkain moniprosessoinnilla. Ydin tukee ulkoisien NPTL-säikeiden lisäksi ytimen sisäisiä säikeitä.
Ytimen sisäinen moniajo tunnistaa mm. "spinlock"-lukituksen käytön ytimen sisäisessä moniajossa. Ydin käyttää runsaasti suoritinkohtaisia "per-CPU" tietorakenteita, jotka parantavat muun muassa välimuistin käytön tehokkuutta, mutta joiden käytössä sisäinen moniajo voidaan kytkeä hetkellisesti pois käytöstä.
Sisäistä moniajoa voi konfiguroida eri käyttötarkoituksiin soveltuvaksi.
Reaaliaikakäyttöön tarkoitettu "Real-Time Linux" lisää omia vaihtoehtoja ytimen sisäiseen moniajoon.
Ytimen NO_HZ -optio vähentää ajoituksen vaatimia herätteitä tehostaen virrankäyttöä ja suorituskykyä tietyissä tilanteissa.
Ytimeen on kehitetty useita menetelmä suodattaa () ja reitittää () verkkoprotokollien paketteja. Eräitä ratkaisuja Linuxissa ovat ipchains, netfilter ja Berkeley Packet Filter (BPF), joka on saatavilla myös useille muille Unixin kaltaisille käyttöjärjestelmille.
Linux-ydin tukee perinteisten Unix-tyylisten oikeuksienhallinnan lisäksi "Access Control List" (ACL) ja "Mandatory Access Control" (MAC) -tyyppisiä mekanismeja kuten SELinux, AppArmor, TOMOYO ja SMACK.
Linux-ydin tukee useimpia tyypillisiä menetelmiä prosessien väliseen kommunikaatioon kuten anonyymit putket, nimetyt putket, viestijonot ja jaettu muisti. Linuxissa on mahdollista käyttää myös useita muita menetelmiä.
Lisäksi on mahdollista käyttää useita käyttäjäavaruudessa toimivia menetelmiä kuten D-Bus, jotka perustuvat daemon-prosessien palveluihin.
Muita ratkaisuja ovat muun muassa kehityksen alla oleva "bus1" ja Androidin käyttämä "binder".
Linux-ydin tukee kahdenlaisia debuggeriohjelmia ytimen virheenjäljitykseen: "kdb" (komentorivillä, ei lähdekooditason debuggausta) ja "kgdb" (etänä, lähdekooditason debuggaus).
"kdb" tukee mm. muistin ja rekisterien tilojen tutkimista ja pysäytyskohtien asettamista. "kgdb" käytetään GNU Debuggerin kanssa.
Lisäksi ydin tukee suorituksen seurantaan muita menetelmiä kuten "strace", codice_3 ja "kprobe".
Suorituskyvyn profilointiin on olemassa muun muassa "perf" laskurit, jota ovat edeltäneet "oprofile", "perfctr" ja "perfmon2".
Linux on historian eniten eri laitteistoalustoja tukeva käyttöjärjestelmä.
Linux tukee NUMA-muistiarkkitehtuurin tietokoneita ja toteuttaa järjestelmäkutsuja järjestelmien hallintaan. Tuki on ollut ytimessä versiosta 2.5 lähtien ja on parannettu jälkeenpäin.
UClinux-projektin myötä Linux tukee myös digitaalisia signaaliprosessoreita sekä mikrokontrollereita sulautetuissa järjestelmissä ja reitittimissä.
Linux-ytimen versioita: