به نام خدا
باسلام
میخوایم در این تاپیک به اموزش ساخت ماژول کرنل بپردازیم
برای شروع نیازهست هدر های کرنل مربوط رو نصب بکنید .
ما در اینجا با زبان c میخواهیم یک ماژول طراحی بکنیم که در خروجی به ما سلام دنیا را نشان بدهد .
اول از همه باید هدر های کرنل رو وارد بکنیم
معمولا برای ماژول باید نوع لایسنس و نام سازنده و توضیحاتی درباره ان را نوشت
خب حالا شروع به نوشتن کدمون میکنیم
در اینجا ما init رو صدا میزنیم و مقدار خروجی KERN_INFO رو برابر سلام دنیا قرار میدیم
برای خارج کردن کرنل هم یک نوشته ای قرار میدیم که بفهمیم ماژول کاملا از کرنل جدا شده
خب ما یک فایل makefile برای کامپایل ماژول درست میکنیم و تنظیمات مورد نیاز رو در اون اعمال میکنیم
برای makefile ما تعریف کردیم که فایل کامپایل شده رو در مسیر کتابخانه ماژول های کرنل قرار بده
خب دستور make رو اجرا میکنیم تا ماژول کامپایل بشه .
خروجی :
برای اضافه کردن ماژول به کرنل از دستور :
استفاده میکنیم برای اینکه مقدار خروجی رو مشاهده بکنیم با دستور زیر میتونیم مقدار ان را مشاهده کرد
از دستور rmmod به عنوان جدا کردن ماژول از کرنل استفاده میشه
از دستور modinfo برای دیدن اطلاعات ماژول استفاده میشه . به شکل زیر
امیدوارم از این اموزش لذت برده باشید
با تشکر
باسلام
میخوایم در این تاپیک به اموزش ساخت ماژول کرنل بپردازیم
برای شروع نیازهست هدر های کرنل مربوط رو نصب بکنید .
کد:
apt-get install build-essential linux-headers-$(uname -r)
اول از همه باید هدر های کرنل رو وارد بکنیم
کد:
#include <linux/module.h> // included for all kernel modules #include <linux/kernel.h> // included for KERN_INFO #include <linux/init.h> // included for __init and __exit macros
کد:
MODULE_LICENSE("GPL"); MODULE_AUTHOR("Iranchak"); MODULE_DESCRIPTION("A Simple Hello World module");
کد:
static int __init hello_init(void) { printk(KERN_INFO "Hello world!\n"); return 0; }
در اینجا ما init رو صدا میزنیم و مقدار خروجی KERN_INFO رو برابر سلام دنیا قرار میدیم
برای خارج کردن کرنل هم یک نوشته ای قرار میدیم که بفهمیم ماژول کاملا از کرنل جدا شده
کد:
static void __exit hello_cleanup(void) { printk(KERN_INFO "Cleaning up module.\n"); }
کد:
module_init(hello_init); module_exit(hello_cleanup);
خب ما یک فایل makefile برای کامپایل ماژول درست میکنیم و تنظیمات مورد نیاز رو در اون اعمال میکنیم
کد:
obj-m += hello.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
برای makefile ما تعریف کردیم که فایل کامپایل شده رو در مسیر کتابخانه ماژول های کرنل قرار بده
خب دستور make رو اجرا میکنیم تا ماژول کامپایل بشه .
خروجی :
کد:
# make make -C /lib/modules/3.5.0-19-generic/build M=/home/iranhack/a modules make[1]: Entering directory `/usr/src/linux-headers-3.5.0-19-generic' CC [M] /home/iranhack/a/hello.o Building modules, stage 2. MODPOST 1 modules CC /home/iranhack/a/hello.mod.o LD [M] /home/iranhack/a/hello.ko make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-19-generic'
برای اضافه کردن ماژول به کرنل از دستور :
کد:
insmod hello.ko
کد:
# insmod hello.ko # dmesg | tail -1 [ 8394.731865] Hello world! # rmmod hello.ko # dmesg | tail -1 [ 8707.989819] Cleaning up module.
از دستور rmmod به عنوان جدا کردن ماژول از کرنل استفاده میشه
از دستور modinfo برای دیدن اطلاعات ماژول استفاده میشه . به شکل زیر
کد:
modinfo /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko filename: /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko license: GPL author: Phillip Lougher description: squashfs 4.0, a compressed read-only filesystem srcversion: 89B46A0667BD5F2494C4C72 depends: intree: Y vermagic: 3.5.0-19-generic SMP mod_unload modversions 686
امیدوارم از این اموزش لذت برده باشید
با تشکر