Četl jsem, že v novějších jádrech se systémová volání vyvolávají pomocí instrukce INT X80 a také pomocí instrukce sysenter. A také instrukce sysenter poskytuje rychlejší vyvolání ve srovnání s jinou metodou.
Jak mohu zkontrolovat, která všechna systémová volání jsou touto metodou vyvolána?
Přijatá odpověď:
Pokud nepoužíváte jádro starší než 2.6, nebudete používat int x80
metoda pro vyvolání většiny systémových volání. Byly nahrazeny ve prospěch systenter/sysexit
metoda od jádra 2.6 (začala v řadě 2.5) pro věci, na kterých záleží.
Všimněte si, že pokud máte staré binární soubory, které byly vytvořeny na starších jádrech, mohou stále používat int x80
metoda – jediná věc, kterou s tím můžete udělat, je přestavět je (nebo získat aktualizované binární soubory).
Spusťte ldd your_exe
v programu, kterého se obáváte. Pokud uvádí linux-gate.so.1
nebo linux-vdso.so.1
, používá nová systémová volání. Pokud ne, (s největší pravděpodobností) používá starou metodu.
U statických binárních souborů je to těžší určit. Jedním ze způsobů by bylo objdump your_exe | less
a vyhledejte obaly systémových volání (__gettimeofday
je dobrý kandidát). Z demontáže uvidíte, zda používá přerušení nebo ne.
Dobrý přehled toho, jak fungovala stará volání INT 80 a jak vzniklo a je nastaveno nové rozhraní syscall, najdete zde:Systémová volání (od Andriese Brouwera).
Další dobré čtení:Co je to linux-gate. tak.1?.
Oba tyto články jsou propojeny v tomto druhém:Sysenter Based System Call Mechanism v Linuxu 2.6 a odkazuje na knihu Understanding The Linux Kernel od Daniela P. Boveta, Marco Cesati, která je vhodná pro obecnější informace.
Takže stručně:netrapte se tím. Pokud máte dostatečně nedávný systém (CPU, jádro a distribuce), používáte „rychlá“ systémová volání.