Difference between revisions of "OS: Membuat Kernel Modul"
Onnowpurbo (talk | contribs) |
Onnowpurbo (talk | contribs) |
||
(9 intermediate revisions by the same user not shown) | |||
Line 2: | Line 2: | ||
* http://www.linuxchix.org/content/courses/kernel_hacking/lesson8 | * http://www.linuxchix.org/content/courses/kernel_hacking/lesson8 | ||
* http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html | * http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html | ||
− | + | * http://www.tldp.org/LDP/lkmpg/2.6/html/x181.html | |
+ | * http://www.tldp.org/LDP/lkmpg/2.6/html/ | ||
Pada bagian ini, kita akan menulis dan load sebuah kernel modul sederhana. Dengan menuliskan sendiri modul kita menjadi belajar bagaimana menulis code kernel yang berdiri sendiri, belajar bagaimana menggunakan modul, dan menemukan beberapa aturan bagaimana kernel terkait menjadi satu kesatuan. | Pada bagian ini, kita akan menulis dan load sebuah kernel modul sederhana. Dengan menuliskan sendiri modul kita menjadi belajar bagaimana menulis code kernel yang berdiri sendiri, belajar bagaimana menggunakan modul, dan menemukan beberapa aturan bagaimana kernel terkait menjadi satu kesatuan. | ||
− | Catatan: instruksi disini ditulis untuk kernel | + | Catatan: instruksi disini ditulis untuk kernel 3.8.x yang mungkin tidak cocok untuk versi kernel yang berbeda. |
==Apakah kernel mendukung modul?== | ==Apakah kernel mendukung modul?== | ||
Line 12: | Line 13: | ||
Kernel yang kita gunakan, harus di compile dengan option: | Kernel yang kita gunakan, harus di compile dengan option: | ||
− | + | [*] Enable loadable module support ---> | |
− | [ | + | [ ] Forced module loading |
− | [*] Module unloading | + | [*] Module unloading |
− | [ ] Module versioning support | + | [ ] Forced module unloading |
− | [*] | + | [*] Module versioning support |
+ | [*] Source checksum for all modules | ||
+ | [*] Module signature verification | ||
+ | [ ] Require modules to be validly signed | ||
Pastikan pada saat kita mengcompile kernel opsi di atas di aktifkan. Jika tidak, kita perlu mengcompile ulang kernel. | Pastikan pada saat kita mengcompile kernel opsi di atas di aktifkan. Jika tidak, kita perlu mengcompile ulang kernel. | ||
+ | |||
+ | Sebaiknya, sebelum berexperimen dengan kernel modul, kita mengcompile ulang kernel yang kita gunakan. | ||
+ | Tentunya lengkap dengan update-grub dan kemudian boot ke kernel baru tersebut untuk berexperimen dengan kernel modul yang kita buat. | ||
==Rangka Kernel Modul Sederhana== | ==Rangka Kernel Modul Sederhana== | ||
− | Pertama kali, kita perlu mencari lokasi directory tempat kernel di compile, biasanya di /usr/src/linux. Kemudian ubah directory ke drivers/misc dari directory source code Linux. | + | Pertama kali, kita perlu mencari lokasi directory tempat kernel di compile, biasanya di /usr/src/linux. Kemudian ubah directory ke drivers/misc dari directory source code Linux. Lakukan di shell |
+ | |||
+ | cd /usr/src/linux/drivers/misc | ||
+ | |||
+ | Edit file, misalnya, mymodule.c | ||
− | Sekarang, copy paste code berikut ke file | + | vi mymodule.c |
+ | |||
+ | Sekarang, copy paste code berikut ke file mymodule.c | ||
#include <linux/module.h> | #include <linux/module.h> | ||
− | #include <linux/ | + | #include <linux/configfs.h> |
#include <linux/init.h> | #include <linux/init.h> | ||
Line 47: | Line 60: | ||
MODULE_LICENSE("GPL"); | MODULE_LICENSE("GPL"); | ||
− | Simpan file .c tersebut. | + | Simpan file .c tersebut. Edit Makefile di directory tersebut. |
− | Edit Makefile di directory tersebut. | + | |
+ | cd /usr/src/linux/drivers/misc | ||
+ | vi Makefile | ||
+ | |||
Tambahkan kalimat: | Tambahkan kalimat: | ||
Line 56: | Line 72: | ||
# make -C [top directory dari source kernel] SUBDIRS=$PWD modules | # make -C [top directory dari source kernel] SUBDIRS=$PWD modules | ||
+ | |||
+ | Atau yang lebih jelas | ||
+ | |||
+ | # make -C /usr/src/linux SUBDIRS=$PWD modules | ||
===Jalankan Module=== | ===Jalankan Module=== | ||
Line 61: | Line 81: | ||
Load module. Tergantung versi kernel yang kita gunakan, ketik: | Load module. Tergantung versi kernel yang kita gunakan, ketik: | ||
− | + | cd /usr/src/linux/drivers/misc | |
+ | insmod ./mymodule.ko | ||
Atau: | Atau: | ||
− | + | cd /usr/src/linux/drivers/misc | |
+ | insmod ./mymodule.o | ||
+ | |||
+ | Tampaknya untuk kernel versi 3.8 ke atas lebih aman menggunakan .ko. | ||
− | Cek apakah | + | Cek apakah modul yang kita masukan jalan dengan baik, ketik: |
# dmesg | tail | # dmesg | tail | ||
Line 74: | Line 98: | ||
My module worked! | My module worked! | ||
+ | |||
+ | Cek menggunakan | ||
+ | |||
+ | # lsmod | more | ||
+ | |||
+ | Harusnya keluar kira-kira | ||
+ | |||
+ | Module Size Used by | ||
+ | mymodule 12428 0 | ||
Selanjutnya, coba kita buang kernel module tersebut menggunakan perintah: | Selanjutnya, coba kita buang kernel module tersebut menggunakan perintah: | ||
Line 79: | Line 112: | ||
# rmmod mymodule | # rmmod mymodule | ||
− | Cek output di dmesg, | + | Cek output di dmesg, |
+ | |||
+ | # dmesg | tail | ||
+ | |||
+ | Kita harusnya akan melihat: | ||
Unloading my module. | Unloading my module. | ||
Line 91: | Line 128: | ||
Pertama-tama, mari kita coba cara yang SALAH! :) .. | Pertama-tama, mari kita coba cara yang SALAH! :) .. | ||
− | Edit file kernel/printk.c | + | Edit file kernel/printk.c |
+ | |||
+ | vi /usr/src/linux/kernel/printk.c | ||
+ | |||
+ | Dan tambahkan kalimat berikut sesudah semua include file dan dekat deklarasi variable global (tapi di luar semua function): | ||
int my_variable = 0; | int my_variable = 0; | ||
− | Sekarang compile ulang kernel dan reboot ke kernel yang baru. Selanjutnya, tambahkan kalimat | + | |
+ | Atau yang lebih lengkap kira-kira sebagai berikut, | ||
+ | |||
+ | #define CREATE_TRACE_POINTS | ||
+ | #include <trace/events/printk.h> | ||
+ | |||
+ | int my_variable = 0; | ||
+ | |||
+ | /* | ||
+ | * Architectures can override it: | ||
+ | */ | ||
+ | void asmlinkage __attribute__((weak)) early_printk(const char *fmt, ...) | ||
+ | { | ||
+ | } | ||
+ | |||
+ | Sekarang compile ulang kernel, update-grub dan reboot ke kernel yang baru. | ||
+ | |||
+ | Selanjutnya, tambahkan kalimat berikut di awal dari module kita dalam function mymodule_init, sebelum code lainnya: | ||
extern int my_variable; | extern int my_variable; | ||
printk ("my_variable is %d\n", my_variable); | printk ("my_variable is %d\n", my_variable); | ||
my_variable++; | my_variable++; | ||
+ | I | ||
+ | Lebih jelasnya lakukan modifikasi pada function mymodule_init agar menjadi, | ||
+ | |||
+ | static int __init mymodule_init(void) | ||
+ | { | ||
+ | extern int my_variable; | ||
+ | printk ("my_variable is %d\n", my_variable); | ||
+ | my_variable++; | ||
+ | printk ("My module worked!\n"); | ||
+ | return 0; | ||
+ | } | ||
Simpan file yang kita ubah, dan di recompile module menggunakan perintah: | Simpan file yang kita ubah, dan di recompile module menggunakan perintah: | ||
− | + | cd /usr/src/linux/drivers/misc | |
+ | make -C /usr/src/linux SUBDIRS=$PWD modules | ||
Dan load module (ini harusnya akan gagal): | Dan load module (ini harusnya akan gagal): | ||
− | + | cd /usr/src/linux/drivers/misc | |
+ | insmod ./mymodule.ko | ||
Saat loading module yang kita buat harusnya fail dengan message berikut: | Saat loading module yang kita buat harusnya fail dengan message berikut: | ||
Line 115: | Line 186: | ||
ini artinya kernel tidak mengijinkan module untuk "melihat" variable tersebut. Saat module di load, kernel akan me-resolve semua referensi external, seperti nama function atau nama variable. Jika dia tidak berhasil me-resolve semua nama yang ada dalam daftar simbol yang di export kernel, maka module tidak bisa menulis / menggunakan variable atau call ke function tersebut. Kernel mengalokasi tempat bagi variable my_variable entah mana, sayangnya module tidak bisa menemukannya. | ini artinya kernel tidak mengijinkan module untuk "melihat" variable tersebut. Saat module di load, kernel akan me-resolve semua referensi external, seperti nama function atau nama variable. Jika dia tidak berhasil me-resolve semua nama yang ada dalam daftar simbol yang di export kernel, maka module tidak bisa menulis / menggunakan variable atau call ke function tersebut. Kernel mengalokasi tempat bagi variable my_variable entah mana, sayangnya module tidak bisa menemukannya. | ||
− | Untuk memperbaiki ini, kita akan memasukan my_varible ke daftar symbol yang di export oleh kernel. Banyak directory di kernel mempunyai file yang di khususkan untuk meng-export symbol yang di | + | Untuk memperbaiki ini, kita akan memasukan my_varible ke daftar symbol yang di export oleh kernel. Banyak directory di kernel mempunyai file yang di khususkan untuk meng-export symbol yang di definisikan dalam directory tersebut. Buka lagi file kernel/printk.c |
+ | |||
+ | vi /usr/src/linux/kernel/printk.c | ||
+ | |||
+ | dan tambahkan kalimat berikut sesudah deklarasi varible my_variable: | ||
+ | |||
+ | EXPORT_SYMBOL(my_variable); | ||
+ | |||
+ | Atau yang lebih lengkap kira-kira sebagai berikut, | ||
− | + | #define CREATE_TRACE_POINTS | |
+ | #include <trace/events/printk.h> | ||
− | Recompile dan reboot ke kernel yang baru. Sekarang coba untuk load module lagi: | + | int my_variable = 0; |
+ | EXPORT_SYMBOL(my_variable); | ||
+ | |||
+ | /* | ||
+ | * Architectures can override it: | ||
+ | */ | ||
+ | void asmlinkage __attribute__((weak)) early_printk(const char *fmt, ...) | ||
+ | { | ||
+ | } | ||
+ | |||
+ | Recompile kernel, update-grub dan reboot ke kernel yang baru. | ||
+ | |||
+ | Sekarang coba untuk load module lagi: | ||
# insmod ./mymodule.ko | # insmod ./mymodule.ko | ||
Line 142: | Line 234: | ||
Membuat loadable kernel module sederhana adalah cara menyenangkan untuk mengeksplorasi kernel. Contoh, kita dapat menggunakan sebuah module untuk menyalakan dan mematikan printk, dengan mendefinisikan variable do_print di kernel yang awalnya di set 0. Maka semua printk menjadi tergantung pada "do_print": | Membuat loadable kernel module sederhana adalah cara menyenangkan untuk mengeksplorasi kernel. Contoh, kita dapat menggunakan sebuah module untuk menyalakan dan mematikan printk, dengan mendefinisikan variable do_print di kernel yang awalnya di set 0. Maka semua printk menjadi tergantung pada "do_print": | ||
− | + | if (do_print) | |
− | + | printk ("Big long obnoxious message\n"); | |
− | dan menyalakan do_print jika kernel module yang kita buat di load. Kita dapat mendefinisikan di modul yang kita buat ke daftar function yang di panggil ketika kernel menerima interupsi tertentu (gunakan cat /proc/interrupts untuk | + | dan menyalakan do_print jika kernel module yang kita buat di load. Kita dapat mendefinisikan di modul yang kita buat ke daftar function yang di panggil ketika kernel menerima interupsi tertentu (gunakan cat /proc/interrupts untuk mencari tahu interupsi yang digunakan). |
− | + | function request_irq() menambahkan function yang kita buat ke daftar handler untuk line IRQ (Interrupt ReQuest) tertentu, yang mana kita dapat gunakan untuk mem-print out sebuah message setiap kita menerima interupsi di line tersebut. Kita dapat melakukan investigasi nilai dari variable yang di export dengan cara me-load module yang dapat membaca nilai tersebut dan langsung keluar (return nilai non-zero dari function module_init()). Variabel jiffies, yang naik setiap 1/100 detik (di kebanyakan platform), adalah kandidat yang baik untuk module seperti ini. | |
− | + | Semoga anda cukup bersemangat untuk bermain dengan kernel module! | |
==Referensi== | ==Referensi== | ||
Line 155: | Line 247: | ||
* http://www.linuxchix.org/content/courses/kernel_hacking/lesson8 | * http://www.linuxchix.org/content/courses/kernel_hacking/lesson8 | ||
* http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html | * http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html | ||
+ | * http://www.tldp.org/LDP/lkmpg/2.6/html/x181.html | ||
+ | * http://www.linuxvoice.com/be-a-kernel-hacker/ | ||
==Pranala Menarik== | ==Pranala Menarik== | ||
Line 160: | Line 254: | ||
* [[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]] | * [[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]] | ||
− | * [[ | + | |
− | * [[ | + | ===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 | + | |
− | * [[OS: | + | ====Tuning Manajemen Memory==== |
− | * [[OS: | + | |
+ | * [[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]] | ||
− | |||
− |
Latest revision as of 17:40, 1 March 2015
Sumber:
- http://www.linuxchix.org/content/courses/kernel_hacking/lesson8
- http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html
- http://www.tldp.org/LDP/lkmpg/2.6/html/x181.html
- http://www.tldp.org/LDP/lkmpg/2.6/html/
Pada bagian ini, kita akan menulis dan load sebuah kernel modul sederhana. Dengan menuliskan sendiri modul kita menjadi belajar bagaimana menulis code kernel yang berdiri sendiri, belajar bagaimana menggunakan modul, dan menemukan beberapa aturan bagaimana kernel terkait menjadi satu kesatuan.
Catatan: instruksi disini ditulis untuk kernel 3.8.x yang mungkin tidak cocok untuk versi kernel yang berbeda.
Apakah kernel mendukung modul?
Kernel yang kita gunakan, harus di compile dengan option:
[*] Enable loadable module support ---> [ ] Forced module loading [*] Module unloading [ ] Forced module unloading [*] Module versioning support [*] Source checksum for all modules [*] Module signature verification [ ] Require modules to be validly signed
Pastikan pada saat kita mengcompile kernel opsi di atas di aktifkan. Jika tidak, kita perlu mengcompile ulang kernel.
Sebaiknya, sebelum berexperimen dengan kernel modul, kita mengcompile ulang kernel yang kita gunakan. Tentunya lengkap dengan update-grub dan kemudian boot ke kernel baru tersebut untuk berexperimen dengan kernel modul yang kita buat.
Rangka Kernel Modul Sederhana
Pertama kali, kita perlu mencari lokasi directory tempat kernel di compile, biasanya di /usr/src/linux. Kemudian ubah directory ke drivers/misc dari directory source code Linux. Lakukan di shell
cd /usr/src/linux/drivers/misc
Edit file, misalnya, mymodule.c
vi mymodule.c
Sekarang, copy paste code berikut ke file mymodule.c
#include <linux/module.h> #include <linux/configfs.h> #include <linux/init.h> static int __init mymodule_init(void) { printk ("My module worked!\n"); return 0; } static void __exit mymodule_exit(void) { printk ("Unloading my module.\n"); return; } module_init(mymodule_init); module_exit(mymodule_exit); MODULE_LICENSE("GPL");
Simpan file .c tersebut. Edit Makefile di directory tersebut.
cd /usr/src/linux/drivers/misc vi Makefile
Tambahkan kalimat:
obj-m += mymodule.o
Compile module yang kita tulis:
# make -C [top directory dari source kernel] SUBDIRS=$PWD modules
Atau yang lebih jelas
# make -C /usr/src/linux SUBDIRS=$PWD modules
Jalankan Module
Load module. Tergantung versi kernel yang kita gunakan, ketik:
cd /usr/src/linux/drivers/misc insmod ./mymodule.ko
Atau:
cd /usr/src/linux/drivers/misc insmod ./mymodule.o
Tampaknya untuk kernel versi 3.8 ke atas lebih aman menggunakan .ko.
Cek apakah modul yang kita masukan jalan dengan baik, ketik:
# dmesg | tail
Kita harusnya melihat di akhir printout sebagai berikut:
My module worked!
Cek menggunakan
# lsmod | more
Harusnya keluar kira-kira
Module Size Used by mymodule 12428 0
Selanjutnya, coba kita buang kernel module tersebut menggunakan perintah:
# rmmod mymodule
Cek output di dmesg,
# dmesg | tail
Kita harusnya akan melihat:
Unloading my module.
Selamat! Kita baru saja menulis & menjalankan kernel module yang baru.
Interface module/kernel
Selanjutnya, mari kita bermain dengan module yang kita buat. Satu hal yang harus kita sadari bahwa module hanya dapat "melihat" function dan variable yang secara sengaja oleh kernel dibuat terlihat ke module.
Pertama-tama, mari kita coba cara yang SALAH! :) ..
Edit file kernel/printk.c
vi /usr/src/linux/kernel/printk.c
Dan tambahkan kalimat berikut sesudah semua include file dan dekat deklarasi variable global (tapi di luar semua function):
int my_variable = 0;
Atau yang lebih lengkap kira-kira sebagai berikut,
#define CREATE_TRACE_POINTS #include <trace/events/printk.h> int my_variable = 0; /* * Architectures can override it: */ void asmlinkage __attribute__((weak)) early_printk(const char *fmt, ...) { }
Sekarang compile ulang kernel, update-grub dan reboot ke kernel yang baru.
Selanjutnya, tambahkan kalimat berikut di awal dari module kita dalam function mymodule_init, sebelum code lainnya:
extern int my_variable; printk ("my_variable is %d\n", my_variable); my_variable++;
I Lebih jelasnya lakukan modifikasi pada function mymodule_init agar menjadi,
static int __init mymodule_init(void) { extern int my_variable; printk ("my_variable is %d\n", my_variable); my_variable++; printk ("My module worked!\n"); return 0; }
Simpan file yang kita ubah, dan di recompile module menggunakan perintah:
cd /usr/src/linux/drivers/misc make -C /usr/src/linux SUBDIRS=$PWD modules
Dan load module (ini harusnya akan gagal):
cd /usr/src/linux/drivers/misc insmod ./mymodule.ko
Saat loading module yang kita buat harusnya fail dengan message berikut:
insmod: error inserting './mymodule.ko': -1 Unknown symbol in module
ini artinya kernel tidak mengijinkan module untuk "melihat" variable tersebut. Saat module di load, kernel akan me-resolve semua referensi external, seperti nama function atau nama variable. Jika dia tidak berhasil me-resolve semua nama yang ada dalam daftar simbol yang di export kernel, maka module tidak bisa menulis / menggunakan variable atau call ke function tersebut. Kernel mengalokasi tempat bagi variable my_variable entah mana, sayangnya module tidak bisa menemukannya.
Untuk memperbaiki ini, kita akan memasukan my_varible ke daftar symbol yang di export oleh kernel. Banyak directory di kernel mempunyai file yang di khususkan untuk meng-export symbol yang di definisikan dalam directory tersebut. Buka lagi file kernel/printk.c
vi /usr/src/linux/kernel/printk.c
dan tambahkan kalimat berikut sesudah deklarasi varible my_variable:
EXPORT_SYMBOL(my_variable);
Atau yang lebih lengkap kira-kira sebagai berikut,
#define CREATE_TRACE_POINTS #include <trace/events/printk.h>
int my_variable = 0; EXPORT_SYMBOL(my_variable); /* * Architectures can override it: */ void asmlinkage __attribute__((weak)) early_printk(const char *fmt, ...) { }
Recompile kernel, update-grub dan reboot ke kernel yang baru.
Sekarang coba untuk load module lagi:
# insmod ./mymodule.ko
Sekarang, saat kita cek dmesg, kita harusnya melihat:
my_variable is 0 My module worked!
Reload module:
# rmmod mymodule && insmod ./mymodule.ko
Sekarang kita akan melihat:
Unloading my module. my_variable is 1 My module worked!
Setiap kali kita me-reload module, my_variable harus bertambah satu. Module yang kita buat dapat mengakses variable atau function yang ada di main kernel, selama secara explisit di export melalui deklarasi EXPORT_SYMBOL(). Contoh, function printk() di definisikan di kernel dan di export di file kernel/printk.c.
Membuat loadable kernel module sederhana adalah cara menyenangkan untuk mengeksplorasi kernel. Contoh, kita dapat menggunakan sebuah module untuk menyalakan dan mematikan printk, dengan mendefinisikan variable do_print di kernel yang awalnya di set 0. Maka semua printk menjadi tergantung pada "do_print":
if (do_print)
printk ("Big long obnoxious message\n");
dan menyalakan do_print jika kernel module yang kita buat di load. Kita dapat mendefinisikan di modul yang kita buat ke daftar function yang di panggil ketika kernel menerima interupsi tertentu (gunakan cat /proc/interrupts untuk mencari tahu interupsi yang digunakan).
function request_irq() menambahkan function yang kita buat ke daftar handler untuk line IRQ (Interrupt ReQuest) tertentu, yang mana kita dapat gunakan untuk mem-print out sebuah message setiap kita menerima interupsi di line tersebut. Kita dapat melakukan investigasi nilai dari variable yang di export dengan cara me-load module yang dapat membaca nilai tersebut dan langsung keluar (return nilai non-zero dari function module_init()). Variabel jiffies, yang naik setiap 1/100 detik (di kebanyakan platform), adalah kandidat yang baik untuk module seperti ini.
Semoga anda cukup bersemangat untuk bermain dengan kernel module!
Referensi
- http://www.linuxchix.org/content/courses/kernel_hacking/lesson8
- http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html
- http://www.tldp.org/LDP/lkmpg/2.6/html/x181.html
- http://www.linuxvoice.com/be-a-kernel-hacker/
Pranala Menarik
Secara Umum
Instalasi Linux
Compile Kernel
- Kernel
- OS: Linux Kernel
- Kernel: Anatomi Kernel Source
- Compile Kernel
- Compile Kernel: Konfigurasi Kernel
Remaster Linux
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
Tuning Kernel Scheduler
- OS: Kernel Scheduler
- OS: Tuning Kernel Scheduler
- OS: Tuning Completely Fair scheduler CFS
- OS: Complete Teori Tuning Kernel Scheduler