Ö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