Ero sivun ”Syscall()” versioiden välillä

Linux.fista
Siirry navigaatioon Siirry hakuun
(Ensimmäinen artikkelini - virheet todennäköisiä)
Merkkaukset: Mobiilimuokkaus mobiilisivusto-muokkaus
 
p (lisätty luokka, ettei artikkeli jää täysin erilleen wikissä)
Rivi 43: Rivi 43:


</syntaxhighlight>
</syntaxhighlight>
[[Luokka:C-standardikirjasto]]

Versio 12. toukokuuta 2022 kello 18.16

Syscall on C-standardikirjaston tarjoama funktio, jolla pystyy kutsumaan järjestelmäkutsun. Funktio löytyy unistd.h-otsaketiedostosta. Syscall-funktio on määritelty seuraavasti:

long syscall(long number, ...);

Määritelmän mukaan syscall-funktio vaatii vähintään yhden argumentin eli kutsuttavan järjestelmäkutsun numeron sekä järjestelmäkutsusta riippuen mahdollisesti tietyn määrän tietyn tyyppisiä argumentteja. Järjestelmäkutsun kutsumisen lisäksi funktio asettaa tarvittaessa errno-muuttujan tietyn arvon.

Funktion luominen

Mikäli haluat tehdä oman C-kirjaston, voit luoda oman syscall-funktion. Mikäli oletetaan, että saatavilla on vain kolme järjestelmäkutsua: open (0) , read (1) ja write (2), voidaan funktio yksinkertaisimmillaan ohjelmoida NASM-kielellä näin:

[BITS 64]

global syscall
extern ENOSYS
extern ERRNO

section .text

syscall:
    cmp rax, NSYSCALLS
    ja nosyscall
    syscall
    cmp rax, 0
    push rax
    push rcx
    jb set_errno
    pop rcx
    pop rax
    ret

nosyscall:
    mov rax, ENOSYS

set_errno:
    mov rcx, rax
    sub rax, rcx
    sub rax, rcx
    mov errno, rax

section .data

NSYSCALLS: resb 2