Saya tahu bahwa system call interface diimplementasikan pada level rendah dan karenanya bergantung pada arsitektur / platform, bukan kode "generik".
Namun, saya tidak dapat dengan jelas melihat alasan mengapa pemanggilan sistem di Linux kernel x86 32-bit memiliki angka yang tidak tetap sama dalam arsitektur serupa Linux 64-bit x86_64? Apa motivasi / alasan di balik keputusan ini?
Dugaan pertama saya adalah alasan latar belakang untuk menjaga agar aplikasi 32-bit tetap dapat dijalankan pada sistem x86_64, sehingga melalui offset yang masuk akal ke nomor panggilan sistem, sistem akan tahu bahwa ruang pengguna adalah 32-bit atau 64-bit masing-masing. Tetapi, ini bukan perkaranya. Setidaknya bagi saya yang membaca () menjadi nomor sistem panggilan 0 di x86_64 tidak dapat disejajarkan dengan pemikiran ini.
Dugaan lain adalah bahwa mengubah nomor sistem panggilan mungkin memiliki latar belakang keamanan / pengerasan, sesuatu yang saya tidak dapat mengkonfirmasi sendiri.
Menjadi tidak tahu dengan tantangan implementasi bagian kode yang bergantung pada arsitektur, saya masih bertanya-tanya bagaimana mengubah nomor sistem panggilan , ketika tampaknya tidak perlu (karena bahkan register 16-bit akan menyimpan sebagian besar lebih dari angka saat ini ~ 346 untuk mewakili semua panggilan), akan membantu untuk mencapai apa pun, selain memecah kompatibilitas (meskipun menggunakan panggilan sistem melalui perpustakaan, libc, meredakannya).
sumber
Jawaban:
Adapun alasan di balik penomoran tertentu, yang tidak cocok dengan arsitektur lain [kecuali "x32" yang benar-benar hanya bagian dari arsitektur x86_64]: Pada hari-hari awal dukungan x86_64 di kernel linux, sebelum ada kendala kompatibilitas mundur yang serius, semua panggilan sistem dinomori ulang untuk mengoptimalkannya pada tingkat penggunaan cacheline .
Saya tidak cukup tahu tentang pengembangan kernel untuk mengetahui dasar spesifik untuk pilihan-pilihan ini, tetapi ternyata ada beberapa logika di balik pilihan untuk memberi nomor baru semuanya dengan angka-angka khusus ini daripada hanya menyalin daftar dari arsitektur yang ada dan menghapus yang tidak digunakan. Sepertinya urutannya didasarkan pada seberapa umum mereka dipanggil - mis. Baca / tulis / buka / tutup di depan. Keluar dan garpu mungkin tampak "mendasar", tetapi masing-masing disebut hanya sekali per proses.
Mungkin juga ada sesuatu yang terjadi tentang menjaga panggilan sistem yang biasanya digunakan bersama-sama dalam garis cache yang sama (nilai-nilai ini hanya bilangan bulat, tetapi ada tabel di kernel dengan pointer fungsi untuk masing-masing, sehingga masing-masing kelompok 8 panggilan sistem menempati garis cache 64-byte untuk tabel itu)
sumber
fork may seem "fundamental", but [...] called only once per process.
Uh, apa? Saya mengerti Anda mungkin berharap untuk memanggil keluar sekali, tetapi Anda mungkin bercabang di dalam orang tua dan anakfork()
panggilanfork
sebagai diperhitungkan ke proses anak (yaitu melihatnya sebagai panggilan proses pembuatan), daripada proses induk maka pernyataan Random832 benar.Lihat jawaban untuk pertanyaan "Mengapa nomor sistem panggilan berbeda di amd64 linux?" pada Stack Overflow.
Singkatnya: demi kompatibilitas, daftar panggilan sistem stabil dan hanya dapat tumbuh. Ketika arsitektur x86 64 muncul, ABI (passing argumen, nilai yang dikembalikan) berbeda, sehingga pengembang kernel mengambil kesempatan untuk membawa perubahan yang telah lama dinanti.
sumber
Singkatnya, karena seseorang berpikir "
N+1
cara yang tidak sesuai untuk melakukannya lebih baik daripadaN
cara". Untuk lengkungan historis, nomor syscall biasanya dipilih untuk mencocokkan beberapa unix milik warisan. Tetapi untuk x86_64 pengembang kernel bebas untuk memilih penomoran yang mereka suka. Daripada membuat pilihan sederhana dan menggunakan kembali penomoran yang sudah ada, mereka membuat pilihan untuk menciptakan standar baru. Kemudian mereka melakukannya lagi untuk aarch64 dan banyak lainnya. Ini adalah pola yang sering diulang dalam pengembangan kernel Linux.sumber