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/linux2.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/linux2.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 menginclude 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 menggenerate system call “stub” sehingga program user dapat mengivokasi system call Anda. Lakukanlah dengan cara mengedit file /usr/src/linux2.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 #define #define ... #define #define
__NR_restart_syscall __NR_exit __NR_fork
0 1 2
__NR_eventfd __NR_mysyscall
323 324
Anda perlu menambahkan #define untuk system call Anda pada akhir file dengan menuliskan “__NR_” sebgai prefix. Sebagai contoh, ditambahkan #define __NR_showproc
Kemudian tambahkan juga
325
#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/linux2.6.xx/arch/i386/kernel/ Agar dapat dilink dengan baik, system call Anda membutuhkan kata “asmlinkage” sebelum fungsi dan “sys_” sebelum nama fungsi. Perlu juga dituliskan #include
agar “asmlinkage” dikenali. Contohnya, Anda akan menuliskan #include #include /*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 dilink dengan baik. 7. Lakukan konfigurasi kernel jika dibutuhkan. Ada tiga cara untuk melakukan konfigurasi kernel, yaitu melalui : textbased 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. textbased 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 terinstall X Windows, Anda dapat menggunakan Xbased 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.226new. 11. Compile kernel dengan perintah #make. Ini akan memakan waktu yang cukup lama. 12.#make modules_install
Tujuannya adalah untuk mengcopy semua module yang diciptakan pada tahap sebelumnya ke tempat defaultnya, yaitu direktori /lib/modules/. 13.#make install
Kernel yang telah Anda buat harus dicopy 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 mengupdate 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 ke3, 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 #include <sys/syscall.h> //agar dapat memanggil system call #include 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 printf("Current printf("Current printf("Current return 0;
process process process process
ID : %d\n",showproc(1, "hi")); parent ID : %d\n",showproc_par(1, "hi")); group : %d\n",showproc_grp(1, "hi")); time : %d\n",showproc_time(1, "hi"));
}
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 Current process Current process Current process Current process [root@localhost
Desktop]# ./sp ID : 4329 parent ID : 4299 group : 4329 time : -1 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 th ● Special Edition Using Linux, 4 Edition. Que ● Tugas1 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"