syscall
adalah cara default untuk memasuki mode kernel padax86-64
. Instruksi ini tidak tersedia dalam mode operasi 32 bit pada prosesor Intel .sysenter
adalah instruksi yang paling sering digunakan untuk menjalankan panggilan sistem dalam mode operasi 32 bit. Mirip dengansyscall
, sedikit lebih sulit untuk digunakan, tetapi itu adalah perhatian kernel.int 0x80
adalah cara lama untuk memanggil panggilan sistem dan harus dihindari.
Cara yang lebih disukai untuk memanggil panggilan sistem adalah dengan menggunakan vDSO, bagian dari memori yang dipetakan di setiap ruang alamat proses yang memungkinkan untuk menggunakan panggilan sistem secara lebih efisien (misalnya, dengan tidak memasuki mode kernel dalam beberapa kasus sama sekali). vDSO juga menangani lebih sulit, dibandingkan dengan int 0x80
lama cara, penanganan syscall
atau sysenter
instruksi.
Juga, lihat ini dan ini.
Jawaban saya di sini mencakup pertanyaan Anda.
Dalam praktiknya, kernel baru-baru ini mengimplementasikan VDSO, terutama untuk mengoptimalkan panggilan sistem secara dinamis (kernel menetapkan VDSO ke beberapa kode terbaik untuk prosesor saat ini). Jadi Anda harus menggunakan VDSO, dan sebaiknya Anda menggunakan, untuk syscall yang ada, antarmuka yang disediakan oleh libc.
Perhatikan bahwa, AFAIK, sebagian besar biaya syscall sederhana berpindah dari ruang pengguna ke kernel dan sebaliknya. Oleh karena itu, untuk beberapa syscall (mungkin gettimeofday
, getpid
...) VDSO bahkan mungkin menghindari itu (dan secara teknis mungkin menghindari melakukan syscall nyata). Untuk kebanyakan syscall (seperti open
, read
, send
, mmap
....) biaya kernel dari syscall cukup besar untuk melakukan peningkatan transisi ruang pengguna ke ruang kernel (misalnya menggunakan SYSENTER
atau SYSCALL
instruksi mesin, bukan INT
) tidak signifikan.
Waspadai hal ini sebelum mengubah :nomor panggilan sistem berbeda saat melakukan 0x80 atau syscall, misalnya sys_write adalah 4 dengan 0x80 dan 1 dengan syscall.
http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html untuk 32 bit atau 0x80http://blog.rchapman.org/post/36801038863/linux-system-call-table-for -x86-64 untuk syscall