Linux çekirdeği kendini nasıl derleyebilir?


89

Makineme bir Linux sistemi kurduğumda Linux çekirdeğinin derleme sürecini tam olarak anlamıyorum.

İşte kafamı karıştıran bazı şeyler:

  1. Çekirdek C ile yazılmıştır, ancak bir derleyici kurulmadan çekirdek nasıl derlendi?
  2. Çekirdek derlenmeden önce makineme C derleyicisi kuruluysa, derleyici kurulmadan derleyicinin kendisi nasıl derlenebilir?

Birkaç gün kafam çok karıştı, cevabın için teşekkürler.


Bilindiği kadarıyla, C-derleyicisi, belirli bir bilgisayar için UNIX'i derlemek için AT&T laboratuarlarında bazı çılgın ve zeki kişiler tarafından bir tür assambler tarafından yazılmıştır (unutmayın ki tarih linux değil, UNIX ile başlar, bu yüzden korkarım sizden bir bölümü özledim ... veya birkaçını! Kısa hikaye, bu bilgisayarlar C dili için uygun bir derleyiciye sahip olduğu sürece, farklı bilgisayarlar için unix çekirdeğini yeniden yazmaya gerek olmadığıdır. Bu derleyiciler, hedef bilgisayarların belirli bir düzenleyicisinde yazılmıştır. Roughty "İlk derleyici verilen bilgisayarın assambler'ında yazdı, sonra UNIX C olarak yazdı"
Victor

Yanıtlar:


208

Linux kutunuz için ilk ikili dosyalar, başka bir Linux kutusu (muhtemelen) üzerine oluşturulmuştur.

İlk Linux sistemi için ikili dosyalar başka bir platform üzerine inşa edildi .

Bu bilgisayar için ikili dosyalar, köklerini başka bir platformda oluşturulmuş orijinal bir sisteme kadar izleyebilir .

...

Bunu yeterince ileri itin ve daha ilkel araçlarla oluşturulmuş derleyiciler bulursunuz, bunlar da ana bilgisayarları dışındaki makinelerde oluşturulur.

...

Bastırmaya devam edin ve makinenin ön panelindeki anahtarlar ayarlanarak talimatlarının girilebileceği şekilde yapılmış bilgisayarlar bulacaksınız .

Çok güzel şeyler.

Kural, "araçları oluşturmak için araçlar oluşturmak ..." şeklindedir. Fiziksel çevremizi çalıştıran araçlara çok benziyor. "Kendinizi önyüklemelerle yukarı çekmek" olarak da bilinir.


3
İlle de kirli değil. Sadece optimize edilmemiş. ilk derleyici 386 üzerinde çalışacak şekilde optimize edilecek, ancak yeniden derlenen sürüm, sahip olduğunuz mimariye göre optimize edilecek.
Breton

1
Üçüncü bir aşama ekleyebilirsiniz, her şey yolundaysa, ikinci aşama çıkışı üçüncü aşamanın çıktısına eşit olmalıdır.
Ismael

27
Bu sadece yazılım değil, donanım. Bilgisayar olmadan P4 (hatta 486) gibi bir şey yapılamaz.
BCS

1
@BCS: Oh, evet. Yazılım ve donanım araçlarının birbiriyle derinden bağlantılı ve birbirine bağlı olduğu noktaya ulaştık.
dmckee --- eski moderatör kedicik

4
"Çalışan karmaşık bir sistemin her zaman çalışan basit bir sistemden evrimleştiği görülmüştür." en.wikipedia.org/wiki/Gall's_law
ajuc

33

Bence aşağıdakileri ayırt etmelisiniz:

derlemek , v: Kaynak kodunu işlemek ve yürütülebilir kod [1] üretmek için bir derleyici kullanmak .

ve

install , v: Bağlanmak, kurmak veya kullanmak için bir şeyler hazırlamak [2] .

Derleme, kaynak koddan ikili çalıştırılabilir dosyalar üretir. Kurulum yalnızca bu ikili yürütülebilir dosyaları daha sonra çalıştırmak için doğru yere koyar. Bu nedenle, eğer ikili dosyalar mevcutsa kurulum ve kullanım derleme gerektirmez. Buna göre "pişir" ve "servis et" gibi "derle" ve "kur" hakkında düşünün.

Şimdi sorularınız:

  1. Çekirdek C ile yazılmıştır, ancak bir derleyici kurulmadan çekirdek nasıl derlendi?

Çekirdek bir derleyici olmadan derlenemez, ancak derlenmiş bir ikiliden kurulabilir .

Genellikle, bir işletim sistemi kurduğunuzda, önceden derlenmiş bir çekirdek (ikili çalıştırılabilir) kurarsınız. Başkası tarafından derlendi. Ve yalnızca çekirdeği kendiniz derlemek istiyorsanız, kaynağa, derleyiciye ve diğer tüm araçlara ihtiyacınız vardır.

Gentoo gibi "kaynak tabanlı" dağıtımlarda bile derlenmiş bir ikiliyi çalıştırarak başlarsınız.

Böylece, çekirdek derlemeden tüm hayatınızı yaşayabilirsiniz, çünkü onları başkası tarafından derlemiş olursunuz.

  1. Çekirdek derlenmeden önce makineme C derleyicisi kuruluysa, derleyici kurulmadan derleyicinin kendisi nasıl derlenebilir?

Çekirdek (OS) yoksa derleyici çalıştırılamaz. Bu nedenle derleyiciyi çalıştırmak için derlenmiş bir çekirdek kurmanız gerekir, ancak çekirdeği kendisinin derlemesine gerek yoktur .

Yine, en yaygın uygulama, derleyicinin derlenmiş ikili dosyalarını kurmak ve bunları başka herhangi bir şeyi (derleyicinin kendisi ve çekirdek dahil) derlemek için kullanmaktır.

Şimdi, tavuk ve yumurta sorunu. İlk ikili başka biri tarafından derlenmiştir ... dmckee'nin mükemmel bir cevabına bakın.


14

Bu fenomeni tanımlayan terim önyükleme , üzerinde okumak için ilginç bir kavram. Gömülü geliştirme hakkında düşünürseniz, alarm saatleri, mikrodalgalar, uzaktan kumandalar gibi yazılım gerektiren birçok cihazın kendi yazılımlarını derleyecek kadar güçlü olmadığı anlaşılır. Aslında, bu tür aygıtlar genellikle bir derleyici kadar karmaşık bir şeyi uzaktan çalıştırmak için yeterli kaynağa sahip değildir.

Yazılımları bir masaüstü makinede geliştirilir ve derlendikten sonra kopyalanır.

Bu tür şeyler ilginizi çekiyorsa, aklıma ilk gelen bir makale şudur: Güven Üzerine Düşünceler ( pdf ), bu bir klasik ve eğlenceli bir okuma.


1
Çapraz derlemeyi önyükleme ile karıştırıyorsunuz. Birincisi, yalnızca bir PC'de bulunan ve hedef mimari için işlem kodları oluşturan bir derleyiciyi içerir. Açıkçası, bunu başka bir bilgisayar olmadan yapamazsınız, bu yüzden bir tavuk ve yumurta ikilemi vardır. İkilemin cevabı, daha karmaşık bir derleyici oluşturmak için el yazısıyla yazılmış veya önceden var olan basit bir derleyicinin kullanıldığı önyüklemedir.
Kevin Vermeer

12

Çekirdek kendini derlemez - kullanıcı alanında bir C derleyicisi tarafından derlenir. Çoğu CPU mimarisinde, CPU'nun o anda çalışan kodun sahip olduğu ayrıcalıkları temsil eden özel yazmaçlarda birkaç bit vardır. X86'da bunlar , kod segmenti (CS) kaydındaki geçerli ayrıcalık seviyesi bitleridir (CPL) . CPL bitleri 00 ise, kodun çekirdek modu olarak da bilinen güvenlik halkası 0'da çalıştığı söylenir . CPL bitleri 11 ise, kodun aynı zamanda kullanıcı modu olarak da bilinen güvenlik halkası 3'te çalıştığı söylenir . Diğer iki kombinasyon, 01 ve 10 (sırasıyla güvenlik halkaları 1 ve 2) nadiren kullanılır.

Kullanıcı kipine karşı çekirdek kipinde hangi kodun yapıp yapamayacağına dair kurallar oldukça karmaşıktır, ancak kullanıcı kipinin ayrıcalıkları ciddi şekilde azalttığını söylemek yeterlidir.

Şimdi, insanlar bir işletim sisteminin çekirdeğinden bahsettiklerinde, işletim sisteminin kodunun yükseltilmiş ayrıcalıklarla çekirdek modunda çalıştırılan kısımlarına atıfta bulunuyorlar. Genellikle çekirdek yazarları, güvenlik nedenleriyle çekirdeği olabildiğince küçük tutmaya çalışırlar, böylece ekstra ayrıcalıklara ihtiyaç duymayan kod bunlara sahip olmaz.

C derleyicisi, böyle bir programın bir örneğidir - çekirdek modunun sunduğu ekstra ayrıcalıklara ihtiyaç duymaz, bu nedenle diğer programların çoğu gibi kullanıcı modunda çalışır.

Linux durumunda, çekirdek iki bölümden oluşur: çekirdeğin kaynak kodu ve çekirdeğin derlenmiş yürütülebilir dosyası. C derleyicisine sahip herhangi bir makine, çekirdeği kaynak koddan ikili görüntüye derleyebilir. O halde soru, bu ikili görüntüyle ne yapılacağıdır.

Linux'u yeni bir sisteme kurduğunuzda, genellikle fiziksel medyadan (CD DVD gibi) veya ağdan önceden derlenmiş bir ikili imaj yüklersiniz. BIOS, çekirdeğin (ikili görüntüsünün) önyükleyicisini ortamdan veya ağdan yükleyecek ve ardından önyükleyici (ikili görüntüsünü) çekirdeği sabit diskinize yükleyecektir. Ardından, yeniden başlattığınızda, BIOS çekirdeğin önyükleyicisini sabit diskinizden yükler ve önyükleyici çekirdeği belleğe yükler ve siz çalışırsınız.

Kendi çekirdeğinizi yeniden derlemek istiyorsanız , bu biraz daha yanıltıcıdır, ancak yapılabilir.


5

Önce hangisi vardı? tavuk mu yumurta mı?

Yumurtalar dinozorların zamanından beri ortalıkta ...

..bazıları tavukların aslında büyük canavarların torunları olduğunu söyleyerek her şeyi karıştırıyor .. uzun lafın kısası: Teknoloji (Yumurta) Mevcut üründen (Tavuk) önce de vardı

Bir kernel oluşturmak için bir çekirdeğe ihtiyacınız var, yani birini diğeriyle oluşturursunuz.

İlk çekirdek istediğiniz herhangi bir şey olabilir (tercihen istediğiniz son ürünü oluşturabilecek mantıklı bir şey ^ __ ^)

Bran's Kernel Development tarafından hazırlanan bu öğretici , daha sonra seçtiğiniz bir Sanal Makine ile test edebileceğiniz küçük bir çekirdek geliştirmeyi ve oluşturmayı öğretir.

Anlamı: bir yerde bir çekirdek yazar ve derlersiniz ve onu boş (işletim sistemi olmayan) bir sanal makinede okursunuz.

Bu Linux kurulumlarında olan şey, ek karmaşıklıkla aynı fikri takip eder.


5

Tüm yol kaplumbağalar değil. Tıpkı sizin de söylediğiniz gibi, daha önce hiç derlenmemiş bir işletim sistemini o işletim sistemini çalıştıran bir sistemde derleyemezsiniz. Benzer şekilde, bir derleyicinin en azından ilk derlemesi başka bir derleyicide yapılmalıdır (ve genellikle sonraki derlemeler de, eğer bu ilk derleme henüz kendi kaynak kodunu derleyemezse).

Sanırım ilk Linux çekirdekleri bir Minix kutusunda derlendi, ancak bundan emin değilim. GCC o sırada mevcuttu. Birçok işletim sisteminin en erken hedeflerinden biri, kendi kaynak kodunu derlemek için yeterince iyi bir derleyici çalıştırmaktır. Daha da ileri giderek, ilk derleyici neredeyse kesin olarak assembly dilinde yazılmıştır. İlk derleyiciler, ham makine koduyla yazmak zorunda kalan zavallı insanlar tarafından yazılmıştır.

Linux From Scratch projesine göz atmak isteyebilirsiniz . Aslında kitapta iki sistem oluşturuyorsunuz: kendiniz oluşturmadığınız bir sistem üzerine kurulmuş bir "geçici sistem" ve sonra geçici sisteminize kurulan "LFS sistemi". Kitabın şu anda yazıldığı gibi, aslında geçici sistemi başka bir Linux kutusu üzerine kurarsınız, ancak teoride onu geçici sistemi tamamen farklı bir işletim sistemi üzerine kuracak şekilde uyarlayabilirsiniz.


1

Sorunuzu doğru anlıyorsam. Çekirdek bugünlerde "kendini derlemiyor". Günümüzde çoğu Linux dağıtımı, Linux canlı CD'si aracılığıyla sistem kurulumu sağlar. Çekirdek CD'den belleğe yüklenir ve normalde diske kurulmuş gibi çalışır. Sisteminizde çalışan bir linux ortamı ile gerekli dosyaları diskinize kaydetmeniz kolaydır.

Önyükleme sorunundan bahsediyorsan; dmckee bunu oldukça güzel özetledi.

Sadece başka bir olasılık sunuyor ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.