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.
Toplam Görüntülenme: 1.491

eyw dostum sagolasin OS odevi icin bicilmis bir yazı
Bu yorumu rapor et
Bilgi paylaştıkça çoğalır.. eyvallah adil büyüksün
Bu yorumu rapor et
bilgisayar mühendisi dediğin böyle paylaşımcı olur eywallah dostum..
Bu yorumu rapor et
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
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
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
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
adilim eline emeğine sağlık kardeşim.
Allah razı olsun, çok faydalı oldu.
Bu yorumu rapor et
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
Bazı kernellerda .h bazı kernellarda da .S dir. Yani bir yanlışlık yoktur. Sadece hangisi ise onu seçiniz.
Bu yorumu rapor et
sağol kardeş eline sağlık
Bu yorumu rapor et
Çok faydalı bilgiler bunlar çok sağol. Ancak devamında da bazı çalışmalar olursa yerinde olur.
Bu yorumu rapor et
Bunun Ubuntu 10.10 64 bitte denemek istersek nasıl yaparız yardımcı olabilir misiniz?
Bu yorumu rapor et
güzel çeviri, yorumunuda katmışsın eline sağlık…
Bu yorumu rapor et
@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
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
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
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
derleme sorunu çözüldü… Mehmetle birebir aynı hatayı alıyordum…
Bu yorumu rapor et
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