ana sayfa > kernel > Linux kernel derleme ve system call ekleme

Linux kernel derleme ve system call ekleme

Uyarı : Ubuntu 9.10 32 bit  kullanılarak ve linux 2.6.33 kernel sürümü kullanılmıştır. Diğer versiyonlarda uyuşmayabilir.

Öncelikle http://www.kernel.org a girerek istediğimiz sürümü indiriyoruz. Tabiki dikkat ediyoruz ki indireceğimiz sürüm stabil bir sürüm olsun. Ben şu an ki son stabil sürüm olan 2.6.33 sürümünü varsayarak anlatacağım.

İndirilme bittikten sonra terminal açıp indirdiğimiz klasöre geliyoruz. cd indirilen_klasor

daha sonra tar -xvf linux-2.6.33.tar.bz2 -C /usr/src/ diyerek sıkıştırılmış dosyadan açıyoruz.

cd /usr/src/linux-2.6.33 diyerek açtığımız dosyanın içine giriyoruz.

Kernel elimizin altında şimdi system call ekleyip derlemeye başlayabiliriz.

cd kernel/ diyoruz ve sudo gedit helloworld.c komutuyla kernel dizini içine yazılmak üzere dosya açıyoruz. Sistem şifre soracaktır root şifremizi girerek enter basıyoruz.

dosyamıza girerek system call oluşturmak için aşağıdaki örnek satırları yazıyoruz. Ve kaydedip çıkıyoruz.

/* adding helloworld system call */
#include <linux/linkage.h>
#include <linux/module.h>
asmlinkage int sys_helloworld(){
   printk(KERN_EMERG "Hello World!\n");
   return 0;
}

Bunlar ne anlama geliyor?

asmlinkage: Kodun C ile yazıldığının belirtilmesi ( C++ değil C )

printk: Kernel log mesajı yazmak için kullanılır. /var/log/syslog dosyasına kayıt edilir.

KERN_EMERG: Acil mesaj yazıldığını belirtmek için kullanılır. Genelde crash olmadan hemen önce yazılırlar. Kernel’de 8 tane farklı log seviyesi vardır. Bunlardan bazıları KERN_DEBUG, KERN_ALERT, KERN_ERR

Aynı yerdeyken terminale sudo gedit Makefile diyerek Makefile dosyasında  ** obj-y += groups.o ** yazısından önceki alana helloworld.o ekliyoruz.  Ve kaydedip çıkıyoruz. Bu sayede derlenirken yazmış olduğumuz helloworld.c dosyasıda derlenmiş olacak.

Her şey tamam şimdi kernel in bu system call ı bilmesi için yapılacaklara geldi.

Yine terminale sudo gedit ../arch/x86/include/asm/unistd_32.h yazıyoruz ve #define __NR lerle devam eden satırların sonuna #define __NR_helloworld 338 yazıyoruz. 338 sayısını en son sayının bir fazlası yapıyoruz. 2 alt satırdaki #define NR_syscalls da ki sayıyı bir artırıyoruz. Ve kaydedip çıkıyoruz.

Yine terminalde iken sudo gedit ../arch/x86/include/asm/syscalls.h yazıyoruz ve açılan dosyaya #include la başlayan kütüphanelerden sonra

/* X86_32 only */
/* kernel/helloworld.c */
asmlinkage int sys_helloworld();          ekliyoruz. Ve kaydedip çıkıyoruz.

Yine terminalde cd /usr/src/linux-2.6.33/arch/x86/kernel/ yazıyoruz ve sonra termianlden sudo gedit syscall_table_32.h diyoruz ve açılan dosyanın en sonuna  .long sys_helloworld           /* 338 */ ekliyoruz. Ve kaydedip çıkıyoruz.

Sıra geldi kernel derlemeye. Yine terminalde iken cd /usr/src/linux-2.6.33/ yazıyoruz. Ve daha sonra aşağıdaki komutu giriyoruz.

sudo make menuconfig

menuconfig çalışmaz ise sudo apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 ile gerekli paketleri indirelim daha sonra sudo make menuconfig komutunu yeniden çalıştıralım.

Burada config dosyası oluştururken bir pencere açılacak burada yeni kernelin desteklediği özellikleri girebilirsiniz. Ne yapacağınıza dair ufak bir fikriniz yoksa exit te iken enter a basıp çıkın. Ve configuration da tamamlandı.

Daha sonra sudo make komutu ile derlemeye başlıyoruz. İşte burası bilgisayardan bilgisayara 30-60 dakika arası sürecektir. Gidip bir kahve alıyoruz veya oyun açıp oynuyoruz :)

………………………….

Ve derleme bitti şimdi sırada modüllerin derlenmesinde terminalde iken sudo make modules yazıyoruz ve modüllerin derlenmesini bekliyoruz burası ise 5 dakkikadan daha az sürecektir.

Sıra geldi kernel yüklemeye sudo make modules_install diyoruz ve modüllerin yüklenmesini bekliyoruz. Daha sonra ise sudo make install diyerek kernel yüklemeyi bitiriyoruz.

Kernel derleyip yükledik sıra geldi grub güncellemeye yine terminalde iken sudo uptade-grub giriyoruz. Ve grubun güncellenmesini bekliyoruz. Ve daha sonra sudo reboot diyerek yeniden başlatıyoruz. Bir daha ki açılmada yeni kernel den işletim sistemimizi açıyoruz. Ekran kartı hatası alırsak ekran kartını kaldırıp tekrar kuruyoruz bu şekilde bu hatada gidecektir.

……………………

Sistem bu kernel ile başladıktan sonra. Sıra geldi bu system call ı kullanmaya. Yeni bir dosya oluşturuyoruz ve içine şunları giriyoruz.

#include <sys/syscall.h>
#include <unistd.h>
#include <stdio.h>

#define __NR_helloworld        338    /* or     whatever you set it in unistd.h */

int helloworld() {
   return (int) syscall(__NR_helloworld);
};

main () {
   printf("The return code from the helloworld system call is %d\n", helloworld());
}

Derliyoruz ve çalıştırıyoruz. Düzgün çalıştığını anlamak için terminal açıp sudo gedit /var/log/syslog yazıyoruz açılan dosyada hello arıyoruz. Eğer yazdığımız yazıyı içerisinde bulur isek başarılı bir şekilde system call üretmiş olduk demektir. Sizde bu yöntem ile istediğiniz system call ı kernele ekleyebilirsiniz.

Related Posts Plugin for WordPress, Blogger...

Toplam Görüntülenme: 1.491

  1. murtixgyte
    Pazartesi, 15 Mar 2010 zamanında 16:20 | #1

    eyw dostum sagolasin OS odevi icin bicilmis bir yazı

    Bu yorumu rapor et

  2. Perşembe, 18 Mar 2010 zamanında 01:14 | #2

    Bilgi paylaştıkça çoğalır.. eyvallah adil büyüksün :)

    Bu yorumu rapor et

  3. uyalap
    Cuma, 19 Mar 2010 zamanında 23:33 | #3

    bilgisayar mühendisi dediğin böyle paylaşımcı olur eywallah dostum..

    Bu yorumu rapor et

  4. ulaş
    Pazartesi, 05 Nis 2010 zamanında 12:03 | #4

    merhaba, yazılanaların hepsini yaptım ama malesef “kernel panic -not syncing VFS:unable to mount root fs on unknown-block(0,0)” hatası alıyorum bu hatanın üstesinden nasıl gelebilrim

    Bu yorumu rapor et

  5. Pazartesi, 05 Nis 2010 zamanında 12:36 | #5

    Linux cdsini takıp komut satrında şu komutu çalıştırbilir misin?

    sudo update-initramfs -k all -u -b /mnt/sda1/boot

    Oluyor mu bir dene bakalım.

    Kolay gelsin.

    Bu yorumu rapor et

  6. ulaş
    Pazartesi, 05 Nis 2010 zamanında 23:53 | #6

    söylediğiniz kodu biraz modifiye yaparak çalıştırdım “sudo update-initramfs -k all -u -b /boot” olarak çünkü diğer türlü öyle bir directory yok diyordu,sorunum devam ediyor bu arada ubuntu 9.04 kullanıyorum ve bu hatayı yeni kerneli boot ederken alıyorum başlarken yeni kernel e girdiğimde

    Bu yorumu rapor et

  7. Salı, 06 Nis 2010 zamanında 00:58 | #7

    Burada anlattığım örnek bir kernel derleme. Bu yüzden en son stabil versiyon çalıştırdım. Amaç sadece bunu ve system call ekleme öğretmek. Bu gibi hatalar bilgisayardan bilgisayara değişiyor. Yani birinde alıyorken diğerinde almayabiliyorsun. Sana tavsiyem şu anda kullandığın kernel’ın bir kopyasını alıp onu derlemen ya da içinde ki hazır config dosyalarını alıp yeni kernel a atman, bu sayede ‘make menuconfig’ de atladağın ayarlar hazır halde gelecek ve sistemine uygun kernel yüklenecektir.

    Kolay gelsin

    Bu yorumu rapor et

  8. rakay
    Salı, 06 Nis 2010 zamanında 01:37 | #8

    adilim eline emeğine sağlık kardeşim.
    Allah razı olsun, çok faydalı oldu.

    Bu yorumu rapor et

  9. ümit
    Cuma, 09 Nis 2010 zamanında 13:56 | #9

    adilcim (.long sys_helloworld /* 338 */) eklerken (sudo gedit syscall_table_32.h) dosyasına değil
    (sudo gedit syscall_table_32.S) dosyasına yüklüyoruz onu düzeltirsen ii olur..

    Bu yorumu rapor et

  10. Cuma, 09 Nis 2010 zamanında 16:33 | #10

    Bazı kernellerda .h bazı kernellarda da .S dir. Yani bir yanlışlık yoktur. Sadece hangisi ise onu seçiniz.

    Bu yorumu rapor et

  11. yusuf
    Cumartesi, 17 Nis 2010 zamanında 19:35 | #11

    sağol kardeş eline sağlık

    Bu yorumu rapor et

  12. Murat
    Çarşamba, 05 Oca 2011 zamanında 13:33 | #12

    Çok faydalı bilgiler bunlar çok sağol. Ancak devamında da bazı çalışmalar olursa yerinde olur.

    Bu yorumu rapor et

  13. Gözde
    Cumartesi, 12 Mar 2011 zamanında 12:00 | #13

    Bunun Ubuntu 10.10 64 bitte denemek istersek nasıl yaparız yardımcı olabilir misiniz?

    Bu yorumu rapor et

  14. ahmet muratdağı
    Cumartesi, 12 Mar 2011 zamanında 15:45 | #14

    güzel çeviri, yorumunuda katmışsın eline sağlık…

    Bu yorumu rapor et

  15. Cumartesi, 19 Mar 2011 zamanında 01:33 | #15

    @Gözde: Burada anlatılana göre yapmaya çalışın, sorun çıkarsa yardımcı olmaya çalışırım. Fazla bir şey değişmiş olacağını sanmıyorum.

    Bu yorumu rapor et

  16. Mehmet
    Perşembe, 21 Nis 2011 zamanında 05:20 | #16

    Merhaba, öncelikle yazınız için size teşekkür ederim. Dediklerinizi denememe rağmen bir sorunla karşılaştım derleme sırasında:

    In file included from drivers/staging/cxt1e1/musycc.c:81:
    drivers/staging/cxt1e1/sbecom_inline_linux.h:60: fatal error: config/modversions.h: Böyle bir dosya ya da dizin yok
    compilation terminated.
    make[3]: *** [drivers/staging/cxt1e1/musycc.o] Hata 1
    make[2]: *** [drivers/staging/cxt1e1] Hata 2
    make[1]: *** [drivers/staging] Hata 2
    make: *** [drivers] Hata 2
    ali@ali-Lenovo-IdeaPad-Y550:~/Masaüstü/linux-2.6.38.3$

    bu soruna dair internette yaptığım araştırmalar sonuçsuz kaldı, eğer bu konuda yardım ederseniz çok memnun olurum.

    iyi çalışmalar dilerim.

    Bu yorumu rapor et

  17. Cumartesi, 23 Nis 2011 zamanında 13:39 | #17

    Aynı hatayla ben de karşılaştım, zamanında bende bulamamıştım. Sanırım menuconfig dedikten sonra bazı oynamalar yaptınız. Burada yapılan yanlış seçimler hataya neden olabiliyor. Eğer değişiklik yapmamışsanız config dosyasında /boot/ altında olan şu anda kullandığınız kernel sürümünün config dosyasını alıp, derlediğiniz kernel altına config adı ile kopyalayın daha sonra da “kernel prepare” komutu verip, daha sonra make yapın. config dosyasında değişiklik yaptıysanız eğer yaptığınız değişikliği kontrol ederek tekrar deneyin. Şu anda kullandığınız kernel sürümünü “uname -r” komutu ile öğrenebilirsiniz.

    Bu yorumu rapor et

  18. bay_t
    Salı, 22 Kas 2011 zamanında 03:36 | #18

    drivers/staging/cxt1e1/sbecom_inline_linux.h bu dosyanın içinde

    # ve bir üst satır daha var
    #include
    #else
    #include
    -#include
    #if defined(CONFIG_SMP) && ! defined(__SMP__)
    #define __SMP__
    #endif

    ve modification.h den bahseden ele ifli yakındaki satır bloğunu sildim

    kernelde cihazımda bulunmayan bir donanımı iptal ettiğimi düşünüyorum :D

    derleme sorunu çözüldü… Mehmetle birebir aynı hatayı alıyordum…

    Bu yorumu rapor et

  19. Salı, 22 Kas 2011 zamanında 08:54 | #19

    umarım başka bir yerde sorun çıkmaz. Hayırlı uğurlu olsun. Tekrar aynı hatayla karşılaşırsam bende bu değişikliği yaparım :)

    Bu yorumu rapor et

  1. şimdilik geri bağlantı yok
*