Menambahkan System Call pada Kernel di Ubuntu

Pada kesempatan kali ini saya akan berbagi ilmu tentang bagaimana menambahkan suatu system call baru pada kernel dalam lingkungan linux ubuntu. Sebelumnya saya akan memberikan penjelasan mengenai apa itu Kernel dan apa itu System Call.

Kernel adalah suatu perangkat lunak yang menjadi bagian utama dari sebuah sistem operasi. Selain itu kernel juga berfungsi sebagai extended machine dan ressource manager. Kernel sebagai extended machine membuat kerumitan- kerumitan yang harus dilakukan pada operating system layer tampak mudah/ menyembunyikannya dari user yang kita bisa sebut juga sebagai Application Program Interface (API). Kernel sebagai resource manager berfungsi mengatur alokasi waktu, ruang, dll yang dibutuhkan oleh suatu program.

System call adalah tata cara pemanggilan di program aplikasi untuk memperoleh layanan yang disediakan oleh kernel. System call berupa rutin sistem operasi untuk keperluan tertentu yang spesifik. Bentuk system call beragam, terbanyak berupa rutin prosedur atau fungsi.

Dibawah ini saya akan mencaoba menambahkan systemcall dengan nama mysyscall yang berguna untuk menampilkan local time dengan mengabaikan parameter zona watu.

Menambahkan system call

1.    Download kernel linux versi 2.6.32, nama file: linux-2.6.32.tar.gz

2.    Copy download ke direktori /usr/src

3.    Masuk direktori /usr/src

cd /usr/src

4.    Extract archive linux-2.6.32 pada direktori /usr/src

sudo tar zxf linux-2.6.32.tar.gz

5.    Kita akan membuat system call dengan nama fungsi mysyscall, untuk itu buat folder mysyscall pada /usr/src/linux-2.6.32:

sudo mkdir /usr/src/linux-2.6.32/mysyscall

6. Cari file /usr/src/linux-2.6.32/arch/x86/kernel/syscall_table_32.S, dan buka

sudo gedit /usr/src/linux-2.6.32/arch/x86/kernel/syscall_table_32.S

tambahkan pada akhir file:

.long sys_mysyscall

7.    Cari file /usr/src/linux-2.6.32/arch/x86/include/asm/unistd_32.h, dan buka

sudo gedit /usr/src/linux-2.6.32/arch/x86/include/asm/unistd_32.h

tambahkan:

#define __NR_mysyscall 337

setelah baris:

#define __NR_perf_event_open 336

8.    Cari file /usr/src/linux-2.6.32/include/linux/syscalls.h , dan buka

sudo gedit /usr/src/linux-2.6.32/include/linux/syscalls.h

tambahkan:

asmlinkage int sys_mysyscall(struct timeval *current_time);

setelah baris 881

9. Cari file /usr/src/linux-2.6.32/Makefile, dan buka

sudo gedit /usr/src/linux-2.6.32/Makefile

cari baris dengan text “core-y                 +=” (jarak antara ‘y’ dan ‘+’ 2 tab), dan sunting menjadi:

core-y      += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ mysyscall/

10. Buat file mysyscall.c pada direktori /usr/src/linux-2.6.32/mysyscall:

sudo gedit /usr/src/linux-2.6.32/mysyscall/mysyscall.c

isikan source code system call baru yang akan ditambahkan sebagai berikut:

/* file mysyscall.c */#include <linux/linkage.h>#include <linux/unistd.h>

#include <linux/time.h>

#include <linux/kernel.h>

asmlinkage int sys_mysyscall(struct timeval *current_time) {

/** tulis kode system call baru Anda di sini **/

if (current_time != NULL) {

/* sudah dialokasi */

do_gettimeofday(current_time);

}else{

/* current_time belum dialokasi */

return 0;

}

/* berhasil mendapatkan system time */

return 1;

}

11. Buat file Makefile pada direktori /usr/src/linux-2.6.32/mysyscall:

sudo gedit /usr/src/linux-2.6.32/mysyscall/Makefile

isikan sebagai berikut:

obj-y := mysyscall.o

12. Anda telah berhasil menambahkan system call pada kernel linux, Selamat Gan!!! Lanjut ke mengkompilasi kernel agar bisa dipakai system call anda yang buat

Mengkompilasi kernel

1.    Untuk mengkompilasi kernel, sebelumnya tambahkan program berikut ini, bisa lewat Synaptic Package Manager atau lewat sudo apt-get install

kernel-package libncurses5-devfakeroot

kernel-wedge

build-essential

libncurses5

makedumpfile

2.    Setelah menambahkan program-program diatas pada linux Anda, sekarang ayo memulai kompile kernel. Masuk direktori /usr/src/linux-2.6.32:

cd /usr/src/linux-2.6.32

3.    Sekarang konfigurasi kernel, samakan konfigurasi dengan konfigurasi kernel anda saat ini:

sudo make oldconfig

4.    Supaya dalam mengkompilasi kernel, yang dikompilasi hanya modul yang dibutuhkan system anda:

sudo make localmodconfig

5.    Untuk konfigurasi lebih lanjut (tapi repot mending gak usah):

sudo make menuconfig

6.    Untuk membuat clean build:

sudo make-kpkg clean

7.    Kompile semua source code:

sudo make all

8.    Setelah selesai kompilasi (nunggu lama), masukkan:

sudo fakeroot make-kpkg –initrd –append-to-version=-custom kernel-image kernel-headers

9.    Kompilasi sudah berhasil. Sekarang masuk direktori /usr/src

cd /usr/src

10. Instalasi kernel:

sudo dpkg -i linux-image-2.6.32-custom_2.6.32-custom-10.00.Custom_i386.debsudo dpkg -i linux-headers-2.6.32-custom_2.6.32-custom-10.00.Custom_i386.deb

11. Masuk direktori /boot:

cd /boot

12. Buat initrd image

sudo mkinitramfs -k -o initrd.img-2.6.32-custom 2.6.32-custom

13. Update grub, supaya kernel yang baru muncul pada boot

sudo update-grub

14. Instalasi selesai sekaran restart dan coba boot dengan kernel yang baru yaitu “Ubuntu, Linux 2.6.32-custom”

Untuk mencoba menjalankan system call yang baru anda dapat membuat program kecil seperti dibawah ini:

/* file: c.h */#include <linux/unistd.h>#define __NR_mysyscall 337

int mysyscall(struct timeval *tv)

{

return syscall(__NR_mysyscall,tv);

}

/* file c.c */

#include <sys/time.h>

#include <time.h>

#include <stdlib.h>

#include <stdio.h>

#include “c.h”

int main(void)

{

struct timeval current_time;

struct tm * timeinfo;

int output=mysyscall(&current_time);

if(output){

/* Jika berhasil */

timeinfo = localtime ( &current_time.tv_sec );

printf(“System time: %s”,asctime (timeinfo));

printf(“Microsecond: %ld\n”,(long)current_time.tv_usec);

}else{

/* Jika gagal */

printf(“gagal mengambil system time\n”);

}

return 0;

}

sekian bagaimana cara untuk menambahkan system call anda sendiri semoga bermanfaat.

NB: pada saat melakukan kompilasi akan memawan waku yang lam +-  1,5 jam.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s