كتابة كيرنل موديول
كتب بواسطة مسلم عادل بتاريخ 2008/09/08
كتابة موديول للنواة (kernel modules) ليس بالأمر الصعب ولكنه أيضا ليس بالأمر السهل وخاصة عندما يكون عبارة عن تعريف لعتاد ما
هذا مثال بسيط لكيرنل موديول، لن اتطرق في تفاصيل عمله.
قم بفتح أي محرر نصوص تفضله، واحفظه بإسم: mymodule.c وانسخ التالي إليه:
#include <linux/module.h>
#include<linux/kernel.h>int init_module(void)
{
printk(KERN_INFO “Hi! Thank you for loading me into your linux kernel!\n”);
return 0;
}void cleanup_module(void)
{
printk(KERN_INFO “Fine as you wish. I just hope I was usefull for your linux kernel\n”);
}MODULE_LICENSE(“GPL”);
MODULE_AUTHOR(“Muslim Adel”);
MODULE_DESCRIPTION(“Just a test, don’t think it will do BIG things”);
الان أنشيء ملف آخر باسم Makefile
obj-m += mymodule.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
أنشيء مجلد جديد وضع الملف mymodule.c و Makefile داخله. افتح سطر الاوامر داخل المجلد واكتب:
arabian@laptop:~$ make clean
arabian@laptop:~$ make
الان جرب تحميل الوحدة الجديدة الى النواة كالاتي:
root@laptop:~# insmod mymodule.koللتأكد ان الوحدة تم تحميلها في النواة:
root@laptop:~# lsmod | grep mymoduleلترى الرسائل التي تنتجها الوحدة اكتب:
root@laptop:~# dmesgللحصول على معلومات عن الموديول:
root@laptop:~# modinfo mymodule.koولإزالة الموديول من النواة:
root@laptop:~# rmmod mymoduleملاحظة: لاحظ اني استخدمت الامر insmod بدل modprobe
فعلت هذا لان هذا الموديول غير موجود في الدليل الصحيح الذي يجب ان يكون فيه، لذا حتى لو حاولت استخدام الامر modprobe فانه سيفشل.
لاستخدام الامر modprobe اعمل الاتي:
root@laptop:~# mkdir -p /lib/modules/`uname -r`/kernel/custom_modules
root@laptop:~# cp mymodule.ko /lib/modules/`uname -r`/kernel/custom_modules/
root@laptop:~# cp mymodule.ko /lib/modules/`uname -r`/kernel/custom_modules/
root@laptop:~# depmod -a
root@laptop:~# modprobe mymodule