نوشتن یک Kernel Module در لینوکس۲

بعد از نوشتن اولین Kernel Module ادامه مبحث را با توسعه برنامه نوشته شده قبلی پیگیری میکنیم

ابتدا به برنامه نوشته شده قبلی نگاهی می اندازیم :

/*  
 *  hello-1.c - The simplest kernel module.
 */
#include <linux/module.h>	/* Needed by all modules */
#include <linux/kernel.h>	/* Needed for KERN_INFO */

int init_module(void)
{
	printk(KERN_INFO "Hello world 1.\n");

	/* 
	 * A non 0 return means init_module failed; module can't be loaded. 
	 */
	return 0;
}

void cleanup_module(void)
{
	printk(KERN_INFO "Goodbye world 1.\n");
}

در برنامه بالا تابع های ما معرفی شده و تعریف میشوند . نام توابع باید حتما همانند مثال فوق باشد تا قابلیت الحاق به کرنل را داشته باشه . این شیوه برنامه نویسی سخت بوده و توسعه آن کند پیش خواهد رفت . در اینجا روش جدیدتری برای توسعه Kernel Module معرفی میشود که توسعه دهنده از نام های دلخواه استفاده کند و در انتها نام تابع نوشته شده را به ماکروهای Kernel Module معرفی میکند :

/*  
 *  hello-2.c - Demonstrating the module_init() and module_exit() macros.
 *  This is preferred over using init_module() and cleanup_module().
 */
#include <linux/module.h>	/* Needed by all modules */
#include <linux/kernel.h>	/* Needed for KERN_INFO */
#include <linux/init.h>		/* Needed for the macros */

static int __init hello_2_init(void)
{
	printk(KERN_INFO "Hello, world 2\n");
	return 0;
}

static void __exit hello_2_exit(void)
{
	printk(KERN_INFO "Goodbye, world 2\n");
}

module_init(hello_2_init);
module_exit(hello_2_exit);

در برنامه بالا توابع init و exit با نام دلخواه نوشته شده که کار پرینت کردن عبارت دلخواه در log سیستم را انجام میدهند . و در انتها توابع فوق به ماکرو های module_init و module_exit معرفی شده اند . در این حالت برنامه نویسی منظم تر و توسعه سریعتر پیش میرود .
ماکروهای module_init و module_exit در هدر فایل linux/init.h قرار دارد که در ابتدا به برنامه ما include شد .
تنها نکته مهم این است که همانند تمامی برنامه ها به زبان c هر تابع تنها بعد از معرفی قابل دستیابی خواهد بود ، بنابر این معرفی توابع باید حتما قبل از ماکروها باشد .
برای کامپایل برنامه ابتدا Makefile بصورت زیر نوشته و با دستور make میتواین Kernel Module را کامپایل کنیم :

obj-m += hello-2.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

برای اضافه کردن Module نوشته شده به کرنل همانند قبل از دستور

#insmod hello-2.ko

استفاده میکنیم .
همچنین برای پایین آوردن Module نوشته شده از کرنل از دستور

# rmmod hello_2 

استفاده میکنیم.

اضافه کردن License به Kernel Module
از کرنل ورژن ۲٫۲ به بعد برای الحاق Module های اختصاصی به کرنل احتیاج به License برای مشخص شدن حقوق مالکیت نرم افزار می باشد . این کار برای جلوگیری از نگرانی کاربران از نوع نرم Module مورد استفاده در کرنل میباشد .
برای اضافه کردن License و حق نشر از ماکروی MODULE_LICENSE استفاده میکنیم ، انواع حق نشر قابل دسترس مطابق می باشد :

"GPL"				[GNU Public License v2 or later]
"GPL v2"			[GNU Public License v2]
"GPL and additional rights"	[GNU Public License v2 rights and more]
"Dual BSD/GPL"			[GNU Public License v2 or BSD license choice]
"Dual MIT/GPL"			[GNU Public License v2 or MIT license choice]
"Dual MPL/GPL"			[GNU Public License v2 or Mozilla license choice]
"Proprietary"			[Non free products]

ماکروی MODULE_LICENSE در هدرفایل linux/module.h قرار دارد . بطور مشابه ماکروی MODULE_DESCRIPTION برای ارائه توضیحات مختری راجع به عملکرد Module مورد استفاده قرار میگیرد . MODULE_AUTHOR نویسنده Module را مشخص میکند و MODULE_SUPPORTED_DEVICE مشخص میکند که Module با چه نوعی از devise ها سازگاری دارد . این ماکرو ها در هدر فایل linux/module.h قرار دارند . این ماکروها برای مستند سازی Kernel Module نوشته شده بکار میروند و توسط ابزارهایی مثل ObjDump قابل دیده شدن هستند . (objdump ابزاری برای برگرداندن سورس کد از فایل باینری میباشد.)

Leave a Comment

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *