[Muokattu: 23.2.2015]

Käyttöjärjestelmien olemuksesta (3-A) [ < Käyttöjärjestel... < Käyttö ]

Tietokoneen käyttöjärjestelmä (KJ, ’operating system’, OS) on nimensä mukaan systeemi, jolla laitetta voidaan käyttää, operoida. Ohjelma voisi käyttää laitetta toki ilmankin KJ:tä, esim. KJ itse on sellainen ohjelma. Yksi KJ:n olemassaolon tarkoituksia on tehdä sen päällä ajettavat sovellukset enemmän tai vähemmän riippumattomiksi kulloisestakin laitteistokokoonpanosta. On ilmeistä, että erityyppisten laitteiden yhteydessä tarvitaan melko erilaisia KJ:tä ja laitteen käyttäjällä on enemmän tai vähemmän mahdollisuuksia muokata KJ:n rakennetta tai ominaisuuksia:
keskustietokone -- palvelinkone -- monen prosessorin laite -- henkilökohtainen tietokone -- reaaliaikajärjestelmä -- sulautettu järjestelmä -- toimikortti – hajautettu järjestelmä (jossa on verkko-KJ)
Käyttöjärjestelmän ja laitteiston välissä voi kyllä olla “ohut” kerros laitteistokohtaista ohjelmistoa, nimittäin HAL 'hardware abstraction layer'. Tämä kerros samoinkuin mahdollinen mikro-ohjelmointi suorittimen varsinaisen käskykannan käyttäjänä jätetään tällä kurssilla huomiotta. Pohjimmaltaan KJ:n kautta käytettävät laitteet ovat:
  1. Suoritin, CPU, jossa on erityisesti kokoelma rekistereitä ja niiden joukossa ohjelmalaskuri (PC, program counter), joka osoittaa seuraavaksi suoritettavaan käskyyn.
  2. Keskusmuisti (RAM)
  3. Oheismuisti, joka liittyy laiteohjaukseenkin, mutta jossa erityisesti käännetään loogisia (ja virtuaalisia) osoitteita fyysisiksi.
  4. Laiteohjaimet (device controllers), jotka välittävät CPU:n ja I/O-laitteiden vuorovaikutuksen. Tässä kohdassa tulee mukaan myös ulkoinen tietoliikenne.
  5. Väylät: kukin yhdistää yleensä useita tietokoneen osia. Keskusyksikön sisäisten väylien lisäksi voi olla erilaisia laiteväyliä.
Kuudentena “laitteena” on tavallaan käyttäjä tai paremminkin prosessit, joita hänen sovellusohjelmansa tuottavat. Näitä vartenhan KJ on olemassa. Tavalliselle ohjelmien käyttäjälle näkyy yleensä vain KJ:n komentotulkki, joka sekin on vain sovellusohjelma, olipa se komentorivipohjainen tai graafinen, ikkunoitu. Käyttöliittymän nimitys shell eli kuori on kuvaava.

Sovellusten ohjelmoijan täytyy tietää muistakin liittynnöistä. Ohjelmat käyttävät KJ:tä systeemikutsujen avulla. Tarjolla olevien kutsujen kokoelmasta käytetään nimeä API-liittymä tai -rajapinta (’application program interface’). Se toteuttaa siis laitteiston abstraktion ja luo ohjelmoijalle ikään kuin koneen, jota hän käyttää. Se voi jakautua eri rajapintoihin keskusyksikköä, oheislaitteita ja verkkoyhteyksiä varten.

Tietoturvan kannalta hankaluutena on se, että tunkeutuja tai haittaohjelman kirjoittaja voi toimia paljon matalammalla tasolla kuin tavallinen käyttäjä. Yksi tunnettu hyökkäyskohde on ollut käynnistyssektori.

Kun tietokone käynnistetään, suoritin alkaa käsitellä ohjelmakäskyjä ROM-muistista (ja nykyään flash-muistista). Niiden avulla tarkistetaan, että keskusyksikkö ja ROM:lla niinikään sijaitseva BIOS toimivat odotetulla tavalla (’itsetesti’). Tulos talletetaan.

Tämän jälkeen BIOS (laitelmisto, firmware) alkaa herätellä levymuisteja ja hakee sieltä käynnistyssektorilta käyttöjärjestelmän perusosan, alkulataajan (’bootstrap loader’). Se on pieni ohjelma, jonka tehtävänä on pohjustaa ympäristöä käyttöjärjestelmälle ja ladata se muistiin. Pohjustus tarkoittaa sopivassa järjestyksessä tapahtuvaa KJ:n tietorakenteiden pystyttämistä ja myös tarpeellisten ajuriohjelmien lataamista. (Koska KJ siis tavallaan lataa KJ:n, kyseessä on sama ilmiö kuin paroni von Münchausenin pelastautuminen suosta saapasnauhoista vetämällä). Tämän jälkeen kontrolli siirtyy KJ:lle. Kuten luotetun tietojenkäsittelyalustan yhteydessä on todettu, ennen KJ:n käynnistymistä tehtävät tarkistukset voivat olla varsin mutkikkaita.

Tässä materiaalissa tarjotaan hyvin karkea kuva käyttöjärjestelmistä. Tarkemman näkemyksen saa KJ-kurssilta ja sen tiiviistä oppikirjasta [ HaJä04 ]. Toinen, laajempi kirja on [ Tane01 ]. Kumpaankin kirjaan liittyy verkosta saatavaa materiaalia. Aihepiirin monimutkaisuus ilmenee vaikkapa Linux-ytimen tehtävittäin ja kerroksittain jäsennetyistä kaavioista ( esimerkki ).