Linux'u başka platform gereksinimlerine taşıma [kapalı]


28

Linux'un kullanılabilir olduğunu ve X86, ARM, PowerPC gibi birçok farklı platform için barındırıldığını biliyorum.

Ancak, taşıma açısından tam olarak ne gereklidir?

Anladığım kadarıyla, Linux C dilinde yazılmış bir yazılımdır. Bu nedenle, Linux'u orijinal olarak X86'dan ARM'e veya başkalarına aktarırken, yalnızca belirli hedef mimariye yönelik kodu derleyici ile yeniden derlemekten ibaret değil mi?

Farklı çevre birimleri için aygıt sürücülerini bir kenara bırakmak, Linux'u yeni bir mimariye taşırken başka ne yapılması gerekiyordu. Derleyici bizim için her şeyle ilgilenmiyor mu?


11
Mimarlığa özgü çekirdek kaynaklarına baktığınızı varsayabilir miyiz? git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/…
Kusalananda

Yanıtlar:


57

Linux çekirdeğindeki kodun çoğu C ile yazılmış olsa da, bu kodun çalıştığı ve bunu hesaba katması gereken platforma özgü olan birçok bölüm var.

Bunun özel bir örneği, çoğu mimaride benzer şekilde çalışan (sayfa tablolarının hiyerarşisi) aynı şekilde çalışan ancak her bir mimari için belirli ayrıntılara sahip (her bir mimarideki seviye sayısı gibi) ve bu x86'da bile artmakta olan sanal hafızadır. daha büyük yongaların tanıtılması.) Linux çekirdeği kodu, derleyici tarafından daha az sayıda sayfa tablosu seviyesine sahip mimariler üzerinde seçilebilecek bu sıradüzenlerin üstesinden gelmek için makrolar sunar (böylece kod C ile yazılır, ancak mimarinin ayrıntılarını alır) göz.)

Diğer birçok alan, her bir mimariye çok özeldir ve arşive özgü kodlarla ele alınması gerekir. Bunların çoğu derleme dilinde kod içeriyor. Örnekler:

  • Bağlam Anahtarlama : Bağlam anahtarlama, kapatılmakta olan işlem için tüm kayıtların değerinin kaydedilmesini ve kayıtların CPU'ya programlanmış işlem kümesinden geri yüklenmesini içerir. Hatta kayıt sayısı ve sayısı her mimariye özeldir. Bu kod tipik olarak, kayıtlara tam erişime izin vermek ve bağlam anahtarlama performansı sistem için kritik olabileceğinden olabildiğince hızlı çalıştığından emin olmak için montajda uygulanır.

  • Sistem Çağrıları : Kullanıcı alanı kodunun bir sistem çağrısını tetikleyebileceği mekanizma, genellikle mimariye özgüdür (ve bazen belirli CPU modeline bile, örneğin Intel ve AMD bunun için farklı talimatlar getirmiştir, eski CPU'lar bu talimatlara sahip olmayabilir. Çünkü bunlar hala benzersiz olacak.)

  • Kesin İşleyiciler : Kesmelerin nasıl ele alınacağına (donanım kesintileri) ilişkin detaylar genellikle platforma özgüdür ve genellikle platform için kullanılan belirli çağrı kurallarını ele almak için bir miktar montaj seviyesi yapıştırıcısı gerektirir. Ayrıca, kesintileri etkinleştirmek / devre dışı bırakmak için ilkeler genellikle platforma özgüdür ve montaj kodu da gerektirir.

  • Başlatma : Başlatma işleminin nasıl yapılması gerektiğinin ayrıntıları da genellikle platforma özgü ayrıntıları içerir ve genellikle çekirdeğe giriş noktasını işlemek için bazı montaj kodları gerektirir. Çok işlemcili (SMP) olan platformlarda, diğer işlemcileri nasıl çevrimiçi hale getireceğine ilişkin detaylar genellikle platforma özgüdür.

  • Kilitleme Primitifleri : Kilitleme primitiflerinin (spinlocklar gibi) uygulanması, bazı mimariler bunları etkin bir şekilde uygulamak için farklı CPU talimatları sağladığından (veya tercih ettiğinden) genellikle platforma özgü ayrıntıları içerir. Bazıları atomik işlemleri uygulayacak, bazıları atomik olarak test edebilecek / güncelleyebilecek bir cmpxchg sağlayacaktır (ancak başka bir yazar önce gelirse başarısız olur), diğerleri ise CPU talimatlarına bir "kilit" değiştiricisi içerecektir. Bunlar genellikle montaj kodu yazmayı da içerir.

Muhtemelen bir çekirdekte (ya da özellikle Linux çekirdeğinde) platforma ya da mimariye özgü kodun gerekli olduğu başka alanlar da vardır. Çekirdek kaynak ağacına bakıldığında, daha fazlasını bulabileceğiniz altında arch/ya da altında mimariye özgü alt ağaçlara include/arch/bakabilirsiniz. bunun örnekleri.

Bazıları gerçekten şaşırtıcı, örneğin her mimaride mevcut sistem çağrısı sayısının farklı olduğunu ve bazı sistem çağrıları diğer mimarilerde değil bazı mimarilerde var olacağını göreceksiniz. (X86'da bile, sistem çağrılarının listesi 32 bit ve 64 bit çekirdek arasında değişir.)

Kısacası, bir çekirdeğin platforma özgü olduğunu bilmesi gereken birçok durum vardır. Linux çekirdeği bunların çoğunu soyutlamaya çalışır, böylece yüksek seviye algoritmalar (bellek yönetimi ve zamanlamanın nasıl çalıştığı gibi) C'ye uygulanabilir ve tüm mimarilerde aynı (veya çoğunlukla aynı) çalışabilir.


7
Çok güzel yazı! Sistem sayısındaki değişim çoğunlukla geçmişle ilgilidir: yeni limanlar, liman zamanında geçerli olan sistemleri de içerir, eski limanlarda bulunan tarihi bagajla uğraşmazlar, bu nedenle normalde kullanılmayan sistemler normalde limanda bulunmaz itirazdan daha yeni. (Bu tüm senaryoları kapsamaz ...)
Stephen Kitt

10

Linux çekirdeğini taşımaya ek olarak, "kullanıcı alanı" programları için uygulama ikili arayüzünü (ABI) tanımlamanız ve kullanıcı alanı yazılım yığınının en düşük katmanlarını yerleştirmeniz gerekir. Linux, GNU projesinden alçak seviye kullanıcı alanı bileşenleriyle kullanılır ve bunlardan en kritik olanı:

  • C derleyici, montajcı ve bağlayıcı: GCC ve GNU Binutils . Tamamen yeni bir CPU mimarisi için, çekirdeği taşımaya başlamadan önce bu yazılımı taşımanız gerekir, çünkü çekirdeğin kendisi bir C programıdır ve derlenmelidir. Platformunuzun işlemcisi için zaten "arka uç" desteği varsa, işletim sistemi çekirdeği olarak Linux ile değil, yapacak daha az işiniz vardır ve işin çoğunu çekirdeğin başlamasına kadar ertelemekten kurtulabilirsiniz. çalışan.
  • C çalışma zamanı kütüphanesi: " GNU libc ". Bu kütüphane, sistem çağrılarını yapan ve aksi takdirde çekirdeğe doğrudan giren kodu içerir .
  • Birçok yabancı dil tercümanının temel bir bileşeni olan "yabancı işlev arayüzü" kütüphanesi, libffi ve az miktarda elle yazılmış bir montaj dili gerektiren az sayıdaki görevden birini gerçekleştirir .

Diğer birçok yazılım parçası isteğe bağlı platforma bağlı bileşenlere sahiptir; örneğin, yeni CPU mimarisi için NSS ve OpenSSL için el ile optimize edilmiş şifreleme ilkellerini ve IonMonkey ve V8 için tam zamanında derleme arka uçları yazarsanız , Web'de gezinme büyük ölçüde daha hızlı olacaktır . Ancak bunlar yeni bir platform oluşturmak için şart değil.


1

Çekirdeğe taşıdığınız donanım hakkında bilgi vermelisiniz. Çekirdeğin işi, donanıma doğrudan bağlanmaktır, bu yüzden düzgün çalışması için, çekirdeğin CPU, osilatörler (saatler) ve çeşitli seri port türleri (SPI, CAN, gibi) çevre birimleri hakkında bilgi sahibi olması gerekir. I2C, vb.)

Eski günlerde, bunu sürücülerin kullanmak için kullanacağı platforma özel bir kod yazarak yapardınız. Bugünlerde bu, bir Cihaz Ağacı tanımı yazarak yapılır .

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.