Kernel Modül Kullanımı

Not: Bu örneği yürütebilmeniz için RootFS’in oluşturulmuş olması ve SSH üzerinden bağlanmanız gereklidir.

Kernel Modülleri Nedir?

Kernel modülleri isteğe bağlı olarak çalışma durumunda yüklenip/çıkartılabilen kod parçalarıdır. Bu sayede sistemi yeniden başlatma gereği olmadan sistemin işlevselliği artırılabilir (kaynak).

Kernel konfigürasyonunda bir girdinin yanında M yazıyorsa bu girdi modül olarak derlenecek demektir. Örnek olarak kernel derlemede kullandığımız omap2plus_defconfig içerisinde 435 (!) kernel modülü vardır. Konfigürasyon dosyanın içerisine bakmanızı tavsiye ederim.

Kernel Modülleri Kullanımı

Derlediğimiz Kernelin modüllerini yükleyelim:

export CC=/opt/workspace/sdk/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
cd /opt/workspace/linux
make ARCH=arm CROSS_COMPILE=$CC -j4 modules_install INSTALL_MOD_PATH=out

Yukarıdaki komutlar sonrasında modüller kernel derlemesini yaptığımız klasörün içerinde out klasörüne kopyalanacaktır.

Kernel modülleri RootFS içerisinde /lib/modules/kernel_release içerisinde bulunurlar. kernel_release değişkendir bu sayede kernel kendisine ait modülleri yükler(Bu durum sahadaki cihazın sadece kernelini güncellediğinizde modüllerin yüklenmemesi sorununa da yol açabilir). Mevcut kernelin dağıtım ismini uname -r komutu ile öğrenebiliriz. Örnek:

../_images/linux_sample_uname.png

Modülleri oluşturduğumuz out klasörünün içerisindeki klasör ağacı /lib/modules/4.14.108-02134-gb02daa7/ şeklindedir. Tüm bu modülleri sistemimize kopyalayalım. Bunun için öncelikle derleme yaptığımız klasördeki modül klasörünü sıkıştırıp network üzerinden scp komutu ile cihaza kopyalayacağız. Daha sonra sıkıştırdığımız klasörü açacağız. Elbette kernel modülleri başka yöntemler ile de kopyalanabilir. Ben SD-kartı sök/tak yapmamak için bu yöntemi izledim.

cd out/lib/
tar cf modules.tar *
scp modules.tar root@192.168.2.100:/lib/

Kopyaladığımız modules.tar dosyasını boardda açalım.

cd /lib/
tar xf modules.tar
sync

Modülleri yüklemek için iki adet komut vardır: insmod ve modprobe. insmod ile modül dosyasının tam yolunu vermeniz gerekir. modprobe komutu ise /lib/modules/$(uname -r)/modules.dep.bin dosyasından modülleri okur ve eğer modüle ve bağlı olduğu modüller varsa onları yükler, kısaca insmod’dan daha yetenekli bir komuttur.

Burada dikkat edilmesi gereken modprobe, kernel versiyonu ile birebir aynı isimdeki klasörün altındaki modüllere bakar. 4.14.79-gvea klasörü altındaki modüller kernel 4.14.79-aabbcc tarafından modprobe ile yüklenemeyecektir.

Board’a kopyaladığımız modülleri listelemek için aşağıdaki komut koşturulur.

modprobe -l

Board üstünde leds-gpio.ko modülünü yükleyelim.

modprobe leds-gpio

Modülü yükleyince ethernet konnektörü tarafındaki LEDlerden D4’ün seyrek olarak yanmaya başladığını görebiliriz.

lsmod ile yüklenmiş olan modüllere bakalım.

../_images/linux_sample_lsmod.png

Görüldüğü üzere biz leds-gpio.ko modülünü yükleme komutunu vermiştik ancak modprobe bu modülün ihtiyaç duyduğu led_class modülünü de yüklemiştir.

Son olarak ek bir modül daha yükleyelim.

modprobe ledtrig-heartbeat

ledtrig-heartbeat modülünü yüklediğimizde ise D2 LEDinin de yanmaya başladığını göreceksiniz. Heartbeat LEDi Linux çekirdeğinin çalıştığını gösteren bir modüldür.

Son olarak ledtrig-heartbeat modülünü kaldıralım ve D2 LEDini kapalı konuma alalım.

modprobe -r ledtrig-heartbeat

Peki neden modülleri yüklediğimiz zaman bazı LEDler aktifleşti? ve neden bazı LEDler? Bunun için Linux kernel’e ait başka bir kavram olan Device Tree kavramını incelememiz gerekiyor.