Ö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
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?
Aşağıda verilen kaynakta yer aldığı gibi, terminal üzerinden direk işlem gerçekleştiremezsin fakat sistem çağrını çağıran bi c programı yazıp bunu terminal üzerinden çalıştırabilirsin.
Ref: https://unix.stackexchange.com/questions/30992/can-you-perform-system-calls-from-osx-terminal