Senin, 11 April 2011

Tambah system call di linux

gak ada game kelas berat yang bisa dimainin dilinux jadi iseng-iseng nambah system call di linux. gak susah kok jangan kapok pake linux. gue juga baru pake Februari 2007(nekat gue) setelah terinpirasi oleh abang herdy yang berkomitmen tidak memakai bajakan, adikmu mengambi langkah yang lebih ekstrem bang.., eh September 2007 gue udah otak-atik kernel..buseet dah. linux memaksa kita melampau batas
1.  Download source kernel Linux dari alamat berikut
    http://user.arc.itb.ac.id/incoming/kernel/linux-2.6.22.tar.gz  atau http://www.kernel.org
    Untuk tugas ini dipergunakan source kernel dengan versi rilis 2.6.22.
2.  Extract file tar source kernel tersebut ke direktori /usr/src/ dan rename /usr/src/linux-2.6.x mejadi /usr/src/linux
3.  Edit file /usr/src/linux/arch/i386/kernel/syscall_table.S
4.  Tambahkan .long sys_coba pada akhir file tersebut.
5.  Buatlah sebuah file dengan nama coba.c pada direktori
    usr/src/linux/arch/i386/kernel/
    Buatlah system call yang me-return sebuah nilai sesuai dengan kerangka program di bawah. 
      #include <linux/linkage.h>
      asmlinkage int sys_coba (int arg1, char* arg2) {
        
return(5);
      }

6.  Editlah file usr/src/linux/arch/i386/kernel/Makefile lalu tambahkan
        coba.o pada akhir baris ke 10.
7.  Editlah file /usr/src/linux/include/asm-i386/unistd.h dan tambahkan 
      #define __NR_coba  324
    setelah 
      #define __NR_eventfd    323
8.  Kemudian ubah juga
      #define NR_syscalls     324
    menjadi
      #define NR_syscalls     325
9.  Sekarang compile-lah source kernel yang sudah dimodifikasi tadi. cara kompile:
    1.$su
    2.#cp kernel 2.6.xx.tar.gz /usr/src
    3.#cd /usr/src
         #tar -zxvf kernel-2.6.xx
        #mv linux-2.6.xx linux
    4.#cd linux
    5.#make clean
    6.#make menuconfig –>langsung pilih exit aja
    7.#make
    8.#make modules_install install
10. Selesaikan proses instalasi kernel baru dan kemudian reboot dengan kernel baru tersebut. 
saya menemukan sedikit keanehan saat selesai kompile dan reeboot. sistem call saya tidak dapat dikenal,pesan kompiler:undefined reference, sehingga saya menambah langkah yang sumber saya dapat di internet
adapun saya membuat sistem call dengan nama coba.c (nama system call yang saya contohkan adalah ‘coba(int arg1, char* arg2)’ bukan mysyscall)yang berisi:
    #include <linux/linkage.h>
  
    asmlinkage int sys_coba(int arg1,char* char2){
        return(5);
    }

setelah reboot, saya melakukan langkah berikut agar sistem call saya dikenali
1. copy file di /usr/src/linux/include/asm-i386/unistd.h ke /usr/include/asm ; jika ada peringatan overwrite jawab dengan yes. menurut sumber yang saya baca,Adding a System Call to a 2.6.x Linux Kernel By Corban Rivera, 3204 GTA, hal ini diperlukan karena file unistd.h pada /usr/include/asm belum me-list system call kita. setelah saya periksa pada /usr/include/asm/unistd.h ,ternyata benar file tersebut hanya men-list 317 system call berbeda sekali dengan unistd.h yang kita edit yang berisi 324 system call. sehingga saya merasa perlu melakukan penimpaan file
2. lalu saya membuat header file coba.h yang berisi
    #include <linux/unistd.h>
    #include <linux/errno.h>
    #include <sys/syscall.h>

    long errno;/*kode kembalian untuk syscall*/
    /*#define __NR_coba 324*/
    /*_syscall2(int,coba, int, arg1, char*, arg2);*/

    int coba(int i,char* c)/*ada dua parameter sesuai coba.c*/
    {
                return syscall(__NR_coba,i,c);
    }

3.lalu menurut sumber yang saya baca,Adding A system call by Worcester Polytechnic Institute Computer science, kita harus mengkopi file header yang kita buat, dalam contoh ini,coba.h ke /usr/include/sys
4.lalu membuat tesfile tes.c (dimana saja contohnya /home/catur)
    #include <stdio.h>
    #include <sys/coba.h>

    int main(){
        /*parameter-parameter ini sebenarnya mubazir*/
      printf("%d",coba(1, "hi"));/*tampilan ke layar: 5*/

    }
5.kompile $gcc -o tes tes.c
6.jalankan $./c
7.program akan mengeluarkan 5
saya berpikir,seharusnya tidak perlu ada langkah tambahan seperti ini, apa karena kita tidak menimpa kernel sebelumnya maka semua file-file library lama,termasuk systemcall, tidak terganti? jika ya,apakah mungkin kita harus melakukan hard link,soft link atau menimpa secara manual ke semua file library?, maka untuk teman-teman yang berhasil tanpa perlu melakukan langkah tambahan ini mohon direply mungkin ada hal yang kurang pada post saya sebelumnya,’cara lain kompile kernel’
terima kasih kepada punk_ab atas sumber-sumbernya. bisa dilihat di (http://students.if.itb.ac.id/~if15020/if3191/)
Ketua Brurkom(klub linuxer)


smber :
http://catur20.blogsome.com/2007/09/20/tambah-system-call-di-linux/

0 komentar:

Posting Komentar

newer post older post Home