Linux Kernel Derlemek ve Systemcall Eklemek

Öncelikle aşağıdaki komut ile gerekli paketleri kurun.

sudo apt-get install git fakeroot build-essential libncurses5-dev xz-utils libssl-dev bc

Aşağıdaki adres üzerinden derlemek istediğiniz sürümü seçin. (Kendi kernel sürümünüze yakın seçerseniz derlerken sorunla karşılaşmazsınz)

https://mirrors.edge.kernel.org/pub/linux/kernel/

Kernelı wget ile indirin

wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.17.4.tar.xz

Tar.xz uzantılı dosyayı çıkartın ve çıkarttığınız klasöre girin.

tar xf linux-4.17.4.tar.xz && cd linux-4.17.4

Çıkarttığınız klasör içerisinde bir klasör oluşturun ve istediğiniz ismi verin.

mkdir deneme

Nano ile deneme.c dosyasını açın

nano deneme/deneme.c

Açtığınız dosya içerisine bu kodu yapıştırın. Parametreler ve parametre tipleri arasında da virgül olduğunu unutmayın. Eğer kernel alanından kullanıcı alanına veri göndermek istiyorsanız pointer tipinde değişkenler de kullanabilirsiniz.

#include <linux/syscalls.h>
SYSCALL_DEFINE2(deneme_syscall, int, a, int, b) 
{
    printk("deneme_syscall : %d, %d\n", a, b);
    return b;
}

Klasör içerisinde ki Makefile dosyasının içeriğini hazırlayın

nano deneme/Makefile

Aşağıdaki içeriği içerisine yazın

obj-y := deneme.o

Ana klasördeki Makefile dosyasını güncelleyin

nano Makefile

Aşağıdaki satırı bulun (core-y kelimesini aratırsanız ikinci aratışınızda bulursunuz)

core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/

Satırın sonuna yeni oluşturduğunuz klasörü ekleyin, ekledikten sonra aşağıdaki gibi görünmesi gerekmekte.

core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ deneme/

64bit kernel için syscall_64.tbl dosyasını açın.

nano arch/x86/entry/syscalls/syscall_64.tbl

Aşağıda yer alan kodu dosyanın en sonuna ekleyin.

548     64     deneme_syscall     __x64_sys_deneme_syscall

Nano ile systemcall fonksiyonlarnın tanımlandığı dosyayı açın

nano include/linux/syscalls.h

En altta en son #endif ‘den öncesine ekleyin

asmlinkage long sys_deneme_syscall(int, int);

Aşağıdaki komut yardımıyla güncel ayar dosyasını kopyalayın

cp /boot/config-$(uname -r) .config

Ayar dosyasını nano ile açın.

nano .config

Aşağıdaki kelimeyi aratın ve içinde yazanları silin tırnaklar kalsın.

CONFIG_SYSTEM_TRUSTED_KEYS

Kerneli derleyin. J komutu multithread çalışmasını sağlar 4 yerine kendi çekirdek sayınızı yazın. Bu işlem çok uzun sürüyor. Modulleri seçmenizi isteyebilir y ve enter kullarak kabul edin.

make -j 4

Modulleri derleyin

make modules_install

Kernelı kurun

make install
update-grub

Yukarıdaki komut ile kurduğunuz kernelı başlangıca ekleyebilirsiniz. Bilgisayarı yeniden başlatıp derlediğiniz kernel ile işletim sistemini açın

Farklı bir klasörde nano kulanarak c dosyası oluşturun bu dosya ile kernel’da oluşturuduğumuz systemcall’ı çağıracağız.

nano userspace.c

Aşağıdaki kodu bu dosyanın içerisine yapıştırın.

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main(){
long int result = syscall(548,1,1);
printf("System call sys_hello returned %ld\n",
result);
return 0;
}

Gcc kullanarak derleyin ve derlenmiş dosyayı çalıştırın.

gcc userspace.c && ./a.out

Resources

https://stackoverflow.com/questions/53735886/how-to-pass-parameters-to-linux-system-call

https://stackoverflow.com/questions/939778/linux-api-to-list-running-processes

https://stackoverflow.com/questions/26828461/how-do-i-get-the-output-of-a-linux-system-call-in-c-c

https://stackoverflow.com/questions/20031570/how-to-use-copy-to-user

2 thoughts on “Linux Kernel Derlemek ve Systemcall Eklemek

  1. Merhaba,
    Bir sistem çağrısı yazdım parametre olarak bir int alıyor ve long dönüyor. Yazdığım sistem çağrısını terminal üzerinden kullanabilir miyim?

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir