Saya melihat banyak orang referensi online
arch/x86/entry/syscalls/syscall_64.tbl
untuk tabel syscall, itu berfungsi dengan baik. Tapi banyak referensi lain
/include/uapi/asm-generic/unistd.h
yang biasa ditemukan dalam paket header. Bagaimana bisa syscall_64.tbl
menunjukkan,
0 common read sys_read
Jawaban yang benar, dan unistd.h
menunjukkan,
#define __NR_io_setup 0
__SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup)
Dan kemudian ditampilkan __NR_read
sebagai
#define __NR_read 63
__SYSCALL(__NR_read, sys_read)
Mengapa itu 63, dan bukan 1? Bagaimana saya masuk akal /include/uapi/asm-generic/unistd.h
? Masih di /usr/include/asm/
sana
/usr/include/asm/unistd_x32.h
#define __NR_read (__X32_SYSCALL_BIT + 0)
#define __NR_write (__X32_SYSCALL_BIT + 1)
#define __NR_open (__X32_SYSCALL_BIT + 2)
#define __NR_close (__X32_SYSCALL_BIT + 3)
#define __NR_stat (__X32_SYSCALL_BIT + 4)
/usr/include/asm/unistd_64.h
#define __NR_read 0
#define __NR_write 1
#define __NR_open 2
#define __NR_close 3
#define __NR_stat 4
/usr/include/asm/unistd_32.h
#define __NR_restart_syscall 0
#define __NR_exit 1
#define __NR_fork 2
#define __NR_read 3
#define __NR_write 4
Bisakah seseorang memberi tahu saya perbedaan antara unistd
file - file ini . Jelaskan cara unistd.h
kerjanya? Dan apa metode terbaik untuk menemukan tabel syscall?
tux
syscall ).Saya memiliki halaman yang mencantumkan semua panggilan sistem untuk setiap arsitektur yang didukung Linux:
https://fedora.juszkiewicz.com.pl/syscalls.html
sumber
63 ada
read
diarm64
, 0 adaread
dix86_64
Nomor syscall berbeda untuk setiap arsitektur.
Nomor arm64 misalnya didefinisikan di:
include/uapi/asm-generic/unistd.h
yang menunjukkan bahwa 63, lihat juga: /reverseengineering/16917/arm64-syscalls-table/18834#18834Seperti dijelaskan dalam jawaban itu, saya pikir itu termasuk / uapi / asm-generic / unistd.h adalah upaya yang lebih baru untuk menyatukan nomor syscall di semua lengkungan.
Tetapi karena nomor syscall tidak dapat berubah untuk tidak merusak API syscall, lengkungan yang lebih tua sebelum upaya unifikasi mempertahankan nomor lama.
Pertanyaan ini meminta cara otomatis untuk mendapatkan daftar syscall lengkap termasuk parameter: /programming/6604007/how-can-i-get-a-list-of-linux-system-calls-and- sejumlah args-mereka-ambil-automati
strace
Kode sumberSaya percaya alat itu, dan mereka menjaga data mereka tetap rapi
linux/
, misalnya:Perhatikan bahwa aarch64
#include
adalah agnostik lengkung64/syscallent.h
yang saya sebutkan sebelumnya.Tabel-tabel itu berisi jumlah argumen, tetapi bukan tipe argumen aktual, saya ingin tahu di mana
strace
mengkodekannya.sumber
Jawaban ini tidak akan menyentuh
asm-generic
versiunistd.h
, karena tidak ada yang memasukkannya. 1Sebagaimana dicatat dalam
syscalls(2)
:Artinya, nomor syscall yang benar akan ditemukan di
/usr/include/asm/unistd.h
. Sekarang, pada sistem x86 biasa, ini hanya akan menyertakan salah satuasm/unistd_*.h
file tergantung pada target.Nomor-nomor syscall yang sesuai untuk program 64-bit ada di dalamnya, dan angka-angka untuk program
asm/unistd_64.h
32-bit diasm/unistd_32.h
(atau_x32.h
varian yang hampir setara ). Keduanya berbeda karena arsitektur 32-dan 64-bit, secara efektif, sistem operasi yang sama sekali berbeda. Mereka berbagi set syscall yang sama, tetapi tidak dalam urutan yang sama, karena berbagai alasan.Sebagian besar memiliki pembungkus bahasa C juga, jadi Anda jarang perlu menggunakannya
syscall(2)
secara langsung.1 Dan karena saya tidak tahu untuk apa itu.
sumber
Untuk menambahkan semua jawaban yang bagus, ada utilitas
ausyscall
yang dapat digunakan untuk membuat daftar semua syscalls dan pemetaan bilangan bulat mereka untuk arsitektur tertentu.misalnya:
sumber