Muokataan sivua Järjestelmäkutsu

Siirry navigaatioon Siirry hakuun
Varoitus: Et ole kirjautunut sisään. IP-osoitteesi näkyy julkisesti kaikille, jos muokkaat. Jos kirjaudut sisään tai luot tunnuksen, muokkauksesi yhdistetään käyttäjänimeesi ja saat paremman käyttökokemuksen.

Kumoaminen voidaan suorittaa. Varmista alla olevasta vertailusta, että haluat saada aikaan tämän lopputuloksen, ja sen jälkeen julkaise alla näkyvät muutokset.

Nykyinen versio Oma tekstisi
Rivi 9: Rivi 9:
toiset vähän harvemmin käytettyjä. On tärkeää huomata, että [[POSIX]]-standardi, jota
toiset vähän harvemmin käytettyjä. On tärkeää huomata, että [[POSIX]]-standardi, jota
Linux noudattaa, ei erottele järjestelmäkutsuja tavallisista funktiokutsuista.
Linux noudattaa, ei erottele järjestelmäkutsuja tavallisista funktiokutsuista.
POSIX määrittelee vain [[API|rajapinnan]], ei sitä, mikä rajapinnan funktio on
POSIX määrittelee vain rajapinnan, ei sitä, mikä rajapinnan funktio on
tavallinen kirjastofunktio ja mikä oikeasti järjestelmäkutsu.
tavallinen kirjastofunktio ja mikä oikeasti järjestelmäkutsu.
Järjestelmäkutsut ovat olemassa vain siksi, että ydin pystyisi takaamaan
Järjestelmäkutsut ovat olemassa vain siksi, että ydin pystyisi takaamaan
Rivi 31: Rivi 31:
* käyttäjien hallinta: <tt>getuid, setuid, chown, chgrp</tt>
* käyttäjien hallinta: <tt>getuid, setuid, chown, chgrp</tt>


Järjestelmäkutsut on dokumentoitu Linuxin manuaalin kappaleessa 2. Lisätietoja:
Järjestelmäkutsut on dokumentoitu Linuxin manuaalin kappaleessa 2. <tt>man 2 intro</tt> -käsky antaa
man 2 intro
lisätietoja.


==Järjestelmäkutsumekanismi==
==Järjestelmäkutsumekanismi==
Rivi 45: Rivi 45:
oikeutta lukea tiedostoa tai tappaa prosessia.
oikeutta lukea tiedostoa tai tappaa prosessia.


Järjestelmäkutsussa tapahtuu siirtymä suorittimen (CPU) tilassa User Modesta
Järjestelmäkutsussa tapahtuu siirtymä prosessorin tilassa User Modesta
[[Kernel Mode]] -tilaan. Miten tämä tapahtuu riippuu käytetyn suorittimen
[[Kernel Mode]] -tilaan. Miten tämä tapahtuu riippuu käytetyn prosessorin
arkkitehtuurista, mutta tyypillinen tapa on niin sanottu "ohjelmallinen
arkkitehtuurista, mutta tyypillinen tapa on niin sanottu "ohjelmallinen
keskeytys" (software interrupt). Tämä mekanismi toimii siten, että suoritin
keskeytys" (software interrupt). Tämä mekanismi toimii siten, että prosessori
suorittaa 'int'- tai 'trap'-käskyn, jonka seurauksena suoritin vaihtaa
suorittaa 'int'- tai 'trap'-käskyn, jonka seurauksena prosessori vaihtaa
tilansa Supervisor Mode -tilaan ja jatkaa suoritusta määritellystä
tilansa Supervisor Mode -tilaan ja jatkaa suoritusta määritellystä
keskeytyksen käsittelijärutiinista.
keskeytyksen käsittelijärutiinista.


Intel x86-perheen suorittimilla Linuxissa on järjestelmäkutsut perinteisesti toteutettu
Intel x86-perheen prosessoreilla Linuxissa on perinteisesti käytetty
<tt>int $0x80</tt> -käskyllä. Järjestelmäkutsun
<tt>int $0x80</tt> -käskyä järjestelmäkutsun suorittamiseen. Järjestelmäkutsun
numero välitetään <tt>eax</tt>-rekisterissä, muut parametrit rekistereissä
numero välitetään <tt>eax</tt>-rekisterissä, muut parametrit rekistereissä
<tt>ebx</tt>, <tt>ecx</tt>, jne., riippuen kutsun parametrien lukumäärästä.
<tt>ebx</tt>, <tt>ecx</tt>, jne., riippuen kutsun parametrien lukumäärästä.
Rivi 69: Rivi 69:
Tällä tavalla saadaan eristettyä varsinaisen järjestelmäkutsun monimutkaisuus
Tällä tavalla saadaan eristettyä varsinaisen järjestelmäkutsun monimutkaisuus
Libc-kirjaston hoidettavaksi Sovellusohjelmat voivat kutsua Libc:n vastaavaa
Libc-kirjaston hoidettavaksi Sovellusohjelmat voivat kutsua Libc:n vastaavaa
funktiota normaalilla korkean tason kielen ([[C]]) kutsulla, assembly-koodin sijasta.
funktiota normaalilla korkean tason kielen (C) kutsulla, assembly-koodin sijasta.
Lisäksi ytimen kutsutapa on riippumaton kääntäjän käyttämästä C-kielen kutsutavasta.
Lisäksi ytimen kutsutapa on riippumaton kääntäjän käyttämästä C-kielen kutsutavasta.
Sovellusohjelmissa voidaan jopa vaihtaa kutsutapaa (esimerkiksi käyttämään parametrinvälitystä
Sovellusohjelmissa voidaan jopa vaihtaa kutsutapaa (esimerkiksi käyttämään parametrinvälitystä
Rivi 76: Rivi 76:
kääntämistä uudella kääntäjällä tai kääntäjän optioita muuttaen.)
kääntämistä uudella kääntäjällä tai kääntäjän optioita muuttaen.)


Suorittimen rekistereitä käytetään parametrien välittämiseen siksi,
Prosessorin rekistereitä käytetään parametrien välittämiseen siksi,
että suorittimen tilan vaihtuessa User Mode:sta Supervisor Mode -tilaan,
että prosessorin tilan vaihtuessa User Mode:sta Supervisor Mode -tilaan,
vaihtuu myös käytettävä pino.
vaihtuu myös käytettävä pino.


==Sysenter ja Sysreturn==
==Sysenter ja Sysreturn==


Intelin x86-suorittimissa on Pentium II:sta alkaen ollut vaihtoehtoinen
Intelin x86-prosessoreissa on Pentium II -prosessorista alkaen ollut vaihtoehtoinen
käsky, jolla siirtymän User Modesta Kernel Mode -tilaan voi toteuttaa: <tt>sysenter</tt>.
käsky, jolla siirtymän User Modesta Kernel Mode -tilaan voi toteuttaa: <tt>sysenter</tt>.
Tämä käsky keksittiin tuomaan ratkaisu int-käskyyn liittyvään ongelmaan.
Tämä käsky keksittiin tuomaan ratkaisu int-käskyyn liittyvään ongelmaan.


<tt>int $0x80</tt> -mekanismi on hidas, eli suoritus vaatii monta
<tt>int $0x80</tt> -mekanismi on hidas, eli suoritus vaatii monta
kellojaksoa, ja se on muuttunut nykyaikaisissa suorittimissa
kellojaksoa, ja se on muuttunut nykyaikaisissa prosessoreissa
suhteellisesti mitattuna yhä hitaammaksi. Uusi <tt>sysenter</tt>-käsky on
suhteellisesti mitattuna yhä hitaammaksi. Uusi <tt>sysenter</tt>-käsky on
nopea, mutta vanhemmat suorittimet eivät tue sitä, jolloin on
nopea, mutta vanhemmat prosessorit eivät tue sitä, jolloin on
käytettävä perinteistä <tt>int $0x80</tt>-käskyä. (<tt>sysenter</tt>-käskyn kanssa
käytettävä vanhempaa <tt>int $0x80</tt>-käskyä. (<tt>sysenter</tt>-käskyn kanssa
samanaikaisesti esitellyllä <tt>sysreturn</tt>-käskyllä palataan järjestelmäkutsusta.)
samanaikaisesti esitellyllä <tt>sysreturn</tt>-käskyllä palataan järjestelmäkutsusta.)


Tavoitteena on toisaalta
Tavoitteena on toisaalta
pitää Libc riippumattomana suorittimen versiosta ja myös puhtaana
pitää Libc riippumattomana prosessoriversiosta ja myös puhtaana
koodista, joka ajon aikana tutkii mitä käskyjä suoritin tukee ja
koodista, joka ajon aikana tutkii mitä käskyjä prosessori tukee ja
mitä se ei tue.
mitä se ei tue.


Ratkaisuna tähän ongelmaan ''ydin'' tarjoaa koodin, jolla
Ratkaisuna tähän ongelmaan ''ydin'' tarjoaa koodin, jolla
järjestelmäkutsu suoritetaan suoritinkohtaisesti optimaalisella
prosessorikohtaisesti järjestelmäkutsu suoritetaan optimaalisella
tavalla: joko <tt>sysenter</tt>-käskyä käyttäen, <tt>int $0x80</tt>-käskyllä,
tavalla: joko <tt>sysenter</tt>-käskyä käyttäen, <tt>int $0x80</tt>-käskyllä,
tai tulevaisuudessa mahdollisesti jollain muulla mekanismilla. Tämä
tai tulevaisuudessa mahdollisesti jollain muulla mekanismilla. Tämä
Wikin materiaali on kaikkien vapaasti käytettävissä Creative Commons 3.0 - nimi mainittava -lisenssin alaisuudessa. TEKIJÄNOIKEUDEN ALAISEN MATERIAALIN KÄYTTÄMINEN ILMAN LUPAA ON EHDOTTOMASTI KIELLETTYÄ!

Muokataksesi tätä sivua vastaa alla olevaan kysymykseen (lisätietoja):

Peruuta Muokkausohjeet (avautuu uuteen ikkunaan)