Menambahkan System Call pada Linux kernel 2.6.22 System call merupakan mekanisme yang digunakan oleh program aplikasi untuk meminta service dari sistem operasi. Service yang dimaksud adalah services yang dikelola oleh sistem operasi seperti storage, memory, network, process management, mengakses perangkat keras, dll. Sebelumnya, Anda harus memiliki akses root. Instruksi untuk menambahkan system call: 1. Download source linux kernel 2.6.22 di http://user.arc.itb.ac.id/incoming/kernel/linux 2.6.22.tar.gz atau http://www.kernel.org 2. Ekstrak file source kernel di /usr/src dengan perintah #tar zxvf linux.2.6.xx.tar.gz 3. Edit file /usr/src/linux 2.6.xx/arch/i386/kernel/syscall_table.S System Call tidak dapat dipanggil melalui user process, melainkan harus melalui mekanisme interrupt dan terdaftar pada interrupt table. Maka Anda harus menambahkan system call baru pada interrupt table dengan cara mengedit file /usr/src/linux 2.6.xx/arch/i386/kernel/entry.S. Pada bagian akhir file tersebut, Anda akan menemukan kode #include "syscall_table.s" yang berarti file entry.s meng include file syscall_table.s. Di file inilah Anda tambahkan system call baru pada akhir file. Contohnya dengan menambahkan.long sys_showproc pada akhir file syscall_table.s dengan showproc merupakan nama system call baru yang akan kita tambahkan. 4. Anda perlu meng generate system call stub sehingga program user dapat mengivokasi system call Anda. Lakukanlah dengan cara mengedit file /usr/src/linux 2.6.xx/include/asm/unistd.h seperti ini #ifndef _ASM_I386_UNISTD_H_ #define _ASM_I386_UNISTD_H_ /* * This file contains the system call numbers. */ #define NR_restart_syscall 0 #define NR_exit 1 #define NR_fork 2... #define NR_eventfd 323 #define NR_mysyscall 324 Anda perlu menambahkan #define untuk system call Anda pada akhir file dengan menuliskan NR_ sebgai prefix. Sebagai contoh, ditambahkan #define NR_showproc 325 Kemudian tambahkan juga #define NR_syscalls 325 menjadi #define NR_syscalls 326 (ditambahkan 1). 5. Buatlah sebuah file yang merupakan kode implementasi system call Anda, misalnya dengan nama
showproc.c pada direktori usr/src/linux 2.6.xx/arch/i386/kernel/ Agar dapat di link dengan baik, system call Anda membutuhkan kata asmlinkage sebelum fungsi dan sys_ sebelum nama fungsi. Perlu juga dituliskan #include <linux/linkage.h> agar asmlinkage dikenali. Contohnya, Anda akan menuliskan #include <linux/linkage.h> #include <linux/syscalls.h> /*agar sys_getpid() dikenali*/ asmlinkage int sys_showproc (int arg1, char* arg2) return(sys_getpid()); /*sys_getpid() mengembalikan pocess id*/ 6. Editlah file usr/src/linux/arch/i386/kernel/makefile (file Makefile pada direktori tempat Anda menyimpan file showproc.c) lalu tambahkan showproc.o pada akhir baris ke 10. Tujuannya adalah agar file Anda dapat dkompile dan di link dengan baik. 7. Lakukan konfigurasi kernel jika dibutuhkan. Ada tiga cara untuk melakukan konfigurasi kernel, yaitu melalui : text based program jalankan perintah #make config dalam direktori /usr/src/linux.2.6.xx. Perintah make akan menanyakan berbagai pertanyaan terkait konfigurasi kernel. Menekan <ENTER> akan mengembalikan nilai default. text based menu program jalankan perintah #make menuconfig dalam direktori /usr/src/linux.2.6.xx. Selanjutnya akan ditampilakan menu dialog seperti gambar di bawah ini jika pada sistem Anda ter install X Windows, Anda dapat menggunakan X based program. jalankan perintah #make xconfig dalam direktori /usr/src/linux.2.6.xx. Selanjutnya akan ditampilakan window seperti gambar di bawah ini
8. #make clean 9. #make dep Instruksi ini hanya dibutuhkan pada kernel 2.4 or older untuk mempersiapkan source file yang akan digunakan pada saat compiling. 10. Editlah file usr/src/linux/arch/i386/kernel/makefile untuk memberi nama unik pada kernel Anda. Caranya adalah dengan mengedit baris EXTRAVERSION= untuk menambahkan suffix yang unik pada akhir nama kernel default. Sebagai contoh, jika Anda memiliki kernel dengan versi 2.6.22 dan Anda mengedit EXTRAVERSION= mejadi EXTRAVERSION=-6-new, Maka nama versi kernel Anda adalah 2.6.22 6 new. 11. Compile kernel dengan perintah #make. Ini akan memakan waktu yang cukup lama. 12.#make modules_install Tujuannya adalah untuk meng copy semua module yang diciptakan pada tahap sebelumnya ke tempat default nya, yaitu direktori /lib/modules/<kernel version>. 13.#make install Kernel yang telah Anda buat harus di copy ke partisi /boot dimana seluruh file kernel aktif dari sistem disimpan. Ini dilakukan dengan perintah #make install. Anda dapat melihat kernel Anda sudah terinstall dengan perintah #ls -l /boot/vmlinuz* 14. Anda dapat meng update file /etc/grub.conf untuk memasukkan kernel Anda pada boot options. Sebenarnya, perintah #make install telah melakukan ini secara otomatis. Sebagai contoh, pada file /etc/grub.conf, akan berisi
default=2 timeout=10 splashimage=(hd0,7)/boot/grub/splash.xpm.gz hiddenmenu title Fedora Core (2.6.22) root (hd0,7) kernel /boot/vmlinuz-2.6.22 ro root=label=/ rhgb quiet initrd /boot/initrd-2.6.22.img title Fedora Core (2.6.18-1.2798.fc6) root (hd0,7) kernel /boot/vmlinuz-2.6.18-1.2798.fc6 ro root=label=/ rhgb quiet initrd /boot/initrd-2.6.18-1.2798.fc6.img title Windows XP rootnoverify (hd0,0) chainloader +1 pada file di atas, tertulis default=2. Ini berarti, default boot option yang akan dipilih jika timeout habis adalah yang ke 3, yaitu Windows XP. Anda dapat mengubah default boot option menjadi Fedora Core (2.6.22) dengan mengubah default=2 menjadi default=0. Anda juga dapat mengubah waktu timeout timeout=10 sesuai yang Anda inginkan, dengan nilai integer sebagai satuan detik. 15. Lakukan reboot dengan perintah #reboot Setelah reboot dengan kernel baru, perlu dibuat driver untuk mengetes system call baru yang Anda buat. Misalkan file mainsp.c di bawah ini adalah driver yang Anda buat. Letaknya dapat di mana saja, pada contoh ini letaknya di /root/desktop Anda juga perlu mengedit unistd.h pada direktori /usr/src/linux x.x.x/include/asm/ ke /usr/include/kernel/ karena file tersebut mengandung indeks system call Anda yang baru. #include <linux/errno.h> #include <sys/syscall.h> //agar dapat memanggil system call #include <linux/unistd.h> long errno; //this is the return code from the system call //this is a macro defined in unistd.h to help prototype sys calls int showproc(int i,char* c) return syscall( NR_showproc,i,c); int showproc_par(int i,char* c) return syscall( NR_showproc_par,i,c); int showproc_time(int i,char* c)
return syscall( NR_showproc_time,i,c); int showproc_grp(int i,char* c) return syscall( NR_showproc_grp,i,c); int main() printf("current process ID : %d\n",showproc(1, "hi")); printf("current process parent ID : %d\n",showproc_par(1, "hi")); printf("current process group : %d\n",showproc_grp(1, "hi")); printf("current process time : %d\n",showproc_time(1, "hi")); return 0; Pada file di atas, ada beberapa system call yang tidak dijelaskan pembuatannya pada tahap sebelumnya: showproc_par adalah system call yang mengembalikan current process parent ID showproc_grp adalah system call yang mengembalikan current process group showproc_time adalah system call yang mengembalikan current process time Compile file mainsp.c dengan perintah #gcc -o sp mainsp.c Eksekusi dengan perintah #./sp, maka akan tampil keluaran [root@localhost Desktop]#./sp Current process ID : 4329 Current process parent ID : 4299 Current process group : 4329 Current process time : -1 [root@localhost Desktop] Written by : R. Aditya Satrya Wibawa (adityasatrya.wordpress.com) Referensi: Adding a System Call to a 2.6.x Linux Kernel, By Corban Rivera, 3204 GTA Special Edition Using Linux, 4 th Edition. Que Tugas 1 Mata Kuliah Sistem Operasi IF3191 Menambah System call baru pada Kernel Linux 2.6.x.x Asistensi IF3191, by Pasukan Asisten Sister Tambah System Call di Linux, by Catur Wirawan Adding A System Call, Worchester Poltechnic Institute Computer Science Quick HOWTO : Ch33 : Modifying the Kernel to Improve Performance. Retrieved from "http://www.linuxhomenetworking.com/wiki/index.php/quick_howto_:_ch33_:_modifying_t he_kernel_to_improve_performance"