Python ile Linux Kernel Kodlamak?

Merhabalar,
Kplugs modülü ile Linux kerneli yapmak python script kodlarıyla o kadar kolay hale getirilmiş ki gözlerime inanamadım, python kodlarını bytecode lara derleyerek çekirdek kodu üretebiliyoruz, her ne kadar üretim makinalarında tavsiye edilmese de.(Keşke her şey Linux’dan olsa :smiley: )
Soruma gelince Kplugs modülü ile kernel kodlamak sizce ne kadar sağlıklı ve hızlı olur ?
kplugs

Merhabalar oldukça eski bir post’a yazdığımın farkındayım, yine de cevap vermek istedim. Anladığım kadarıyla Kplugs modulü tamamen bir Linux kerneli yapmak için değil fakat Linux kernel’i içerisinde çalışacak scriptler yazmak için geliştirilmiş. Bu modül daha genel yelpazede script yazmak için geliştirilmiş ve kendine ait bir Python kütüphanesi de varmış, buradan anladığım bütün Python standard kütüphanesi Kplugs içerisine dahil olmayabilir.
C ve C++ dışındaki bir dille Linux kernel’ini yazmanın zorluğu şuradan kaynaklanıyor, Linux’ü çalıştıran systemcall işlemleri yani kernel ve userspace arasındaki haberleşmeyi sağlayan işlemler bütünün hepsi C ve C++ ile yazılmış, başka herhangi bir dili araya sokmak için, ve özellikle de script dili ise, bu systemcaller önce interpreter’in çalışmasını sağlayacak sonra da interpreter sizin script dilinde yazılmış kodu çalıştıracak, imkansız elbette değil fakat bana pratik gözükmüyor.

Kernel modulu yazmanin en buyuk zorlugu, standart kutuphaneler basta olmak uzere, kullanici icin kabuk uzerinde calisan programlara sunulan olanaklarin sunulmuyor olmasi: stdin/stdout yok, dosya acilip okunamiyor, vb. Cogu zaman yerlerine sunulan muadilleri (kprint, kmalloc, vs.) farkli calisiyor, ve kullanirken dikkat etmek gerekiyor. Benzer sekilde, kodun takilmasi veya yanlis bir sey yapmasi durumunda isletim sistemini koruyan bariyerler yok veya daha az. Yazdigim ilk Linux (v2.4) modulu, 10 satirdan ufak olmasina ragmen, yukledigim anda butun sistemi kitlemisti. (Yanlis bir return’den oturu)

Aslinda, bu (ve diger bir suru) baglamda kernel modullerinin, embedded koddan veya benzeri kisitli ortamlarda calisan ozel programlardan bir farki yok.

C disinda bir dilde gelistirmenin zorlugu ise, tamamen tooling’den kaynakli. Modullerin cogunlugu C’de yazildigi icin, C’de yazilan bir modulu derleyip kullanima hazir hale getiren tek bir komut var. Her gun belki onbinlerce defa kullanilan. C’de yazmak icin sinirsiz sayida tutorial ve makale var, sorun ciktiginda yardim edebilecek binlerce insan var.

C++ oyle degil. Baska diller oyle degil. Rust biraz oraya dogru geliyor; su an Rust icin destek var. Ama moduller herhangi bir sistem programlama diliyle yazilabilir. Muhim olan gereken executable’i yaratabilmek. (Mesela bu son link .ko dosya formatina veya olmadi kernel modullerini basitce tanitan bir yere olsun istedim, fakat “.ko” ile ilgili aradigim her sey Kernel’in C(+Rust?) build sistemine, C kodundan .ko dosyasina gitme yollariyla ilgili dokumentasyona baglandi.)

Scripting dillerinin ayri bir zorlugu var tabi: Koskoca bir interpreter’a baglilar. (Ve o interpreter da dosyalar, hafiza yonetimi, standard C kutuphanesi, standart sistem cagrilari gibi seylere bagli.) Diger taraftan, kernelde calisan bir interpreter varsa, script’lerinizi onunla calistirabilirsiniz. (KPlugs da boyle bir sey gibi duruyor.)

Tabi yine -tipki bir embedded sistemdeki gibi- bir takim kisitlamalar olacaktir. En temel fonksiyonlardan biri olan open’in bir programdaki gibi calismasi asla mumkun degil—cunku kernel’in bir dosya sistemi yok. (Artik hata mi verir, dosya gibi yazilip okunabilen baska bir sey mi dondurur, dili tasarlayana kalmis.) print de dokumentasyondaki sekilde calisamaz, ama belki stdout yerine kernel loguna yazabilir.

(Hatta aslinda Linux’ta calisan bir interpreted dil var, BPF, ama konuyla alakasiz.)

Bu arada butun genel amacli programlama dillerinin bir “C arayuzu” (en yaygin terim FFI / foreign function interface herhalde) var; cagri yapilan kodun C’de (C++ degil) yazilmis olmasi onunla haberlesmeyi zorlastirmiyor, hatta tersine kolaylastiriyor. Birkac ornek:

Rust: ornekli kitap, core:ffi dokumentasyonu
C++ biraz daha kolay, cunku C ile ayni temel type’lara sahip: ISOCPP FAQ
Python!: ctypes

3 Beğeni

Kplugs projesi durdurulmuş. İhtiyaç kalmamış.

Öncelikle kernel i komple yeniden yazmayı gerektirecek bir durum görmüyorum. Kernel org zaten tüm gücünü buna harcıyor. Gerekli olabilecek belki modül ihtiyacı olabilir.

Diğer taraftan kernel dahil hiç bir dil salt bir dil kullanmıyor, assembly de gerekiyor, c de c++ da bazan kernel kodllarının içinde göreceklerinize şaşırabilirsiniz.

Sonuçta kernel birden çok donanıma göre derlenebilsin diye farklı destek modüllerini içerebilir. İşletim sistemini koşturacağınız donanımın kendi ihtiyacı olan dil ve modüller gibi farklı ihtiyaçlar olabilir.

Yani haklısınız ilk bakışta araya bir yorumlanan dil sokmak mantıklı görünmeye bilir.

Ama kplug git hun kaynağının altında bir not göreceksiniz.

What is eBPF? An Introduction and Deep Dive into the eBPF Technology

eBPF ye atıf yapıyor.

Ve size eBPF nin nerede kullanılabileceğini gösteriyor.

Ben de her zaman işletim sistemlerinin Assembly ve C gibi temel dillerle yazılmasını tercih ederim ama kernel o kadar genişledi ve o kadar beklenti arttı ki, kernel kernel olmaktan çıkıp neredeyse işletim sistemi olacak.

Bu nedenle üst düzey dillerin ve diğer script dillerin içinde yer alması artık şaşırtıcı olmayacaktır.

1 Beğeni