Mengapa nomor sistem panggilan Linux di x86 dan x86_64 berbeda?

35

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).

humanityANDpeace
sumber
3
Saya pikir Anda mengajukan pertanyaan yang salah. Pertanyaan yang benar adalah mengapa tetap sama: Jawab kompatibilitas. Jadi jika x86 dan x86_64 tidak kompatibel, maka tidak ada kekuatan untuk menjaga mereka agar tidak berubah. Sekarang semua kekuatan dari 20 tahun terakhir yang menginginkan perubahan, akan mendominasi (kita mendapat kesempatan untuk mengubahnya). [Catat ini hanya opini dan tidak didasarkan pada batin para perancang sistem baru.]
ctrl-alt-delor

Jawaban:

34

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)

Random832
sumber
1
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 anak fork()panggilan
kucing
5
@cat jika Anda melihat forksebagai diperhitungkan ke proses anak (yaitu melihatnya sebagai panggilan proses pembuatan), daripada proses induk maka pernyataan Random832 benar.
icarus
4
@cat OK, Anda dapat memanggil fork () dua atau tiga kali, mungkin beberapa lagi. Tetapi Anda dapat memanggil read () jutaan atau bahkan milyaran kali.
Michael Hampton
1
Ya, itulah yang saya maksud. Jumlah panggilan garpu dan jumlah proses selama masa hidup sistem akan sama, mengabaikan detail seperti init, klon [yang dapat membuat proses atau utas], dll.
Random832
15

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.

xienne
sumber
Dugaan saya benar.
ctrl-alt-delor
2
Jawaban lain yang Anda tautkan bersifat spekulatif: dikatakan "orang-orang Linux yang paling mungkin memutuskan ..." (penekanan ditambahkan). Saya pikir ini akan membantu jika jawaban Anda di sini memberikan indikasi bahwa itu tampaknya didasarkan pada spekulasi daripada bukti. Kebetulan, komentar yang lebih baru yang diposting di bawah jawaban terkait memberikan bukti bahwa alasan sebenarnya bukan pembersihan generik dari cruft (seperti jawaban yang berspekulasi), tetapi secara khusus tentang "penggunaan cacheline", seperti yang dijelaskan dalam jawaban lain di sini .
DW
-3

Singkatnya, karena seseorang berpikir " N+1cara yang tidak sesuai untuk melakukannya lebih baik daripada Ncara". 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.

R ..
sumber
3
Perubahan itu tidak serampangan. Ada alasan teknis yang kuat. Jika bukan karena persyaratan kompatibilitas ke belakang, perubahan serupa akan diterapkan pada arsitektur yang ada juga.
Jörg W Mittag
Perbedaan dalam penomoran adalah 100% gratis. Tidak ada keuntungan teknis untuk penomoran tertentu.
R ..
2
Seperti yang dijelaskan oleh jawaban lain ini , syscalls dikelompokkan sedemikian sehingga syscalls yang biasanya digunakan bersama-sama berbagi cacheline yang sama dalam tabel syscall. Dan nomor syscall dipilih sedemikian rupa sehingga mereka adalah indeks sederhana ke dalam tabel itu. Secara teoritis, kita bisa menggunakan lapisan tipuan untuk memisahkan posisi syscall di tabel syscall dari nomor syscall, tetapi itu mungkin akan memakan sebagian dari keuntungan kinerja yang kita dapatkan dari menempatkan syscalls panas di cacheline yang sama.
Jörg W Mittag
@ JörgWMittag: Dan itu jelas optimasi prematur dan bukan peningkatan yang terukur. Lihat saja berapa banyak siklus yang diambil syscalls dan berapa banyak garis cache yang mereka usir. Menyimpan paling baik satu baris cache dari memesan tabel tidak akan membuat perbedaan.
R ..
2
@R .. "Saya memilih fungsi penomoran info profil kernel tpcc dengan DBMS populer dan strace output dari beberapa jaringan dan aplikasi desktop." tentu terdengar seperti ada pengukuran. Namun penulis tidak memberikan angka atau menjelaskan metodologi secara memadai.
user45891