Hello World di System Call Kernel Linux
Tulisan di bawah ini diambil dari tulisan pada akhir 2003 atau 2004 (dah agak lupa). Pas masih semangat buka-buka kernel linux. Yeaaaahhhh, sekarang semangat itu mulai balik lagi….Setelah nemu buku Linux Kernel Development(blom beli) & ada milis tuxceria….
Walaupun tulisannya dah basi, tapi mengingatkanku bahwa aku juga bisa nulis lo….:D.
ganbatteee
(in 5′th semester of TA)
Ayo ndang digarap TA ne , ndang lulus, ndang dolanan kernel meneh !!
————————————-
Hello World di System Call
Untuk mengikuti latihan dalam tulisan ini, pembaca harus memiliki source code dari kernel linux. Penulis menggunakan kernel versi 2.4.18 , di komputer i386.Semua nama file dalam latihan ini, juga disertakan nama direktorinya relatif terhadap direktori source dari kernel linux.
Misal direktori source kernel linux di : /data/kernel-2.4.18 ,dan disebutkan nama file include/linux/hello.h berarti file tersebut adalah file /data/kernel-2.4.18/include/linux/hello.h
File-file yang perlu diperhatikan
* arch/i386/kernel/entry.S
* include/asm-i386/unistd.h
* include/linux/unistd.h
* kernel/hello.c -> digunakan dalam tulisan ini sebagai contoh
System call adalah kernel function yang di export untuk digunakan program yang berjalan di user space
Kernel function ini tidak dapat dipanggil langsung seperti fungsi biasa, tetapi fungsi tersebut harus dipanggil melalui trap table. Jadi jika kita ingin menulis kernel function baru, kita harus membuat entry baru di kernel trap table untuk menciptakan referensi ke fungsi tersebut
Proses pemanggilan system call: fungsi system_call() menyimpan context dari proses yang memanggil, cek untuk memastikan fungsi yang dipanggil berada dalam sys_call_table(arch/i386/kernel/entry.S) kemudian memanggil fungsi tersebut. Control Flow akan berbeda jika kernel tracing di set enable menggunakan syscall_trace(). Dalam kasus ini,system_call() menginvoke syscall_trace() sebelum dan sesudah pemanggilan fungsi
Di program C yang mengikuti standar ANSI, saat proses kompilasi digunakan protoype fungsi untuk memastikan kebenaran jumlah dan argumen fungsi.
System call tidak menggunakan mekanisme ini saat kompilasi. Pada saat dipanggil, system call berasumsi bahwa jumlah dan type argumen sesuai dengan spesifikasi
Langkah-langkah pembuatan Hello World di system call
*Buat dan edit file kernel/hello.c
#include
asmlinkage int sys_hello()
{
printk(“Hello world”);
return 9;
}
o catatan walaupun system call yang akan kita buat bernama hello, kita memberi nama di dalam source code sebagai sys_hello, semua system call lain melakukan cara yang sama. Penulis belum tahu secara jelas alasannya ![]()
o Mengapa return 9 …? Angka 9 tidak berarti apa-apa, ini hanyalah tentang sepakbola
* header file dan systam call stub
buat dan edit file include/linux/hello.h
#ifndef _LINUX_HELLO_H
#define _LINUX_HELLO_H
#include
#include
_syscall0(int,hello)
#endif
Angka 0 menunjukkan system call ini dipanggil dengan 0 argumen.argumen pertama menyatakan tipe keluaran fungsi, argumen kedua menyatakan nama fungsi.
Jika kita akan membuat system call hitung dengan 1 argumen bertipe integer bernama bilangan maka kita tulis:
_syscall1(int,hitung,int,bilangan)
* syscall table
Daftarkan fungsi hello() ke dalam sys_call_table di file arch/i386/kernel/entry.S dengan menambahkan baris berikut:
.long SYMBOL_NAME(sys_hello)
dan catat nomer fungsinya ( di kernel 2.4.18 , fungsi ini menjadi entry ke 238).
*Untuk melengkapi pembangkitan system call stub
Edit file include/asm-i386/unistd.h dengan menambahkan baris berikut:
#define __NR_hello 238
angka 238 sesuai dengan nomer entry fungsi hello di sys_call_table
*Makefile
Untuk keperluan kompilasi kernel,edit file Makefile di direktori dimana file hello.c diletakkan(dalam hal ini direktori kernel). Tambahkan baris berikut
obj-y += hello.o
* Kompilasi kernel
Untuk keperluan kompilasi kernel, pembaca dapat membaca file README
. Atau dapat melihat FAQ kompilasi kernel
*Update header file gcc anda
update header file dengan mengcopy file include/linux/hello.h ke direktori /usr/include/linux/
*Pemanggilan fungsi
System call hello world kita sudah dapat dipanggil dengan memanggil fungsi hello() . dan menginclude linux/hello.h
contoh :
#include
#include
int main(){
printf(“tes:%d\n”,hello());
return 0;
}
kemudian kita kompile seperti biasa : gcc -o exe namafile.c
dan dipanggil dengan : ./exe
Jika anda memanggil program ini di console, akan muncul tulisan HelloWorld
Met kenalan sama kernel linux anda.