Difference between revisions of "OS: Mengerti System Call"

From OnnoWiki
Jump to navigation Jump to search
 
(5 intermediate revisions by the same user not shown)
Line 65: Line 65:
 
'''arch/ppc/kernel/entry.S'''
 
'''arch/ppc/kernel/entry.S'''
  
Eventually, this function loads up the address of the syscall table and indexes into it using the system call number. The syscall table is what the OS uses to translate from a system call number to a particular system call. The system call table is named sys_call_table and defined in:
+
Pada saatnya, function ini akan me-load address dari tabel syscall dan index ke address tersebut menggunakan nomor system call . Tabel syscall adalah apa yang digunakan oleh sistem operasi (OS) untuk menterjemahkan nomor system call ke system call tertentu. Tabel system call bernama sys_call_table didefinisikan di:
  
 
'''arch/ppc/kernel/misc.S'''
 
'''arch/ppc/kernel/misc.S'''
  
The syscall table contains the addresses of the functions that implement each system call. For example, the read() system call function is named sys_read. The read() system call number is 3, so the address of sys_read() is in the 4th entry of the system call table (since we start numbering the system calls with 0). We read the data from the address sys_call_table + (3 * word_size) and we get the address of sys_read().
+
Tabel syscall berisi address dari function yang mengimplementasikan setiap system call. Contoh, function system call read() bernama sys_read. Nomor system call read() adalah 3, oleh karenanya address dari sys_read() adalah entry ke 4 di tabel system call (karena nomor pertama system call adalah 0). Kita membaca data dari address sys_call_table + (3 * word_size) dan kita akan memperoleh address dari sys_read().
  
After DoSyscall has looked up the correct system call address, it transfers control to that system call. Let's look at where sys_read() is defined, in the file:
+
Setelah DoSyscall diperoleh address system call yang benar, dia akan mentransfer kontrol ke system call tersebut. Mari kita lihat dimana sys_read() di definisikan, dalam file:
  
 
'''fs/read_write.c'''
 
'''fs/read_write.c'''
  
This function finds the file struct associated with the fd number you passed to the read() function. That structure contains a pointer to the function that should be used to read data from that particular kind of file. After doing some checks, it calls that file-specific read function in order to actually read the data from the file, and then returns. This file-specific function is defined somewhere else - the socket code, filesystem code, or device driver code, for example. This is one of the points at which a specific kernel subsystem finally interfaces with the rest of the kernel. After our read function finishes, we return from the sys_read(), back to DoSyscall(), which switches control to ret_from_except, which is in defined in:
+
Function ini akan mengambil fice struct yang berhubungan dengan nomor fd yang kita kirim ke function read(). Struct ini berisi pointer ke function yang harusnya digunakan untuk membaca data dari file tertentu. Setelah melakukan beberapa check, dia akan call function read untuk file tertentu untuk membaca data dari file, dan kemudian return. Function file spesifik ini di definisikan di tempat lain, contohnya,socket code, file system code, atau device driver code. Di titik ini, sebuah subsystem kernel yang spesifik akan berinteraksi dengan kernel secara keseluruhan. Setelah function read kita selesai, kita akan kembali dari sys_read(), kembali ke DoSyscall(), akan akan men-switch control ret_from_except, yang di definisikan di:
  
 
'''arch/ppc/kernel/entry.S'''
 
'''arch/ppc/kernel/entry.S'''
  
This checks for tasks that might need to be done before switching back to user mode. If nothing else needs to be done, we fall through to the restore function, which restores the user process's state and returns control back to the user program. There! Your read() call is done! If you're lucky, you even got your data back.
+
Di tempat sini akan di cek task yang perlu diselesaikan sebelum switch kembali ke user mode. Jika tidak ada lagi yang perlu dilakukan, kita akan kembali ke function restore, yang akan me-restore state user proses dan mengembalikan control ke user program. Selesai sudah call ke read(). Jika kita beruntung, kita akan memperoleh data kita kembali.
  
You can explore syscalls further by putting printks at strategic places. Be sure to limit the amount of output from these printks. For example, if you add a printk to sys_read() syscall, you should do something like this:
+
Kita dapat mengeksplorasi syscall lebih dalam lagi dengan menempatkan printk pada berbagai tempat yang strategis. Pastikan untuk memberi batasan jumlah output dari printk, Contoh, kita dapat menambahkan printk ke syscall sys_read(), kita dapat menambahkan sebagai berikut:
  
 
  static int mycount = 0;
 
  static int mycount = 0;
Line 90: Line 90:
 
   }
 
   }
  
Have fun!
+
Selamat menikmati!
  
 
==Referensi==
 
==Referensi==
Line 100: Line 100:
 
* [[Linux]]
 
* [[Linux]]
 
* [[Ubuntu]]
 
* [[Ubuntu]]
 +
* [[Buku Sistem Operasi]]
 +
 +
===Secara Umum===
 +
 
* [[Sistem Operasi]]
 
* [[Sistem Operasi]]
 +
 +
===Instalasi Linux===
 +
 +
* [[Linux: CLI untuk Survival]]
 +
* [[Linux: Skema Partisi di Linux]]
 +
* [[Linux: Instalasi Sistem Operasi]]
 +
 +
===Compile Kernel===
 +
 
* [[Kernel]]
 
* [[Kernel]]
 +
* [[OS: Linux Kernel]]
 +
* [[Kernel: Anatomi Kernel Source]]
 
* [[Compile Kernel]]
 
* [[Compile Kernel]]
 
* [[Compile Kernel: Konfigurasi Kernel]]
 
* [[Compile Kernel: Konfigurasi Kernel]]
* [[Kernel: Anatomi Kernel Source]]
+
 
* [[OS: Linux Kernel]]
+
===Remaster Linux===
 +
 
 +
* [[Cara Cepat Melakukan Remastering Ubuntu]]
 +
 
 +
===Sistem Operasi untuk Embedded===
 +
 
 +
* [[OpenWRT]]
 +
* [[OpenWRT: Download Firmware yang sudah jadi]]
 +
* [[OpenWRT: Source Repository Download]]
 +
* [[OpenWRT: Melihat Daftar Package]]
 +
 
 +
====Membuat Firmware Sendiri====
 +
 
 +
* [[OpenWRT: Build Firmware]]
 +
* [[OpenWRT: Build Firmware Buffalo WZRHPG450H]]
 +
* [[OpenWRT: Build Firmware Buffalo WZRHPG300N]]
 +
* [[OpenWRT: Build Firmware Ubiquiti NanoStation2]]
 +
* [[OpenWRT: Build Firmware Mikrotik RB433]]
 +
* [[OpenWRT: Build Firmware Linksys WRT160NL]]
 +
* [[OpenWRT: Build Firmware Linksys WRT54GL]]
 +
 
 +
====Flash ke Device====
 +
 
 +
* [[OpenWRT: Flash Linksys WRT54GL]]
 +
* [[OpenWRT: Flash Buffalo WZRHP450H]]
 +
* [[OpenWRT: Flash Buffalo WZRHP300N]]
 +
* [[OpenWRT: Flash UBNT NanoStation2]]
 +
 
 +
====Beberapa Tip====
 +
 
 +
* [[OpenWRT: Mikrotik RB433]]
 +
* [[OpenWRT: 3G modem]]
 +
* [[OpenWRT: Build Firmware dengan 3G Modem Support]]
 +
* [[OpenWRT: Setup Firewall]]
 +
* [[OpenWRT: Konfigurasi UBNT NanoStation2 tanpa WebGUI]]
 +
 
 +
===Tuning Kernel===
 +
 
 
* [[OS: Parameter Kernel Default]]
 
* [[OS: Parameter Kernel Default]]
 +
 +
====Tuning Kernel Scheduler====
 +
 
* [[OS: Kernel Scheduler]]
 
* [[OS: Kernel Scheduler]]
 +
* [[OS: Tuning Kernel Scheduler]]
 +
* [[OS: Tuning Completely Fair scheduler CFS]]
 
* [[OS: Complete Teori Tuning Kernel Scheduler]]
 
* [[OS: Complete Teori Tuning Kernel Scheduler]]
 +
 +
====Tuning I/O Scheduler====
 +
 +
* [[OS: Tuning Completely Fair Queueing CFQ I/O scheduler]]
 
* [[OS: Complete Teori Tuning I/O Performance]]
 
* [[OS: Complete Teori Tuning I/O Performance]]
* [[OS: Tuning Kernel Scheduler]]
+
 
* [[OS: Tuning Completely Fair Queueing CFQ I/O scheduler]]
+
====Tuning Manajemen Memory====
* [[OS: Tuning Completely Fair scheduler CFS]]
+
 
 +
* [[OS: Tuning Manajemen Memory]]
 +
 
 +
===Android===
 +
 
 +
* [[OS: Android - Download]]
 +
 
 +
===Membuat Kernel Module===
 +
 
 +
* [[OS: Mengerti System Call]]
 +
* [[OS: Membuat Kernel Modul]]
 +
 
 +
===Monitoring & Benchmark===
 +
 
 
* [[OS: Build in Monitoring Tool]]
 
* [[OS: Build in Monitoring Tool]]
 
* [[Linux Benchmarking]]
 
* [[Linux Benchmarking]]
 
* [[OS: Benchmarking menggunakan UnixBench]]
 
* [[OS: Benchmarking menggunakan UnixBench]]
 
* [[OS: Benchmarking menggunakan LLCBench]]
 
* [[OS: Benchmarking menggunakan LLCBench]]
* [[OS: Mengerti System Call]]
 
* [[OS: Membuat Kernel Modul]]
 

Latest revision as of 13:44, 7 April 2013

Sumber: http://www.linuxchix.org/content/courses/kernel_hacking/lesson7

Saat kita membaca-baca code device driver akan mulai berfikir, "Bagaimana function foo_read() di panggil?" Atau kita berfikir, "Ketika kita menulis cat /proc/cpuinfo, bagaimana function cpuinfo() dipanggil?"

Setelah kernel selesai booting, flow control berubah dari yang bersifat langsung "Function mana yang akan di panggil selanjutnya?" menjadi tergantung pada system call, exception dan interupsi. Mari kita bahas bagaimana cara sistem call dilakukan?

Apakah system call?

Secara gamblang, system call (biasa di kenal sebagai "syscall") adalah sebuah instruksi, mirip dengan instruksi "add" atau "jump". Pada tingkat tinggi, sebuah system call adalah cara sebuah program pada level user untuk meminta pada sistem operasi untuk menjalankan sesuatu untuknya. Jika kita seorang programmer, dan kita membutuhkkan untuk membaca dari sebuah file, kita akan menggunakan system call untuk meminta sistem operasi untuk membaca file tersebut untuk kita.

Lebih detail tentang System call

Cara system call bekerja adalah sebagai berikut. Pertama-tama, user program akan mensetup argument untuk system call. Salah satu argumen adalah nomor system call. Perlu di catat bahwa semua ini dilakukan secara automatis oleh fungsi library kecuali jika kita menulis menggunakan bahasa assembler. Sesudah semua argumen di setup, program akan menjalankan instruksi "system call". Instruksi ini akan menyebabkan exception: event yang akan menyebabkan processor untuk jump ke satu address dan mulai menjalankan program / code di address tersebut.

Instruksi di alamat yang baru akan menyimpan state user program, menentukan sistem call apa yang kita inginkan, kemudian call fuction tersebut di kernel yang mengimplementasikan system call, setelah selesai maka mengembalikan program state, dan kembali ke user program. Sebuah system call adalah salah satu cara agar function yang di definisikan dalam device driver untuk bisa di panggil.

Bagi yang ingin mendalami lebih lanjut, di persilahkan untuk membaca selanjutnya.

Contoh System Call

Berikut kita akan mulai memperlihatkan code beserta sedikit teorinya. Kita akan mengikuti gerakan dari system call read(), mulai dari instruksi system call di jalankan. Arsitektur PowerPC akan digunakan sebagai contoh dari code yang spesifik arsitektur. Di PowerPC, saat kita menjalankan system call, processor akan jump ke address 0xc00. Code pada lokasi ini di definisikan pada file:

arch/ppc/kernel/head.S

Ini akan tampak seperti:

/* System call */
        . = 0xc00
SystemCall:
        EXCEPTION_PROLOG
        EXC_XFER_EE_LITE(0xc00, DoSyscall)

/* Single step - not used on 601 */
        EXCEPTION(0xd00, SingleStep, SingleStepException, EXC_XFER_STD)
        EXCEPTION(0xe00, Trap_0e, UnknownException, EXC_XFER_EE)

Yang akan dilakukan oleh code ini adalah menyimpan state program, dan call function DoSyscall. Berikut adalah penjelasan lebih detail:

  • EXCEPTION_PROLOG adalah sebuah macro yang akan menangani switch dari user ke kernel space, yang akan melakukan hal seperti menyimpan kondisi register dari proses user.
  • EXC_XFER_EE_LITE akan dipanggil menggunakan address dari route tersebut, dan address dari function DoSyscall. Pada suatu saat, register akan di simpan dan DoSyscall akan di panggil. Dua kalimat selanjutnya adalah exception vector pada address 0xd00 dan 0xe00.

EXC_XFER_EE_LITE akan tampak sebagai berikut:

#define EXC_XFER_EE_LITE(n, hdlr)       \
        EXC_XFER_TEMPLATE(n, hdlr, n+1, COPY_EE, transfer_to_handler, \
                          ret_from_except)

EXC_XFER_TEMPLATE adalah macro, dan code akan tampak sebagai berikut:

#define EXC_XFER_TEMPLATE(n, hdlr, trap, copyee, tfer, ret)     \
        li      r10,trap;                                       \
        stw     r10,TRAP(r11);                                  \
        li      r10,MSR_KERNEL;                                 \
        copyee(r10, r9);                                        \
        bl      tfer;                                           \
i##n:                                                           \
        .long   hdlr;                                           \
        .long   ret

li singkatan dari "load immediate", yang berarti nilai kontanta yang diketahui saat waktu compile di simpan di register. Pertama kali, trap di load ke register r10. Di kalimat selanjutnya, nilai tersebut di simpan ke address yang diberikan oleh TRAP(r11). TRAP(r11) dan dua kalimat selanjutnya melakukan manipulasi bit spesifik, yang pada dasarnya melakukan housekeeping, dan kemudian men-transfer kontrol ke register, oleh karenanya kita akan melihat .long DoSyscall bukan bl DoSyscall.

Selanjutnya, mari kita lihat DoSyscall. Ini ada di file:

arch/ppc/kernel/entry.S

Pada saatnya, function ini akan me-load address dari tabel syscall dan index ke address tersebut menggunakan nomor system call . Tabel syscall adalah apa yang digunakan oleh sistem operasi (OS) untuk menterjemahkan nomor system call ke system call tertentu. Tabel system call bernama sys_call_table didefinisikan di:

arch/ppc/kernel/misc.S

Tabel syscall berisi address dari function yang mengimplementasikan setiap system call. Contoh, function system call read() bernama sys_read. Nomor system call read() adalah 3, oleh karenanya address dari sys_read() adalah entry ke 4 di tabel system call (karena nomor pertama system call adalah 0). Kita membaca data dari address sys_call_table + (3 * word_size) dan kita akan memperoleh address dari sys_read().

Setelah DoSyscall diperoleh address system call yang benar, dia akan mentransfer kontrol ke system call tersebut. Mari kita lihat dimana sys_read() di definisikan, dalam file:

fs/read_write.c

Function ini akan mengambil fice struct yang berhubungan dengan nomor fd yang kita kirim ke function read(). Struct ini berisi pointer ke function yang harusnya digunakan untuk membaca data dari file tertentu. Setelah melakukan beberapa check, dia akan call function read untuk file tertentu untuk membaca data dari file, dan kemudian return. Function file spesifik ini di definisikan di tempat lain, contohnya,socket code, file system code, atau device driver code. Di titik ini, sebuah subsystem kernel yang spesifik akan berinteraksi dengan kernel secara keseluruhan. Setelah function read kita selesai, kita akan kembali dari sys_read(), kembali ke DoSyscall(), akan akan men-switch control ret_from_except, yang di definisikan di:

arch/ppc/kernel/entry.S

Di tempat sini akan di cek task yang perlu diselesaikan sebelum switch kembali ke user mode. Jika tidak ada lagi yang perlu dilakukan, kita akan kembali ke function restore, yang akan me-restore state user proses dan mengembalikan control ke user program. Selesai sudah call ke read(). Jika kita beruntung, kita akan memperoleh data kita kembali.

Kita dapat mengeksplorasi syscall lebih dalam lagi dengan menempatkan printk pada berbagai tempat yang strategis. Pastikan untuk memberi batasan jumlah output dari printk, Contoh, kita dapat menambahkan printk ke syscall sys_read(), kita dapat menambahkan sebagai berikut:

static int mycount = 0;

if (mycount < 10) {
         printk ("sys_read called\n");
         mycount++;
  }

Selamat menikmati!

Referensi

Pranala Menarik

Secara Umum

Instalasi Linux

Compile Kernel

Remaster Linux

Sistem Operasi untuk Embedded

Membuat Firmware Sendiri

Flash ke Device

Beberapa Tip

Tuning Kernel

Tuning Kernel Scheduler

Tuning I/O Scheduler

Tuning Manajemen Memory

Android

Membuat Kernel Module

Monitoring & Benchmark