Menambah System Call di Linux Kernel 2.6

Tulisan ini berisi langkah-langkah yang dilakukan dalam menambahkan system call baru ke dalam Linux Kernel 2.6.31.

Konfigurasi sistem:

  • Fedora 11 i386, kernel 2.6.29.4-167.fc11.i686.PAE

Langkah-langkah yang dilakukan:

  1. Download source kernel linux 2.6.31 di http://www.kernel.org.
  2. Ekstrak file hasil download di home directory, dalam kasus saya /usr/src/. Souce kernel linux akan berada di /usr/src/linux-2.6.31/
  3. Buatlah file baru coba.c di /usr/src/linux-2.6.31/arch/x86/kernel/. Isi file tersebut dengan:
    #include <linux/linkage.h>
    
    asmlinkage int sys_coba(int a, int b) {
        return 1234;
    }
    
  4. Pada file /usr/src/linux-2.6.31/arch/x86/kernel/Makefile, tambahkan “obj-y += coba.o” setelah baris 44
  5. Pada file /usr/src/linux-2.6.31/arch/x86/kernel/syscall_table_32.S, tambahkan “.long sys_coba” setelah baris terakhir
  6. Pada file /usr/src/linux-2.6.31/arch/x86/include/asm/unistd_32.h, tambahkan baris berikut
    #define __NR_coba               337
    

    setelah baris yang berisi:

    #define __NR_perf_counter_open  336
    

Setelah semua file di atas diedit, sekarang waktunya mengkompile kernelnya.

  1. Di direktori /usr/src/linux-2.6.31, lakukan ‘cp /boot/config-2.6.29.4-167.fc11.i686.PAE .config’
  2. Ketik ‘make menuconfig’, jika sudah keluar dialog langsung pilih ‘exit’ saja.
  3. Ketik ‘make’
  4. Ketik ‘make modules_install’
  5. Ketik ‘make install’

Supaya dapat memilih kernel mana yang ingin dipakai saat booting, edit file /boot/grub/grub.conf pada bagian “timeout”, ganti angkanya dengan interval yang diinginkan pada menu boot supaya menunya kelihatan.

Setelah semua langkah di atas dilakukan, maka reboot-lah komputer.

Selesai?
Belum saudara-saudara…

Supaya daftar system call baru kita up-to-date, kopikan file /usr/src/linux-2.6.31/arch/x86/include/asm/unistd* ke direktori /usr/include/asm/

Sekarang waktunya kita coba panggil system call barunya…
Buatlah file coba.h, terserah tempatnya di mana, dengan isi:

#include <linux/unistd.h>
#include <linux/errno.h>
#include <sys/syscall.h>

int coba(int a, int b) {
    return syscall(__NR_coba, a, b);
}

Lalu buat juga file test.c di direktori yang sama dengan coba.h. Isi dengan:

#include <stdio.h>
#include "coba.h"

int main() {
    // sebenarnya parameter pada fungsi coba ini mubadzir, muspro, kuo-kuo...
    printf("coba = %d\n", coba(1, 2));
    perror(NULL);

    return 0;
}

Compile file test.c dengan perintah “gcc test.c -o test”, lalu jalankan program test dengan “./test”.
Program akan menghasilkan:

coba = 1234
Success

Angka 1234 adalah return value dari system call yang baru kita buat dan ‘Success’ adalah kode errno. Lihat errno(3) untuk informasi lebih banyak tentang si errno.

Sekian dokumentasi dari saya, apabila ada kesalahan silakan langsung dikoreksi saja karena saya bikin ini sambil ngantuk-ngantuk juga…

Oh iya, karena ini dipost pas 1 Syawal, saya ucapkan juga Selamat Idul Fitri, mohon maaf lahir dan batin…

  1. kurang kerjaan banget ya ngoprek pas lebaran?
  2. yah gimana lagi, tugas kuliah
  3. kalau bukan tugas ya gak sudi, mending takbiran, atau tidur aja……

## kok malah curhat….

Terima kasih sudah mau baca sampai akhir dan semoga bermanfaat.