Bagaimana kernel Linux mengkompilasi sendiri?

89

Saya tidak begitu mengerti proses kompilasi kernel Linux ketika saya menginstal sistem Linux di komputer saya.

Berikut beberapa hal yang membuat saya bingung:

  1. Kernel ditulis dalam C, namun bagaimana kernel dapat dikompilasi tanpa kompilator diinstal?
  2. Jika kompilator C diinstal pada mesin saya sebelum kernel dikompilasi, bagaimana kompilator itu sendiri dapat dikompilasi tanpa kompilator diinstal?

Saya sangat bingung selama beberapa hari, terima kasih atas tanggapannya.

MainID
sumber
sejauh yang diketahui, C-compiler ditulis dalam beberapa jenis assambler oleh beberapa orang gila dan pintar di lab AT&T untuk mengkompilasi UNIX untuk komputer tertentu (perhatikan bahwa sejarah dimulai dengan UNIX, bukan linux, jadi saya khawatir Anda lewatkan satu bab ... atau beberapa dari mereka!). Singkatnya adalah bahwa tidak perlu menulis ulang kernel unix untuk komputer yang berbeda selama komputer tersebut memiliki kompiler yang tepat untuk bahasa C. Kompiler tersebut ditulis dalam assambler spesifik dari komputer target. Kasar mengatakan "Kompiler pertama ditulis dalam assambler komputer tertentu, lalu UNIX ditulis dalam C"
Victor

Jawaban:

208

Putaran pertama binari untuk kotak Linux Anda dibangun di beberapa kotak Linux lain (mungkin).

Binari untuk sistem Linux pertama dibangun di atas beberapa platform lain .

Biner untuk komputer itu dapat melacak akarnya kembali ke sistem asli yang dibangun di atas platform lain .

...

Dorong sejauh ini, dan Anda akan menemukan kompiler yang dibangun dengan alat yang lebih primitif, yang pada gilirannya dibangun di atas mesin selain host mereka.

...

Teruslah mendorong dan Anda menemukan komputer yang dibangun sehingga instruksinya dapat dimasukkan dengan mengatur sakelar pada panel depan mesin .

Hal yang sangat keren.

Aturannya adalah "membangun alat untuk membangun alat untuk membangun alat ...". Sangat mirip dengan alat yang menjalankan lingkungan fisik kita. Juga dikenal sebagai "menarik diri dengan tali sepatu".

dmckee --- mantan moderator anak kucing
sumber
3
Belum tentu najis. Hanya tidak dioptimalkan. kompilator pertama akan dipilih untuk bekerja pada 386, tetapi versi yang telah dikompilasi ulang dioptimalisasi untuk arsitektur apa pun yang Anda miliki.
Breton
1
Anda dapat menambahkan tahap ketiga, jika semuanya baik-baik saja, keluaran tahap kedua harus sama dengan keluaran tahap ketiga.
Ismael
27
Ini bukan hanya perangkat lunak, tapi juga perangkat keras. Tidak ada cara seperti P4 (atau bahkan 486) dapat dibuat tanpa komputer.
BCS
1
@BCS: Oh, ya. Kami telah mencapai titik di mana perangkat lunak dan perangkat keras sangat terkait dan saling bergantung.
dmckee --- mantan moderator anak kucing
4
"Sistem kompleks yang berhasil selalu ditemukan telah berevolusi dari sistem sederhana yang berhasil." en.wikipedia.org/wiki/Gall's_law
ajuc
33

Saya pikir Anda harus membedakan antara:

kompilasi , v: Untuk menggunakan kompiler untuk memproses kode sumber dan menghasilkan kode yang dapat dieksekusi [1] .

dan

install , v: Untuk menghubungkan, mengatur atau menyiapkan sesuatu untuk digunakan [2] .

Kompilasi menghasilkan executable biner dari kode sumber. Instalasi hanya menempatkan executable biner tersebut di tempat yang tepat untuk menjalankannya nanti. Jadi, instalasi dan penggunaan tidak memerlukan kompilasi jika binari tersedia. Pikirkan tentang "kompilasi" dan "instal" seperti tentang "masak" dan "sajikan".

Sekarang, pertanyaan Anda:

  1. Kernel ditulis dalam C, namun bagaimana kernel dapat dikompilasi tanpa kompilator diinstal?

Kernel tidak dapat dikompilasi tanpa kompiler, tetapi dapat diinstal dari biner yang telah dikompilasi.

Biasanya, ketika Anda menginstal sistem operasi, Anda menginstal kernel yang telah dikompilasi (binary executable). Itu disusun oleh orang lain. Dan hanya jika Anda ingin mengkompilasi kernel sendiri, Anda memerlukan source dan compiler, dan semua alat lainnya.

Bahkan dalam distribusi "berbasis sumber" seperti gentoo Anda mulai menjalankan biner terkompilasi.

Jadi, Anda dapat menjalani seluruh hidup Anda tanpa mengompilasi kernel, karena Anda telah menyusunnya oleh orang lain.

  1. Jika kompilator C diinstal pada mesin saya sebelum kernel dikompilasi, bagaimana kompilator itu sendiri dapat dikompilasi tanpa kompilator diinstal?

Kompiler tidak dapat dijalankan jika tidak ada kernel (OS). Jadi kita harus menginstal kernel yang telah dikompilasi untuk menjalankan kompilator, tetapi tidak perlu mengkompilasi sendiri kernel tersebut.

Sekali lagi, praktik yang paling umum adalah menginstal binari terkompilasi dari kompilator, dan menggunakannya untuk mengkompilasi yang lainnya (termasuk kompilator itu sendiri dan kernel).

Sekarang, masalah ayam dan telur. Biner pertama dikompilasi oleh orang lain ... Lihat jawaban yang sangat bagus dari dmckee.

sastanin
sumber
14

Istilah yang menjelaskan fenomena ini adalah bootstrap , sebuah konsep yang menarik untuk dibaca. Jika Anda berpikir tentang pengembangan yang disematkan, menjadi jelas bahwa banyak perangkat, misalnya jam alarm, gelombang mikro, kendali jarak jauh, yang membutuhkan perangkat lunak tidak cukup kuat untuk mengkompilasi perangkat lunak mereka sendiri. Faktanya, perangkat semacam ini biasanya tidak memiliki cukup sumber daya untuk menjalankan apa pun yang serumit kompiler.

Perangkat lunak mereka dikembangkan pada mesin desktop dan kemudian disalin setelah dikompilasi.

Jika hal semacam ini menarik minat Anda, artikel yang muncul di benak saya adalah: Refleksi Kepercayaan pada Kepercayaan ( pdf ), ini adalah artikel klasik dan menyenangkan.

a2800276
sumber
1
Anda membingungkan kompilasi silang dengan bootstrap. Yang pertama melibatkan kompiler yang hanya ada di PC, dan yang membuat opcode untuk arsitektur target. Jelas, Anda tidak dapat melakukannya tanpa komputer lain, jadi ada dilema ayam-dan-telur. Jawaban atas dilema ini adalah bootstrap, di mana kompilator sederhana yang ditulis tangan atau sudah ada sebelumnya digunakan untuk menghasilkan kompilator yang lebih kompleks.
Kevin Vermeer
12

Kernel tidak dapat dikompilasi sendiri - ini dikompilasi oleh kompiler C di userspace. Di sebagian besar arsitektur CPU, CPU memiliki sejumlah bit dalam register khusus yang mewakili hak istimewa yang dimiliki kode yang sedang berjalan. Dalam x86, ini adalah bit tingkat hak istimewa (CPL) saat ini dalam register segmen kode (CS). Jika bit CPL adalah 00, kode tersebut dikatakan berjalan di ring keamanan 0 , juga dikenal sebagai mode kernel . Jika bit CPL adalah 11, kode tersebut dikatakan berjalan di ring keamanan 3 , juga dikenal sebagai mode pengguna . Dua kombinasi lainnya, 01 dan 10 (cincin pengaman 1 dan 2 masing-masing) jarang digunakan.

Aturan tentang kode apa yang dapat dan tidak dapat dilakukan dalam mode pengguna versus mode kernel agak rumit, tetapi cukup untuk mengatakan, mode pengguna telah sangat mengurangi hak istimewa.

Sekarang, ketika orang berbicara tentang kernel dari sistem operasi, mereka mengacu pada bagian dari kode OS yang dapat dijalankan dalam mode kernel dengan hak istimewa yang ditinggikan. Umumnya, pembuat kernel mencoba menjaga kernel sekecil mungkin untuk alasan keamanan, sehingga kode yang tidak memerlukan hak istimewa tambahan tidak memilikinya.

Kompilator C adalah salah satu contoh dari program semacam itu - ia tidak memerlukan hak istimewa ekstra yang ditawarkan oleh mode kernel, jadi ia berjalan dalam mode pengguna, seperti kebanyakan program lain.

Dalam kasus Linux, kernel terdiri dari dua bagian: kode sumber kernel, dan kompilasi kernel yang dapat dieksekusi. Semua mesin dengan kompiler C dapat mengkompilasi kernel dari kode sumber ke dalam image biner. Pertanyaannya, kemudian, apa yang harus dilakukan dengan citra biner itu.

Saat Anda menginstal Linux di sistem baru, Anda menginstal image biner yang telah dikompilasi, biasanya dari media fisik (seperti CD DVD) atau dari jaringan. BIOS akan memuat bootloader (citra biner) kernel dari media atau jaringan, dan kemudian bootloader akan menginstal kernel (citra biner) ke dalam hard disk Anda. Kemudian, ketika Anda reboot, BIOS memuat bootloader kernel dari hard disk Anda, dan bootloader memuat kernel ke dalam memori, dan Anda mati dan berjalan.

Jika Anda ingin mengkompilasi ulang kernel Anda sendiri, itu sedikit lebih rumit, tetapi itu bisa dilakukan.

Adam Rosenfield
sumber
5

Yang mana yang lebih dulu? ayam atau telur?

Telur telah ada sejak zaman dinosaurus ..

.. beberapa membingungkan semuanya dengan mengatakan ayam sebenarnya adalah keturunan dari binatang buas .. singkat cerita: Teknologi (Telur) sudah ada sebelum produk Saat Ini (Ayam)

Anda membutuhkan kernel untuk membangun sebuah kernel, yaitu Anda membangun satu kernel dengan yang lain.

Kernel pertama dapat berupa apapun yang Anda inginkan (sebaiknya sesuatu yang masuk akal yang dapat membuat produk akhir yang Anda inginkan ^ __ ^)

Tutorial dari Bran's Kernel Development ini mengajarkan Anda untuk mengembangkan dan membangun kernel yang berukuran kecil yang kemudian dapat Anda uji dengan Mesin Virtual pilihan Anda.

Artinya: Anda menulis dan mengkompilasi kernel di suatu tempat, dan membacanya di mesin virtual (tanpa OS) kosong.

Apa yang terjadi dengan penginstalan Linux tersebut mengikuti ide yang sama dengan kompleksitas tambahan.

Ric Tokyo
sumber
5

Ini bukan kura-kura sepanjang jalan. Seperti yang Anda katakan, Anda tidak dapat mengompilasi sistem operasi yang belum pernah dikompilasi sebelumnya pada sistem yang menjalankan sistem operasi tersebut. Demikian pula, setidaknya build pertama dari kompilator harus dilakukan pada kompiler lain (dan biasanya beberapa build berikutnya juga, jika build pertama tersebut ternyata belum dapat mengompilasi kode sumbernya dulu).

Saya pikir kernel Linux pertama dikompilasi pada kotak Minix, meskipun saya tidak yakin tentang itu. GCC tersedia pada saat itu. Salah satu tujuan paling awal dari banyak sistem operasi adalah menjalankan kompiler dengan cukup baik untuk mengkompilasi kode sumbernya sendiri. Lebih jauh lagi, kompiler pertama hampir pasti ditulis dalam bahasa assembly. Perakit pertama ditulis oleh orang-orang malang yang harus menulis kode mesin mentah.

Anda mungkin ingin melihat proyek Linux From Scratch . Anda sebenarnya membangun dua sistem di buku ini: "sistem sementara" yang dibangun di atas sistem yang tidak Anda buat sendiri, dan kemudian "sistem LFS" yang dibangun di sistem sementara Anda. Cara penulisan buku ini, Anda sebenarnya membangun sistem sementara di kotak Linux lain, tetapi secara teori Anda dapat menyesuaikannya untuk membangun sistem sementara pada OS yang sama sekali berbeda.

The Spooniest
sumber
1

Jika saya memahami pertanyaan Anda dengan benar. Kernel tidak "mengkompilasi sendiri" hari ini. Kebanyakan distribusi Linux saat ini menyediakan instalasi sistem melalui live cd linux. Kernel dimuat dari CD ke dalam memori dan beroperasi seperti biasanya jika diinstal ke disk. Dengan lingkungan linux yang aktif dan berjalan di sistem Anda, mudah untuk memasukkan file yang diperlukan ke disk Anda.

Jika Anda berbicara tentang masalah bootstrap; dmckee menyimpulkannya cukup bagus.

Hanya menawarkan kemungkinan lain ...

in70x
sumber