Neden Linux çekirdeği 15+ milyon kod satırı? [kapalı]


109

Bu monolitik kod tabanının içeriği nedir?

İşlemci mimarisi desteği, güvenliği ve sanallaştırmayı anlıyorum, ancak 600.000'den fazla satır olduğunu hayal edemiyorum.

Çekirdek kod tabanındaki sürücülerin tarihsel ve güncel nedenleri nelerdir?

Bu 15+ milyon hat, şimdiye kadar her donanım için her bir sürücüyü içeriyor mu? Eğer öyleyse, o zaman soru sorulur, sürücüler neden çekirdeğe gömülüdür ve otomatik olarak algılanan ve donanım kimlikleriyle yüklenen paketleri ayrı değiller?

Kod tabanının boyutu, depolama kısıtlamalı veya hafıza kısıtlamalı cihazlar için bir sorun mu?

Tüm bunlar gömülü olsaydı, alan kısıtlı ARM cihazları için çekirdek boyutunu şişiriyor gibi görünüyor. Önişlemci tarafından çok fazla satır ayrılmış mı? Bana deli diyebilirsin, ama anladığım şeyi çalıştırmak için bu kadar mantığa ihtiyaç duyan bir makinenin bir çekirdeğin rolü olduğunu hayal edemiyorum.

Görünüşe göre gittikçe artan doğası nedeniyle, büyüklüğün 50+ yıl içinde bir sorun olacağına dair kanıt var mı?

Sürücüleri dahil etmek, donanım yapıldığında büyümek anlamına gelir.

EDIT : Bunu düşünenler için çekirdeğin doğası olduğunu, bazı araştırmalardan sonra her zaman olmadığını anladım. Carnegie Mellon'un mikro çekirdeği Mach'ı 'genellikle 10.000 kod satırı altında' bir örnek olarak listelendiğinden , bu kadar büyük bir çekirdeğe ihtiyaç duyulmaz.


9
2012 yılında sadece sürücüler için 5 milyondan fazla hattı vardı. Farklı işlemci mimarilerini desteklemek için 1,9 milyon hat. Daha fazla bilgi h-online.com/open/features/…
steve

11
Evet, bir dil için bir derleyici, sözcüksel analizör ve bayt kod üreteci kodladım ve tam artıran bir sonuç alıyordu ve 10.000 satır almadı.
Jonathan

5
(şimdi baktı, yaklaşık 2.700 satırdı)
Jonathan

4
make menuconfigOluşturmadan önce kodun ne kadarının etkinleştirildiğini / devre dışı bırakılabileceğini görmek için indirmeniz ve yapılandırmanız gerekir .
casey

6
@JonathanLeaders: Mandelbrots'u test eden test programları ile LISP benzeri diller için 100'den az satırda komple derleyiciler oluşturdum. Her zaman bağlıdır.
phresnel

Yanıtlar:


43

Sürücüler çekirdek içerisinde tutulur, bu nedenle bir çekirdek değişikliği bir işlevin tüm kullanıcıları için genel bir arama ve değiştirme (veya arama ve el değiştirme) gerektirdiğinde, değişikliği yapan kişi tarafından yapılır. Sürücünüzü API değişiklikleri yapan kişilerce güncellemek, daha yeni bir çekirdeği derlemediğinde kendin yapmak zorunda kalmak yerine çok hoş bir avantajdır.

Alternatif (ağacın dışında tutulan sürücüler için olan şey), yamanın herhangi bir değişikliğe ayak uydurabilmesi için bakım sağlayıcıları tarafından yeniden senkronize edilmesi gerektiğidir.

Hızlı bir arama, ağaç içi ya da ağaç dışı sürücü gelişimi hakkında bir tartışma yaptı .

Linux'un sürdürülme biçimi çoğunlukla her şeyi ana hat deposunda tutmaktır. Küçük soyulmuş çekirdeğin oluşturulması, kontrol etmek için yapılandırma seçenekleriyle desteklenir #ifdef. Böylece, tüm depodaki kodun sadece küçük bir bölümünü derleyen minik soyulmuş çekirdekler oluşturabilirsiniz.

Linux'un gömülü sistemlerde yaygın kullanımı , çekirdek kaynak ağacının daha küçük olduğu yıllardan daha önce Linux'tan daha fazla malzeme bırakma konusunda daha iyi destek sağlamıştır. Süper minimal 4.0 çekirdek, süper minimal 2.4.0 çekirdekten daha küçüktür.


4
Şimdi THIS bana neden tüm kodların bir araya getirilmesinin mantıklı olduğu konusunda mantıklı geliyor, bilgisayar saatlerini ve aşırı bağımlılık maliyetlerinden tasarruf ediyor.
Jonathan,

8
@JonathanLeaders: evet, çok aktif olmayan bakımı olan sürücüler için bit-çürümesini önler. Çekirdek değişiklikleri göz önüne alındığında, tüm sürücü kodunun çevrede bulunması da muhtemelen yararlıdır. Bazı dahili API'lerin tüm arayanlarını aramak, düşünmeyi düşündüğünüz bir şekilde kullanan ve muhtemelen düşündüğünüz bir değişikliği etkileyebilecek bir sürücüyü açabilir.
Peter Cordes

1
@JonathanLeaders, sanki bir bilgisayara yüklemek için yapılan modern ölçümlerde, fazladan satırlar fazladan yer kaplar gibi.
Junaga

3
@ Junaga: linux'un çok taşınabilir ve ölçeklenebilir olduğunu biliyorsun, değil mi? 32 MB'lık gömülü bir sistemde kalıcı olarak kullanılan 1 MB'lık çekirdek belleğini boşa harcamak çok önemlidir. Kaynak kod boyutu önemli değil, derlenmiş ikili boyut yine de önemlidir. Çekirdek hafızası disk belleği değildir, bu nedenle takas alanı olsa bile geri alamazsınız.
Peter Cordes

1
@Rolf: Büyük, ama spagetti değil . Şu anda çekirdek kod ve sürücüler arasında ileri geri 2 yönlü bağımlılıklar olmadan oldukça iyi tasarlandı. Sürücüler çekirdek çekirdeğini kırmadan bırakılabilir. Bir iç işlev veya API yeniden yapılandırıldığında sürücülerin onu farklı şekilde kullanması gerekir, sürücülerin değişmesi gerekebilir, ancak bu yeniden düzenleme için normaldir.
Peter Cordes

79

3.13’e karşı yapılan cloc’a göre , Linux yaklaşık 12 milyon satırlık bir kod satırı.

  • Sürücülerde 7 milyon LOC /
  • Kemer içinde 2 milyon LOC /
  • çekirdekte yalnızca 139 bin LOC /

lsmod | wc Debian dizüstü bilgisayarımda çalışma zamanında yüklenen 158 modülleri gösteriyor; bu nedenle dinamik olarak yükleme modülleri, donanımı desteklemek için çok kullanılan bir yöntem.

Sağlam yapılandırma sistemi (örneğin make menuconfig) (kod sizin bakış, ve daha derlemeye hangi kod seçmek için kullanılır değil derleme). Gömülü sistemler, kendi .configdosyalarını yalnızca ilgilendikleri donanım desteğiyle tanımlar (çekirdeğe yerleşik donanım desteği veya yüklenebilir modüller dahil).


3
modülleri saymak yeterli değil, belki config tarafından yerleşik bir çok şey var
Alex

5
Bundan, Linux çekirdeğinin devasa olduğu sonucuna varabiliriz, çünkü çılgınca karmaşık olduğu için her türlü cihaz konfigürasyonunu destekliyor. Burada 15m çizgilerin çok azının kullanımda olduğunu görüyoruz. Her şey olduğu gibi, her ne kadar aşırı karmaşık olsa da, en azından geceleri uyuyabildiğini bilerek uyuyabiliriz
Jonathan

2
@JonathanLeaders: Evet - ve tuhaf cihazlar için modüller olduğu gibi, gizli dosya sistemleri, ağ protokolleri vb. İçin modüller de var ...
psmears

6
@JonathanLeader Linux'un ne zaman başladığını hatırlıyorum - yükleyicinin çalışmasını sağlamak (hatta bir yükleyici olsa bile) çok büyük bir acıydı - fare sürücünüzü manuel olarak seçmeniz gereken bazı dağıtımlar var . Ağ oluşturma veya korusun, X-window, çalışma gibi şeyler yapmak, bir geçiş ayiniydi. İlk Red Hat kurulumumda, kendi grafik sürücümü yazmak zorunda kaldım, çünkü sadece üç (!) Sürücü vardı. Temel bilgilerin varsayılan olarak çalışması bir olgunluk belirtisidir - ve açıkçası, sadece birkaç HW kombinasyonunun bulunduğu gömülü bir sistemde çok daha fazla değişiklik yapabilirsiniz.
Luaan

2
@JonathanLeaders Düşündüğünüz gibi, kaynaktaki LOC az ya da çok önemli değil. Çekirdeğin ne kadar bellek kullandığını bilmek istiyorsanız , çok daha doğrudan yollar var .
goldilocks

67

Merak eden herkes için, GitHub aynasının satır sayısının açıklaması:

=============================================
    Item           Lines             %
=============================================
  ./usr                 845        0.0042
  ./init              5,739        0.0283
  ./samples           8,758        0.0432
  ./ipc               8,926        0.0440
  ./virt             10,701        0.0527
  ./block            37,845        0.1865
  ./security         74,844        0.3688
  ./crypto           90,327        0.4451
  ./scripts          91,474        0.4507
  ./lib             109,466        0.5394
  ./mm              110,035        0.5422
  ./firmware        129,084        0.6361
  ./tools           232,123        1.1438
  ./kernel          246,369        1.2140
  ./Documentation   569,944        2.8085
  ./include         715,349        3.5250
  ./sound           886,892        4.3703
  ./net             899,167        4.4307
  ./fs            1,179,220        5.8107
  ./arch          3,398,176       16.7449
  ./drivers      11,488,536       56.6110
=============================================

driversBir katkı çok linecount arasında.


19
İlginç. Daha da ilginç grep -Pir "\x66\x75\x63\x6b" /usr/src/linux/ | wc -l
olanı

4
@jimmij '\ x73 \ x68 \ x69 \ x74', bu çığır açan araştırmalara göre daha yaygın olabilir .
Nick T

3
Rastgele gerçek: OP tarafından tahmin edilen 600 000 LOC'ye daha yakın olan klasör belgedir.
Davidmh

1
./documentation500.000'den fazla kod satırı var mı? ....ne?
C_B

1
@drewbenn Daha fazlasını anladım "belgeler boş değil mi?"
Izkata

43

Şu ana kadarki cevaplar “çok fazla kod var” gibi görünüyor ve hiç kimse soruyu en mantıklı cevapla çözemiyor : 15M +? NE OLMUŞ YANİ? 15M kaynak kod satırının balık fiyatıyla ne ilgisi var? Bunu bu kadar düşünülemez yapan şey nedir?

Linux açıkça çok şey yapıyor. Her şeyden çok daha fazlası ... Ancak puanlarınızdan bazıları, inşa edildiğinde ve kullanıldığında neler olduğuna saygı göstermediğinizi gösteriyor.

  • Her şey derlenmedi. Çekirdek yapı sistemi, kaynak kod kümelerini seçen yapılandırmaları hızlı bir şekilde tanımlamanıza izin verir. Bazıları deneysel, bazıları eski, bazıları ise sadece her sistem için gerekli değildir. Şuna /boot/config-$(uname -r)(Ubuntu'da) make menuconfigbakın, ne kadar dışlandığını göreceksiniz.

    Ve bu değişken hedefli bir masaüstü dağıtımıdır. Gömülü bir sistemin konfigürasyonu sadece ihtiyaç duyduğu şeyleri alır.

  • Her şey yerleşik değil. Yapılandırmamda, Çekirdek özelliklerinin çoğu modüller olarak oluşturulmuştur:

    grep -c '=m' /boot/config-`uname -r`  # 4078
    grep -c '=y' /boot/config-`uname -r`  # 1944
    

    Açık olmak gerekirse, bunların hepsi yerleşik olabilir ... Tıpkı yazdırılıp devasa bir kağıt sandviç haline getirilebildikleri gibi. Kesikli bir donanım işi için özel bir yapı oluşturmadıysanız, bu mantıklı olmazdı (bu durumda, bu öğelerin sayısını zaten kısalmış olacaktınız).

  • Modüller dinamik olarak yüklenmiştir. Bir sistemde mevcut binlerce modül olmasına rağmen, sistem tam ihtiyacınız olan şeyleri yüklemenizi sağlar. Çıktıları karşılaştırın:

    find /lib/modules/$(uname -r)/ -iname '*.ko' | wc -l  # 4291
    lsmod | wc -l                                         # 99
    

    Neredeyse hiçbir şey yüklenmedi.

  • Mikro çekirdekler aynı şey değil. Giden görüntüye bakarak sadece 10 saniye Vikipedi sayfasından size bağlı onlar tamamen farklı bir şekilde dizayn edilmiştir vurgulamak istiyorum.

    Linux sürücüleri kullanıcı alanı değil içselleştirilir (çoğunlukla dinamik olarak yüklenmiş modüller olarak) ve dosya sistemleri benzer şekilde içseldir. Bu neden harici sürücü kullanmaktan daha kötü? Genel amaçlı hesaplamalarda neden mikro daha iyidir?


Yorumlar yine alamayacağınızı vurgulamaktadır. Linux'u ayrı bir donanıma dağıtmak istiyorsanız (örn. Havacılık, bir TiVo, tablet, vb.), Yalnızca ihtiyacınız olan sürücüleri oluşturacak şekilde yapılandırın . Aynı şeyi masaüstünüzde de yapabilirsiniz make localmodconfig. Sıfır esnekliğe sahip küçük bir amaç amaçlı Çekirdek yapısı ile bitirdiniz.

Ubuntu gibi dağıtımlar için tek bir 40 MB Çekirdek paketi kabul edilebilir. Hayır, fırçalayın, 4000'den fazla kayan modülü paketler gibi tutmak büyük arşivleme ve indirme senaryosuna tercih edilir. Onlar için daha az disk alanı kullanıyor, derleme zamanında paketlenmesi daha kolay, saklaması daha kolay ve kullanıcıları için daha iyi (sadece çalışan bir sisteme sahip).

Gelecek de bir sorun olarak görünmüyor. CPU hızı, disk yoğunluğu / fiyatlandırma ve bant genişliği iyileştirmeleri oranı, Çekirdeğin büyümesinden çok daha hızlı görünüyor. 10 yıl içinde 200 MB’lık bir Çekirdek paketi dünya olmazsa son olmaz.

Aynı zamanda tek yönlü bir yol değil. Kod korunmazsa kovulur.


2
Endişe, gömülü sistemler içindir. Gösterdiğiniz gibi, kendi sisteminizde kullanılmayan 4.000 modülünüz var. Bazı küçük robotik veya havacılık uygulamalarında, (READ: genel amaçlı hesaplama değil) bu kabul edilemez atıklardır.
Jonathan

2
@JonathanLeaders Onları güvenle silebileceğinizi düşünüyorum. Bir masaüstü kurulumunda, aniden bir USB portuna bir şey takmanız veya bazı donanım konfigürasyonlarını vs. değiştirmeniz durumunda
Didier A.

1
Evet kesinlikle. Hala en yazılır "Eğer bu nedenle kodun 15m hatları gereken herhangi bir zamanda bir USB cihazı takın olabilir" gibi varsayımlar ile sürpriz kalır çekirdek telefon Eleştiri çeşitli kullanılan Linux gibi görerek, dağıtımın düzeyinde düzeyinde değil, gömülü cihazlar. Eh, dağıtıma tahmin yapar başlıbaşına listeyi itlaf. Sadece takılabilirlik desteğinin eklenebilir ve çıkarılabilir olması gerektiğini düşünmekteydim, IE bir distro, çekirdeğin mevcut boyutunun yüzde biri olmasını söyleyen gömülü ARM konfigürasyonlarının aksine, paket kaynakları ekleyerek 'tercih etmeyi' tercih ederdi
Jonathan

5
@JonathanLeaders , gömülü bir sistemde masaüstü için yapılandırılmış bir çekirdeği asla çalıştırmazsınız . Gömülü sistemimiz 13 modüle sahiptir ve ihtiyaç duymadığımız tüm donanım desteğini kaldırmıştır (diğer birçok özelleştirmeyle birlikte). Masaüstü bilgisayarları gömülü sistemlerle karşılaştırmayı bırakın. Linux iyi çalışıyor çünkü her şeyi destekliyor ve yalnızca önem verdiğiniz şeyleri içerecek şekilde özelleştirilebilir . Ve bu 4k modülleri masaüstü sistemler için gerçekten harika: son dizüstü bilgisayarım öldüğünde, sabit diski daha yeni bir dizüstü bilgisayara yerleştirdim ve her şey çalıştı .
drewbenn

3
Aksi halde, bu iyi / değerli cevap açıkça kızgın ve savaşçı bir tondan muzdariptir. -1.
TipIA

19

Linux tinyconfig derlenmiş kaynaklar satır sayısı tinyconfig kabarcık grafik svg (keman)

Çekirdek derlemesinden json oluşturmak için kabuk betiği , http://bl.ocks.org/mbostock/4063269 ile kullanın.


Düzenleme : çıktı unifdefbazı sınırlama var ( -Iyok sayılır ve -includedesteklenmiyor, ikincisi oluşturulan yapılandırma başlığını eklemek için kullanılır) bu noktada catçok fazla değişmez:

274692 total # (was 274686)

komut dosyası ve prosedür güncellendi.


Sürücülerin yanı sıra, kemer vb. Seçilen yapılandırmaya bağlı olarak derlenmiş veya derlenmemiş çok sayıda koşullu kod var, kod mutlaka dinamik yüklü modüllerde değil, çekirdekte yerleşik.

Bu yüzden, indirilen linux-4.1.6 kaynakları , tinyconfig'i seçti, modülleri etkinleştirmiyor ve dürüstçe ne etkinleştirdiğini ya da bir kullanıcının çalışma zamanında, onunla ne yapabileceğini bilmiyorum: çekirdeği yapılandır:

# tinyconfig      - Configure the tiniest possible kernel
make tinyconfig

çekirdeği inşa

time make V=1 # (should be fast)
#1049168 ./vmlinux (I'm using x86-32 on other arch the size may be different)

çekirdek oluşturma işlemi , dosyaları *.cmdoluşturmak .o, bu dosyaları işlemek ve hedef ve bağımlılıkları kopyalamak için script.shaşağıdaki komut satırına dahil edilen gizli dosyaları bırakır ve bunları find ile kullanır :

find -name "*.cmd" -exec sh script.sh "{}" \;

Bu, .oadlandırılan hedefin her bağımlılığı için bir kopya oluşturur..o.c

.c kodu

find -name "*.o.c" | grep -v "/scripts/" | xargs wc -l | sort -n
...
   8285 ./kernel/sched/fair.o.c
   8381 ./kernel/sched/core.o.c
   9083 ./kernel/events/core.o.c
 274692 total

h başlıkları (sterilize edilmiş)

make headers_install INSTALL_HDR_PATH=/tmp/test-hdr
find /tmp/test-hdr/ -name "*.h" | xargs wc -l
...
  1401 /tmp/test-hdr/include/linux/ethtool.h
  2195 /tmp/test-hdr/include/linux/videodev2.h
  4588 /tmp/test-hdr/include/linux/nl80211.h
112445 total

@JonathanLeaders üzerinde çalışırken çok eğlenceliydi, sevdiği birine sevindim
Alex

9

Monolitik çekirdeklerin yörüngeleri, en başından beri Tananbaum ve Torvalds arasında tartışıldı. Her şey için kullanıcı alanına girmeniz gerekmiyorsa, çekirdeğin arayüzü daha basit olabilir. Eğer çekirdek monolitik ise, o zaman dahili olarak daha fazla optimize edilebilir (ve daha fazla dağınık!).

Bir süredir uzlaşma olarak modüllerimiz oldu. Ve DPDK gibi şeylerle devam ediyor (daha fazla ağ işlevselliğini çekirdek dışına taşıyor). Daha fazla çekirdek eklendikçe, kilitlenmekten kaçınmak önemlidir; bu yüzden daha fazla şey kullanıcı alanına taşınır ve çekirdek küçülür.

Monolitik çekirdeklerin tek çözüm olmadığını unutmayın. Bazı mimarilerde, çekirdek / kullanıcı alanı sınırı diğer işlev çağrılarından daha pahalı değildir ve bu da mikro çekirdeği çekici kılar.


1
"Bazı mimarilerde, çekirdek / kullanıcı alanı sınırı, diğer işlev çağrılarından daha pahalı değildir" - ilginç! Hangi mimarlık olurdu? En azından herhangi bir tür hafıza korumasından vazgeçmiyorsanız çıkarmanız inanılmaz zor görünüyor.
Voo

1
Tüm Ivan Goddard'ın millcomputing.com videolarına baktım (değirmen / kemer işlemci, çok VLIW benzeri). Bu özel iddia, merkezi bir tema ve güvenlik videosuna ulaşana kadar etkileri açık değil. Simülasyondaki bir POC mimarisi, ancak muhtemelen bu özelliğe sahip tek mimari değil.
Rob

1
Ah bu onu açıklar. Tecrübelerime göre (ve endüstriyi yakından takip etmediğimi itiraf eden ilk kişi ben olacağım), birçok simüle edilmiş mimar var ve lastikler yola koyulur vurmaz, iddialarını yerine getirecek pek az insan var. gerçek donanımda. Bunun arkasındaki fikir her ne kadar ilginç olsa da - belirli bir CPU'dan ilk söz edilmediği zaman. Bu özelliğe sahip mevcut bir mimari bulursanız, gerçekten ilgilenirim.
Voo

1
BTW burada bahsettiğiniz tartışma hakkında daha fazla kaynak var: en.wikipedia.org/wiki/Tanenbaum%E2%80%93Torvalds_debate
Jonathan
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.