web-gelistirme-sc.com

Linux dahili sürücü yükleme sırası nedir?

Yerleşik sürücü yükleme sırasını nasıl özelleştirebiliriz (önce bazı yerleşik sürücü modülü yüklerini ve daha sonra bağımlı modül yüklerini yapmak için)?

22
Dien Nguyen

Yerleşik sürücüler yüklü , bu nedenle yerleşik olmazlar. Başlatma işlevleri çağrılır ve çekirdek kendisini kurduğunda sürücüler etkinleştirilir. Bu init işlevleri init/main.c::do_initcalls() işlevinde çağrılır. Tüm init çağrıları, initcall_levels ve include/linux/init.h 'da tanımlanan seviyelerde sınıflandırılır.

Bu seviyeler linker betiğinde (Arch/*/kernel/vmlinux.lds.*) tanımlanan gerçek sembollerdir. Çekirdek derleme zamanında, bağlayıcı module_init() ya da diğer *_initcall() işaretli tüm işlevleri toplar, düzeylere sınıflandırır, tüm işlevleri aynı yere aynı yere koyar ve bir dizi işlev işaretçisi gibi oluşturur.

Çalışma zamanında do_initcall_level () işlevi, dizideki işaretçilerin gösterdiği her işlevi çağırmak içindir. Do_initcall_level'de seviyeler dışında bir arama politikası yoktur, ancak dizideki sıraya bağlantı zamanında karar verilir.

Öyleyse, sürücünün başlatma sırasının bağlantı zamanında sabit olduğunu görebilirsiniz, ancak ne yapabilirsiniz?

  1. init işlevinizi daha yüksek bir seviyeye
  2. aygıt sürücünüzü Makefile konumunda daha yüksek bir konuma getirin

Birincisi, yukarıdakileri okuyorsanız netleşir. yani) uygunsa, early_initcall () işlevini kullanın.

İkincisinin biraz daha açıklamaya ihtiyacı var. Makefile konusundaki sırasın nedeni, mevcut çekirdek yapı sisteminin nasıl çalıştığı ve bağlayıcıların nasıl çalıştığıdır. Uzun bir öyküyü kısaltmak için, build sistemi tüm nesne dosyalarını obj-y içinde alır ve birbirine bağlar. Ortama bağımlıdır ancak bağlayıcının obj-y içindeki ilk nesne dosyasını düşük adrese koyması, dolayısıyla daha önce çağrılması olasılığı yüksektir.

Sürücünüzün aynı dizindeki diğer sürücülerden daha erken çağrılmasını istiyorsanız, bunu yapmanın en basit yolu budur.

36
Yasushi Shoji

depmod, her modül tarafından verilen ve istenen sembolleri inceler ve üzerlerinde modprobe modüllerini uygun sırayla yüklemek için kullanabilecekleri bir topolojik sıralama yapar. Bağımlı olmak istediğiniz modüllerden semboller istemek, doğru olanı yapması için yeterlidir.

Doğru modül sırası ve bağımlılıkları initrd içinde bile modprobe tarafından yönetilir.

0

Son zamanlarda bu sorunu yaşadım, şarj cihazım ADC sürücüsüne bağımlılık gösteriyor, bu yüzden ADC sürücüsünü yüklemeden önce şarj sürücüsü yüklendi ve DTS dosyasında tanımlanmış ve ADC sürücüsü tarafından intialize edilmesi gerekiyor. sürücü/Makefile içindeki modül sırasını değiştirerek çözüldü

0
Nagi