Apa isi dari basis kode monolitik ini?
Saya memahami dukungan arsitektur prosesor, keamanan, dan virtualisasi, tetapi saya tidak dapat membayangkan bahwa lebih dari 600.000 baris.
Apa driver historis & alasan saat ini yang termasuk dalam basis kode kernel?
Apakah 15+ juta baris itu termasuk setiap driver tunggal untuk setiap perangkat keras yang pernah ada? Jika demikian, itu kemudian menimbulkan pertanyaan, mengapa driver tertanam dalam kernel dan bukan paket terpisah yang terdeteksi secara otomatis dan diinstal dari ID perangkat keras?
Apakah ukuran basis kode merupakan masalah untuk perangkat yang terbatas penyimpanan atau terbatas memori?
Tampaknya itu akan mengasapi ukuran kernel untuk perangkat ARM terbatas ruang jika semua itu tertanam. Apakah banyak garis yang diambil oleh preprosesor? Sebut saya gila, tapi saya tidak bisa membayangkan mesin yang membutuhkan banyak logika untuk menjalankan apa yang saya pahami adalah peran kernel.
Apakah ada bukti bahwa ukurannya akan menjadi masalah dalam 50+ tahun karena sifatnya yang tampaknya terus bertambah?
Termasuk driver berarti itu akan tumbuh ketika perangkat keras dibuat.
EDIT : Bagi mereka yang berpikir ini adalah sifat kernel, setelah beberapa penelitian saya menyadari itu tidak selalu. Sebuah kernel tidak diperlukan untuk menjadi ini besar, seperti Carnegie Mellon mikrokernel Mach terdaftar sebagai contoh 'biasanya di bawah 10.000 baris kode'
sumber
make menuconfig
untuk melihat seberapa banyak kode dapat diaktifkan / dinonaktifkan sebelum dibuat.Jawaban:
Driver dipertahankan di dalam kernel sehingga ketika perubahan kernel membutuhkan pencarian dan penggantian global (atau pencarian dan modifikasi tangan) untuk semua pengguna fungsi, itu dilakukan oleh orang yang melakukan perubahan. Memiliki driver Anda diperbarui oleh orang-orang yang membuat perubahan API adalah keuntungan yang sangat bagus, daripada harus melakukannya sendiri ketika tidak dikompilasi pada kernel yang lebih baru.
Alternatifnya (itulah yang terjadi untuk driver yang dipelihara di luar pohon), adalah bahwa patch harus disinkronkan kembali oleh pengelola untuk mengikuti perubahan.
Pencarian cepat menghasilkan perdebatan tentang pengembangan driver di-pohon vs di luar pohon .
Cara Linux dipelihara sebagian besar dengan menjaga segala sesuatu dalam repo arus utama. Membangun kernel stripped-down kecil didukung oleh opsi konfigurasi untuk mengontrol
#ifdef
s. Jadi Anda benar-benar dapat membangun kernel kecil yang dilucuti yang mengkompilasi hanya sebagian kecil dari kode di seluruh repo.Penggunaan ekstensif Linux dalam sistem tertanam telah menyebabkan dukungan yang lebih baik untuk meninggalkan hal-hal dari Linux bertahun-tahun sebelumnya ketika pohon sumber kernel lebih kecil. Kernel super-minimal 4.0 mungkin lebih kecil dari kernel 2.4.0 super-minimal.
sumber
Menurut cloc run terhadap 3.13, Linux adalah sekitar 12 juta baris kode.
lsmod | wc
pada laptop Debian saya menunjukkan 158 modul yang dimuat saat runtime, jadi memuat modul secara dinamis adalah cara yang baik untuk mendukung perangkat keras.Sistem konfigurasi yang kuat (mis.
make menuconfig
) Digunakan untuk memilih kode mana yang akan dikompilasi (dan lebih ke titik Anda, kode mana yang tidak dikompilasi). Embedded system menentukan sendiri.config
berkas hanya dengan dukungan hardware yang mereka pedulikan (termasuk hardware mendukung built-in ke kernel atau modul sebagai loadable).sumber
Bagi siapa pun yang penasaran, inilah rincian linecount untuk mirror GitHub:
drivers
berkontribusi pada banyak jumlah lini.sumber
grep -Pir "\x66\x75\x63\x6b" /usr/src/linux/ | wc -l
./documentation
memiliki lebih dari 500.000 baris kode? ....apa?Jawabannya sejauh ini tampaknya "ya ada banyak kode" dan tidak ada yang menangani pertanyaan dengan jawaban yang paling logis: 15M +? TERUS? Apa hubungan 15 juta baris kode sumber dengan harga ikan? Apa yang membuat ini sangat tak terbayangkan?
Linux jelas banyak. Jauh lebih dari apa pun ... Tetapi beberapa poin Anda menunjukkan Anda tidak menghargai apa yang terjadi ketika itu dibangun dan digunakan.
Tidak semuanya dikompilasi. Sistem build Kernel memungkinkan Anda untuk dengan cepat menentukan konfigurasi yang memilih set kode sumber. Ada yang eksperimental, ada yang tua, ada yang tidak diperlukan untuk setiap sistem. Lihat
/boot/config-$(uname -r)
(di Ubuntu) dimake menuconfig
dan Anda akan melihat berapa banyak yang dikecualikan.Dan itu adalah distribusi desktop target-variabel. Konfigurasi untuk sistem tertanam hanya akan menarik hal-hal yang dibutuhkannya.
Tidak semuanya built-in. Dalam konfigurasi saya, sebagian besar fitur Kernel dibangun sebagai modul:
Agar lebih jelas, ini semua bisa menjadi built-in ... Sama seperti mereka dapat dicetak dan dibuat menjadi roti kertas raksasa. Itu tidak masuk akal kecuali jika Anda melakukan custom build untuk pekerjaan hardware diskrit (dalam hal ini, Anda sudah membatasi jumlah item-item ini).
Modul dimuat secara dinamis. Bahkan ketika suatu sistem memiliki ribuan modul yang tersedia untuk itu, sistem akan memungkinkan Anda untuk memuat hal-hal yang Anda butuhkan. Bandingkan keluaran dari:
Hampir tidak ada yang dimuat.
Microkernels bukan hal yang sama. Hanya 10 detik melihat gambar utama ke halaman Wikipedia yang Anda tautkan akan menyorotinya dirancang dengan cara yang sama sekali berbeda.
Driver Linux diinternalisasi (sebagian besar sebagai modul yang dimuat secara dinamis), bukan ruang pengguna, dan sistem file juga internal. Mengapa itu lebih buruk daripada menggunakan driver eksternal? Mengapa mikro lebih baik untuk komputasi keperluan umum?
Komentar lagi menyoroti Anda tidak mendapatkannya. Jika Anda ingin menggunakan Linux pada perangkat keras diskrit (mis. Aerospace, TiVo, tablet, dll.) Anda mengkonfigurasinya untuk membangun hanya driver yang Anda butuhkan . Anda dapat melakukan hal yang sama pada desktop Anda
make localmodconfig
. Anda berakhir dengan build Kernel mungil untuk tujuan kecil dengan fleksibilitas nol.Untuk distribusi seperti Ubuntu, paket Kernel 40MB tunggal dapat diterima. Tidak, gosok itu, sebenarnya lebih disukai daripada skenario pengarsipan dan pengunduhan besar-besaran yang menjaga 4000+ modul mengambang sebagai paket. Menggunakan lebih sedikit ruang disk untuk mereka, lebih mudah untuk mengemas pada waktu kompilasi, lebih mudah untuk menyimpan dan lebih baik bagi para penggunanya (yang memiliki sistem yang hanya berfungsi).
Masa depan juga tampaknya tidak menjadi masalah. Laju kecepatan CPU, kepadatan disk / harga, dan peningkatan bandwidth tampaknya jauh lebih cepat daripada pertumbuhan Kernel. Paket Kernel 200MB dalam 10 tahun tidak akan menjadi akhir jika dunia.
Ini juga bukan jalan satu arah. Kode akan dikeluarkan jika tidak dipelihara.
sumber
tinyconfig bubble graph svg (biola)
shell script untuk membuat json dari kernel build, gunakan dengan http://bl.ocks.org/mbostock/4063269
Sunting : ternyata
unifdef
memiliki beberapa batasan (-I
diabaikan dan-include
tidak didukung, yang terakhir digunakan untuk menyertakan tajuk konfigurasi yang dibuat) pada saat ini menggunakancat
tidak banyak berubah:skrip dan prosedur diperbarui.
Selain driver, arch dll ada banyak kode kondisional yang dikompilasi atau tidak tergantung pada konfigurasi yang dipilih, kode tidak harus dalam modul yang dimuat dinamis tetapi dibangun di inti.
Jadi, unduh sumber linux-4.1.6 , pilih tinyconfig , itu tidak mengaktifkan modul dan saya benar-benar tidak tahu apa itu memungkinkan atau apa yang bisa dilakukan pengguna saat runtime, konfigurasi kernel:
membangun kernel
proses pembuatan kernel meninggalkan file tersembunyi yang disebut
*.cmd
dengan baris perintah yang digunakan juga untuk membangun.o
file, untuk memproses file-file itu dan mengekstrak target dan dependensi salin discript.sh
bawah ini dan menggunakannya dengan find :ini membuat salinan untuk setiap ketergantungan
.o
nama target.o.c
.c code
.h header (disanitasi)
sumber
Pengorbanan kernel monolitik diperdebatkan antara Tananbaum dan Torvalds di depan umum sejak awal. Jika Anda tidak perlu menyeberang ke ruang pengguna untuk semuanya, maka antarmuka ke kernel bisa lebih sederhana. Jika kernel bersifat monolitik, maka dapat lebih dioptimalkan (dan lebih berantakan!) Secara internal.
Kami telah memiliki modul sebagai kompromi untuk beberapa waktu. Dan ini berlanjut dengan hal-hal seperti DPDK (memindahkan lebih banyak fungsi jaringan dari kernel). Semakin banyak inti yang ditambahkan, semakin penting untuk menghindari penguncian; jadi lebih banyak hal akan pindah ke userspace dan kernel akan menyusut.
Perhatikan bahwa kernel monolitik bukan satu-satunya solusi. Pada beberapa arsitektur, batas kernel / userspace tidak lebih mahal daripada panggilan fungsi lainnya, membuat microkernels menarik.
sumber