Ett systemanrop är en mekanism för ett datorprogram att utnyttja funktioner erbjudna av operativsystemkärnan.

I operativsystem för många samtida användare och i viss grad också annars i operativsystem med multikörning bör operativsystemet skydda olika användare och program för varandra och koordinera hårdvaruaccess. För att illa skrivna program inte skall kunna kringgå begränsningarna kör operativsystemkärnan i allmänhet med en högre privilegienivå ("ring 0") än tillämpningsprogrammen.

Då en process behöver en tjänst som tillhandahålls av operativsystemkärnan måste den kunna överföra kontrollen till kärnan. Kontrollen måste överföras så att kod med högre privilegienivå körs i en omgivning den själv har kontroll över. Därför har de flesta processorarkitekturen en specialkonstruerad mekanism för systemanrop.

Typiska implementationer redigera

Ofta implementeras systemanrop som mjukvaruavbrott, en maskinkodsinstruktion som överför kontrollen till operativsystemkärnan på liknande sätt som då någon hårdvara kräver operativsystemets uppmärksamhet. En del processorarkitekturer erbjuder också alternativa mekanismer. Före avbrottet placeras koden för det specifika systemanropet och anropets parametrar (eller en pekare till en lämplig datastruktur) i vissa av processorns register. På motsvarande sätt lämnas returkoder från systemanropet i processorregister.

Då pekare används måste dessa tolkas enligt den anropande processens minnesvy, som vid användande av virtuellt minne ofta skiljer sig från kärnans minnesvy. För att hantera de olika minnesvyerna effektivt reserveras i till exempel Linux en del av processens minnesrymd för kärnans behov.

Processorns datastrukturer, såsom de olika registren, måste innan den ursprungliga processen skall fortsätta köra återställas i det skick processen förväntar sig att finna dem i. I olika operativsystem och arkitekturer finns olika konventioner om vilka strukturer som skall sparas undan och återställas av den anropande processen och vilka strukturer som antingen skall lämnas orörda eller återställas av operativsystemkärnan.

Exempel på systemanrop i assembler (Linux: sys_close, stänger en fil):

mov eax, 6 ; systemanropets nummer till register eax
mov ebx, 1 ; numret för filen (enda parametern) till register ebx
int 80h    ; mjukvaruavbrott

Systembibliotek redigera

Ofta sköts systemanrop via ett programbibliotek, som tar hand om de konventioner som gäller för anropen och eventuellt sköter en del av det arbete som kunde höra till operativsystemkärnan. Det senare är praktiskt då den efterfrågade funktionen beroende på implementation kan behöva men inte nödvändigtvis behöver speciella privilegier. För en vanlig programmerare är det ofta (utom vid viss felsökning) ointressant vilka funktioner som sköts av operativsystemkärnan och vilka som sköts av de till operativsystemet hörande programbiblioteken.