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

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *