GNU/Linux >> Belajar Linux >  >> Linux

Linux – Mengapa Ada Kebijakan Kernel Linux Untuk Tidak Pernah Melanggar Ruang Pengguna?

Saya mulai memikirkan masalah ini dalam konteks etiket di milis Kernel Linux. Sebagai proyek perangkat lunak bebas yang paling terkenal dan bisa dibilang paling sukses dan penting di dunia, kernel Linux mendapat banyak pers. Dan pendiri dan pemimpin proyek, Linus Torvalds, jelas tidak perlu diperkenalkan di sini.

Linus kadang-kadang mengundang kontroversi dengan nyala apinya di LKML. Api ini sering, menurut pengakuannya sendiri, berkaitan dengan melanggar ruang pengguna. Yang membawa saya ke pertanyaan saya.

Bisakah saya memiliki beberapa perspektif historis tentang mengapa melanggar ruang pengguna adalah hal yang buruk? Seperti yang saya pahami, memecah ruang pengguna akan membutuhkan perbaikan pada tingkat aplikasi, tetapi apakah ini hal yang buruk, jika itu meningkatkan kode kernel?

Seperti yang saya pahami, kebijakan Linus menyatakan bahwa tidak melanggar ruang pengguna mengalahkan segalanya, termasuk kualitas kode. Mengapa ini begitu penting, dan apa pro dan kontra dari kebijakan semacam itu?

(Jelas ada beberapa kontra terhadap kebijakan semacam itu, yang diterapkan secara konsisten, karena Linus kadang-kadang memiliki "ketidaksepakatan" dengan para letnan utamanya di LKML tentang topik ini. Sejauh yang saya tahu, dia selalu mendapatkan jalannya dalam masalah ini.)

Jawaban yang Diterima:

Alasannya bukan alasan historis tetapi alasan praktis. Ada banyak banyak program yang berjalan di atas kernel Linux; jika antarmuka kernel merusak program-program tersebut, maka semua orang perlu memutakhirkan program-program tersebut.

Sekarang memang benar bahwa sebagian besar program sebenarnya tidak bergantung pada antarmuka kernel secara langsung (panggilan sistem), tetapi hanya pada antarmuka pustaka standar C (pembungkus C di sekitar panggilan sistem). Oh, tapi perpustakaan standar yang mana? Glibc? uClibC? Dietlibc? bionik? Muslim? dll.

Tetapi ada juga banyak program yang mengimplementasikan layanan khusus OS dan bergantung pada antarmuka kernel yang tidak diekspos oleh pustaka standar. (Di Linux, banyak di antaranya ditawarkan melalui /proc dan /sys .)

Dan kemudian ada binari yang dikompilasi secara statis. Jika pemutakhiran kernel merusak salah satunya, satu-satunya solusi adalah mengkompilasi ulang. Jika Anda memiliki sumbernya:Linux juga mendukung perangkat lunak berpemilik.

Bahkan ketika sumbernya tersedia, mengumpulkan semuanya bisa jadi menyusahkan. Terutama ketika Anda memutakhirkan kernel Anda untuk memperbaiki bug dengan perangkat keras Anda. Orang sering memutakhirkan kernel mereka secara independen dari sistem lainnya karena mereka membutuhkan dukungan perangkat keras. Dalam kata-kata Linus Torvalds:

Melanggar program pengguna sama sekali tidak dapat diterima. (...) Kami tahu bahwa orang menggunakan binari lama selama bertahun-tahun, dan membuat rilis baru tidak berarti Anda bisa membuangnya begitu saja. Anda dapat mempercayai kami.

Dia juga menjelaskan bahwa salah satu alasan untuk membuat aturan yang kuat ini adalah untuk menghindari neraka ketergantungan di mana Anda tidak hanya harus memutakhirkan program lain untuk membuat beberapa kernel yang lebih baru berfungsi, tetapi juga harus memutakhirkan program lain, dan yang lain, dan lainnya. , karena semuanya bergantung pada versi tertentu dari segalanya.

Ini agak ok untuk memiliki ketergantungan satu arah yang terdefinisi dengan baik. Menyedihkan, tapi terkadang tak terhindarkan. (...) Yang TIDAK OK adalah memiliki ketergantungan dua arah. Jika kode HAL ruang pengguna bergantung pada kernel baru, tidak apa-apa, meskipun saya menduga pengguna akan berharap bahwa itu bukan "kernel minggu ini", tetapi lebih sebagai "kernel beberapa bulan terakhir".

Tetapi jika Anda memiliki ketergantungan DUA ARAH, Anda kacau. Itu berarti Anda harus memutakhirkan dalam langkah kunci, dan itu TIDAK DAPAT DITERIMA. Ini mengerikan bagi pengguna, tetapi yang lebih penting, ini mengerikan bagi pengembang, karena itu berarti Anda tidak dapat mengatakan "ada bug" dan melakukan hal-hal seperti mencoba mempersempitnya dengan membagi dua atau serupa.

Di ruang pengguna, ketergantungan timbal balik tersebut biasanya diselesaikan dengan mempertahankan versi perpustakaan yang berbeda; tetapi Anda hanya dapat menjalankan satu kernel, sehingga kernel harus mendukung semua yang mungkin ingin dilakukan orang dengannya.

Terkait:Urutkan penjelasan urutan?

Secara resmi,

kompatibilitas mundur untuk [panggilan sistem dinyatakan stabil] akan dijamin setidaknya selama 2 tahun.

Namun dalam praktiknya,

Sebagian besar antarmuka (seperti syscalls) diharapkan tidak pernah berubah dan selalu tersedia.

Apa yang lebih sering berubah adalah antarmuka yang hanya dimaksudkan untuk digunakan oleh program terkait perangkat keras, di /sys . (/proc , di sisi lain, yang sejak diperkenalkannya /sys telah dicadangkan untuk layanan yang tidak terkait dengan perangkat keras, hampir tidak pernah rusak dengan cara yang tidak kompatibel.)

Singkatnya,

melanggar ruang pengguna akan membutuhkan perbaikan pada tingkat aplikasi

dan itu buruk karena hanya ada satu kernel, yang orang ingin tingkatkan secara independen dari sisa sistem mereka, tetapi ada banyak aplikasi di luar sana dengan saling ketergantungan yang kompleks. Menjaga kestabilan kernel lebih mudah daripada menjaga ribuan aplikasi tetap up-to-date pada jutaan setup yang berbeda.


Linux
  1. Linux – Perbedaan Antara Ruang Pengguna dan Ruang Kernel?

  2. Linux – Apa Memori Tinggi dan Memori Rendah Di Linux?

  3. Linux – Mengapa Kernel Tidak Dapat Menjalankan Init?

  1. Linux – Apakah Kernel Linux/unix yang Berbeda Dapat Dipertukarkan?

  2. Bagaimana cara mengakses (jika mungkin) ruang kernel dari ruang pengguna?

  3. Bagaimana cara memetakan buffer kernel Linux ke ruang pengguna?

  1. Mengapa tidak ada API DirectX untuk Linux?

  2. tumpukan kernel dan tumpukan ruang pengguna

  3. Mengapa kernel dipetakan ke ruang alamat yang sama dengan proses?