syscall
je výchozí způsob vstupu do režimu jádra nax86-64
. Tato instrukce není dostupná v 32bitových režimech provozu na procesorech Intel .sysenter
je instrukce nejčastěji používaná k vyvolání systémových volání v 32bitových režimech provozu. Je podobnýsyscall
, sice trochu obtížnější na použití, ale to je starost jádra.int 0x80
je zastaralý způsob vyvolání systémového volání a je třeba se mu vyhnout.
Preferovaným způsobem vyvolání systémového volání je použití vDSO, části paměti mapované v adresovém prostoru každého procesu, která umožňuje používat systémová volání efektivněji (například tím, že v některých případech vůbec nevstoupí do režimu jádra). vDSO se také stará o obtížnější, ve srovnání se starší verzí int 0x80
způsobem, zpracování syscall
nebo sysenter
pokyny.
Podívejte se také na toto a toto.
Moje odpověď zde pokrývá vaši otázku.
V praxi nedávná jádra implementují VDSO, zejména pro dynamickou optimalizaci systémových volání (jádro nastavuje VDSO na nějaký kód, který je pro aktuální procesor nejlepší). Měli byste tedy použít VDSO a pro stávající systémová volání byste raději měli používat rozhraní poskytované knihovnou libc.
Všimněte si, AFAIK, značná část nákladů na jednoduchá systémová volání jde z uživatelského prostoru do jádra a zpět. Proto pro některá systémová volání (pravděpodobně gettimeofday
, getpid
...) VDSO se může vyhnout i tomu (a technicky se může vyhnout skutečnému systémovému volání). Pro většinu systémových volání (jako open
, read
, send
, mmap
....) náklady na jádro syscall jsou dostatečně velké na to, aby došlo ke zlepšení přechodu z uživatelského prostoru na prostor jádra (např. pomocí SYSENTER
nebo SYSCALL
strojové instrukce místo INT
) bezvýznamné.
Před změnou si dejte pozor na toto:čísla systémových hovorů se liší když děláte 0x80 nebo syscall, např. sys_write je 4 s 0x80 a 1 se syscall.
http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html pro 32 bitů nebo 0x80http://blog.rchapman.org/post/36801038863/linux-system-call-table-for -x86-64 pro systémové volání