Developersland

Teknoloji ve Yazılım Blogu

  • Yazıtipi boyutunu arttır
  • Varsayılan yazıtipi boyutu
  • Yazıtipi boyutunu azaltır

Linux Kernel'e System Call Ekleme

Kernel’e system call eklemeyi Intel işlemcili, 32 bit bilgisayarda Ubuntu 10.04 ve Linux kernel 2-6.33 kullanarak yaptım. Sisteme giriş yaparken root kullanıcısı olarak giriş yapmanız gerekmektedir.Root olarak giriş yaptıktan sonra kernel 2.6.33 ‘ün source kodlarını indirdim. Bu kodları usr/src/ dizininin altına kopyaladım daha sonra Terminalden bu dizine gelerek tar -xvf linux-2.6.33.tar.bz2  komutuyla kaynak kodlarımızın bulunduğu sıkıştırılmış dosyayı açıyoruz. Bu işlemi yaptıktan sonra aynı dizinde linux-2.6.33 isminde bir dosya oluşacaktır. Bu dosya derleyeceğimiz kernelin bulunduğu kaynak kodları içermektedir. Kernele bizim yazacağımız system call’u eklemek için burada bazı eklemeler yapmamız gerekecek.

Öncelikle ekleyeceğimiz sytem call’un kodunu yazmamız ve bunu .c uzantılı bir dosya olarak usr/src/linux-2.6.33/kernel/ dizinine kaydetmemiz gerekiyor. Ekleyeceğimiz kod bir “Merhaba Dunya” kodu olsun. Bu kod aşağıdaki gibi olacaktır.
#include<linux/linkage.h>
#include<linux/module.h>
asmlinkage int sys_merhabadunya(void)
{
         printk(KERN_EMERG “Merhaba Dunya\n”);
         return 0;
}

Daha sonra usr/src/linux-2.6.33/include/asm-generic/ dizininin altında bulunan unistd.h dosyasına /*Config_mmu*/ yorum satırlarından hemen önce
#define  __NR_merhabadunya 1080
__SYSCALL(NR_merhabadunya, sys_merhabadunya)

satırlarını ekliyoruz.

Bundan sonra yapacağımız işlem usr/src/linux-2.6.33/kernel/ dizininde bulunan Makefile dosyasına ** obj-y += groups.o ** yazısından önceki alana merhabadunya.o eklemek olacaktır bir önceki satırın sonuna “\” koymayı unutmayın . Bu işlem sayesinde kernel derlenirken merhabadunya.c dosyasının da derlenmesini sağlamış olacağız.

Daha sonra usr/src/linux-2.6.33/arch/X86/include/asm dizininde bulunan syscalls.h dosyasına
asmlinkage int sys_merhabadunya(void); ekliyoruz. Sonra aynı dizinde bulunan unistd.h dosyasına “#define __NR_syscalls 338” tanımından hemen önce  #define __NR_merhabadunya 338 ekliyoruz ve
#define __NR_syscalls’ın önünde bulunan 338 olan sayısını 339 yapıyoruz. Bunun nedeni  #define __NR_syscalls’ın en son tanımlanan dosya olması gerektiği zorunluluğudur.

Sonra usr/src/linux-2.6.33/arch/X86/kernel/ dizininde bulunan syscall_table_32.S dosyasının en sonuna .long sys_merhabadunya ekliyoruz.
Böylece sistem call eklemek için yapılması gereken tüm değişiklikleri yaptık şimdi ise eklediğimiz system call’un sistemimiz tarafından tanınması için kernel’imizi derlememiz gerekiyor. Bunu için öncelikle bazı konfigürasyonların ayarlanması gerekiyor. Bunun için make menuconfig diyoruz öncelikle. Burada yeni kernel’imizin özelliklerini girebiliriz elle ancak bu işlem üst seviye bilgi gerektirdiğinden herhangi değişiklik yapmadan exit diyerek çıkıyoruz böylece ayarlar tamamlanmış oluyor. Eğer make menuconfig komutunuz çalışmazsa sudo apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 komutuyla gerekli paketleri indirip tekrar make menuconfig komutunu giriyoruz.

Daha sonra usr/src/linux-2.6.33 dizinindeyken terminalden make diyerek yeni kernelimizin derlenmesini sağlıyoruz. Bu işlem 1 saat civarında sürebilmektedir. Aynı işlemi vmware de yapmaya kalkışırsanız bu işlem 6 saat civarında sürebilmektedir.

Derleme işlemi bittikten sonra sistemimizin yeni kernelimizi tanıması için bazı komutlar girmemiz gerekmektedir. Bunlar sırasıyla
-make modules
-make modules_install
-make install
-update-grub

Bu komutların her biri birkaç dakika veya saniye sürebilmektedir.
Şimdi derin bir nefes alarak reboot yapıyoruz.

Bilgisayar açılırken işletim sistemleri listesinin en başında Linux 2.6.33 yazan yeni bir bölüm göreceksiniz bu derlediğimiz yeni kerneldir. Yeni kernelimizi seçerek giriş yapıyoruz.

Sistemimiz normal olarak açıldığına göre şimdi eklediğimiz system call’u denememiz gerekmektedir. Bunun için herhangi bir dizinde deneme.c uzantılı bir dosya oluşturuyoruz ve içerisine aşağıdaki kodları yazıyoruz.
#include <sys/syscall.h>
#include <unistd.h>
#include <stdio.h>
#define __NR_merhabadunya  338  

int merhabadunya() {
   return (int) syscall(__NR_merhabadunya);
};

main () {
   printf("Sistem callumuzun dondurdugu sayi=  %d\n", merhabadunya());
}

 
Bu kodları dosyamıza yazdıktan sonra bu kodları derlememiz gerekiyor. Bunun için gcc deneme.c diyoruz. Aynı dizinde a.out isminde bir dosya oluşacaktır bu işlem sonucunda derlediğimiz programın çıktısı bu dosya içerisinde bulunmaktadır. İçeriği görmek için terminalden aynı dizindeyken
./a.out diyoruz böylece çıktı ekranda görünecektir. Eğer çıktı şu şekildeyse “Sistem callumuzun dondurdugu sayi=  0” başarılı oldunuz demektir.
Böylece bu yol izlenerek sisteminize uygun her türlü system call’u ekleyebilirsiniz.

NOT: Sistem call ekleme olayı çeşitli nedenden dolayı sizin makinenizde çalışmayabilir çeşitli hatalarla yüzleşebilirsiniz. Bu konudaki araştırmalarıma İşletim sistemleri dersinde verilmiş bir ödev vesilesiyle başladım ve sınıfımızdaki birçok kişinin birbirinden çok farklı hatalar aldığına şahit oldum bu nedenle hata alırsanız moraliniz bozulmasın bu çok doğal :) Google da sabırla hatalanın nedenlerini aramak lazım...             

 

Yorum ekle


Güvenlik kodu
Yenile