Käyttöjärjestelmäpalvelujen käyttö
Käyttöjärjestelmäpalvelut kutsuttavina rutiineina
Käyttöjärjestelmä tarjoaa suorituksessa oleville ohjelmille erilaisia palveluja, kuten esimerkiksi oheislaitteiden käyttämisen. Näitä palveluja käytetään periaatteessa kahdella tavalla.
Palvelut voivat olla suoraan kutsuttavissa tavallisina aliohjelmina tai etuoikeutettuina aliohjelmina. Kaikki käyttöjärjestelmän osat eivät tarvitse etuoikeutettua suoritustilaa ja on turvallisempaa pitää mahdollisimman suuri osa koodista tavallisessa suoritustilassa suoritettavana. Esimerkkinä tällaisesta palvelusta voisi olla joku yleinen tulostuspalvelu. Palveluja kutsutaan tavallisilla call-aliohjelmakutsuillla.
Osa palveluista (esimerkiksi jotkut laiteajurit) vaativat kuitenkin etuoikeutettua suoritustilaa ja niitä kutsutaan tällöin svc-käskyillä. Svc-käsky vaihtaa suoritustilan etuoikeutetuksi samalla kun se siirtää kontrollin kutsutulle rutiinille. Etuoikeutetut palvelurutiinit ovat etukäteen kaikki tiedossa ja ne on usein nimetty pelkästään palvelun numeron mukaisesti. Esimerkiksi, ttk-91'ssä palvelurutiinin Halt (ohjelman suoritus päättyy) numero on 11, mikä on myös symbolin "halt" arvo.
...
svc sp, =halt
Parametrien välitys käyttöjärjestelmärutiineille voi olla erilaista kuin tavallisille aliohjelmille ja tapauskohtaista. Joissakin tapauksissa KJ-palvelupyynnön yhteydessä ei haluta muodostaa tavanomaista aktivaatiotietuetta ja parametrit välitetään yksinkertaisesti sovittujen rekistereiden avulla. Toisaalta taas, usein on ihan järkevää noudattaa samaa aktivaatiotietuerakennetta kuin tavallisten aliohjelmien yhteydessä.
;
; laiteajurin DiskDriver=33 kutsu proseduraalisesti
;
push sp, =0 ; paluuarvo
push sp, =FileBuffer ; datapuskuri tiedon siirtoa varten
push sp, ByteCnt ; luettavien tavujen lukumäärä
push sp, ptrFile ; luettava tiedosto
svc sp, =DiskDriver ; lue laitteelta pyydetty määrä tavuja puskuriin
pop sp, r1
jnzer r1, FileTrouble ; käsittele virhetilanteet
Jos palvelu on suoritettu etuoikeutetussa tilassa, alkuperäinen suorittimen suoritustila (yleensä tavallinen suoritustila) täytyy palauttaa palvelusta paluun yhteydessä. Tätä varten on olemassa yleensä jokin etuoikeutettu konekäsky (esim. iret eli interrupt return). Aikaisemmin vallinnut suoritustila täytyy tietenkin tallettaa johonkin, esimerkiksi pinoon vanhan PC:n ja vanhan FP:n yhteyteen.
Käyttöjärjestelmäpalvelut prosesseina
Osa käyttöjärjestelmäpalveluista on toteutettu omina suoritettavina ohjelmina eli prosesseina. Niitä ei voi kutsua, mutta niille voi lähettää palvelupyyntöviestejä ja sitten jäädä odottamaan vastausviestiä. Viestien lähetys ja vastaanotto taas ovat normaaleja etuoikeutettuja palveluita, joita kutsutaan proseduraalisesti. Esimerkiksi, joidenkin laitteiden laiteajurit voi olla toteutettu näin.
Viestienvälitykseen liittyvän palvelun toteutus on monimutkaisempaa, koska siihen yleensä liittyy prosessin vaihtoja. Esimerkiksi, kun otetaan vastaan viesti joltain toiselta prosessilta, niin tyypillisesti vastaanottava prosessi odottaa odotustilassa, kunnes viesti on saapunut.
;
; laiteajurin DiskDriver (pid=3254) käyttö viestien avulla
;
pidDriver equ 3254 ; laiteajuriprosessin tunniste
MsgService equ 52
...
; lähetä palvelupyyntöviesti
push sp, =0 ; paluuarvo svc-kutsulle
push sp, =pidDriver ; viestin vastaanottajan tunniste (pid)
push sp, =Send ; viestin tyyppi
push sp, =FileBuffer ; datapuskuri tiedon siirtoa varten
push sp, ByteCnt ; luettavien tavujen lukumäärä
push sp, ptrFile ; luettava tiedosto
svc sp, =MsgService ; lähetä viesti DiskDrive-prosessille
pop sp, r1
jnzer r1, SendTrouble ; käsittele virhetilanteet
; vastaanota vastaus palvelupyyntöön laiteajurilta
push sp, =0 ; paluuarvo svc-kutsulle
push sp, =pidDriver ; viestin lähettäjän eli laiteajurin tunniste (pid)
push sp, =Receive ; viestin tyyppi
push sp, =maxWaitTime ; maksimiodotusaika viestin vastaanotolle
push sp, =MsgBuffer ; datapuskurin osoite tiedon siirtoa varten
push sp, &MsgByteCnt ; vastaanotettavien tavujen lukumäärä
svc sp, =MsgService ; vastaanota viesti DiskDriver-prosessilta
pop sp, r1
jnzer r1, RecvTrouble ; käsittele virhetilanteet
Yhteenveto
Tämä luku käsitteli aliohjelmien toteutusta. Kävimme läpi arvo- ja viiteparametrityypit ja esittelimme myös yleensä makroissa käytettävät arvoparametrit. Pääpaino oli aliohjelmien toteutuksella aktivointitietueen (AT) ja aktivointitietuepinon avulla. AT:n kautta välitetään parametrit ja sieltä varataan tila aliohjelman paikallisille tietorakenteille. Käyttöjärjestelmän aliohjelmina kutsuttavat palvelut ovat hyvin samankaltaisia kuin aliohjelmat, mutta kuitenkin erilaisia. Niiden kutsurajapinta on omien konekäskyjen (SVC, IRET, tms.) takana ja parametrien välitys voi tapahtua eri tavalla.
Vastaa alla olevaan kyselyyn kun olet valmis tämän luvun tehtävien kanssa.
Muistathan tarkistaa pistetilanteesi materiaalin oikeassa alareunassa olevasta pallosta!