Syscall()

Linux.fista
Versio hetkellä 10. toukokuuta 2022 kello 19.17 – tehnyt NasmHerra (keskustelu | muokkaukset) (Ensimmäinen artikkelini - virheet todennäköisiä)
(ero) ← Vanhempi versio | Nykyinen versio (ero) | Uudempi versio → (ero)
Siirry navigaatioon Siirry hakuun

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