GNU/Linux >> Belajar Linux >  >> Linux

Apa yang lebih baik int 0x80 atau syscall dalam kode 32-bit di Linux?

  • syscall adalah cara default untuk memasuki mode kernel pada x86-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 dengan syscall , 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


Linux
  1. Linux – Bagian Kernel yang Dimiliki Atau Tertutup?

  2. Apa yang Membuat Server Linux Kernel Mendasar?

  3. Apa itu Kode Keluar Bash di Linux

  1. Membatasi akses syscall untuk aplikasi Linux

  2. Apa artinya mengatakan kernel linux bersifat preemptive?

  3. Bagaimana cara memuat modul kernel Linux dari kode C?

  1. Apa sumber kernel Linux saat ini?

  2. Pembaruan kernel tanpa me-reboot

  3. Apa itu memori tinggi dan memori rendah di Linux?