كارت dvb , كارت دي وي بي , دی وی بی , رسيور , رسیور

فروشگاه سايت

تبليغات

آخرين ارسالي‌هاي آموزش ها و مفاهیم پایه

ماژول نویسی برای هسته لینوکس (قسمت اول)

اين يك بخش از موضوع ماژول نویسی برای هسته لینوکس (قسمت اول) است كه در انجمن آموزش ها و مفاهیم پایه مطرح گرديده و اين انجمن نيز زير مجموعه‌ي تالار هاي امنيتي است: ماژول هسته چیست؟ اولیــن سوالی کــه ممکن است به ذهن خواننده برسد این است که ماژول هسته دقیقا چیست؟ در پاسخ باید گفت که ماژول*ها تـکه کدهایی هـستند که در حین اجرای هسته لینوکس می توانند وارد آن شده و یا از آن خارج شوند. این تکه کدها عملکرد هسته ...

 

بازگشت   انجمن های آموزشی پارس > تالار هاي امنيتي > آموزش ها و مفاهیم پایه


آموزش ها و مفاهیم پایه اینجا در مورد مفاهیم پایه ای صحبت میشه و سوالات در مورد اصطلاحات و پیش زمینه ها و اموزش ان ها اینجا مطرح می شه

اطلاعيه‌هاي سايت

 

لطفاً پيش از فعاليت در سايت، قوانين سايت را مطالعه نماييد

كليه‌ي كاربراني كه توانايي مديريت هر يك از بخش‌هاي سايت را دارند، با كليك روي اين لينك به مديريت سايت اطلاع دهند


پاسخ

 

LinkBack ابزارهای موضوع
قدیمی Tuesday 20 March 2007, 10:33 PM   #1
عضو نیمه فعال
 
!!SPY!! آواتار ها
 

تاریخ عضویت: March 13th, 2007
نوشته ها: 111

سطح دانش: 9 [♥ Bé-Yêu ♥]
سابقه در سایت: 0 / 213
قابليت: 37 / 1446
ميزان تجربه: 55%

Thanks: 7
Thanked 48 Times in 31 Posts
قدرت اعتبار: 3 !!SPY!! is on a distinguished road
Smile ماژول نویسی برای هسته لینوکس (قسمت اول)

ماژول هسته چیست؟
اولیــن سوالی کــه ممکن است به ذهن خواننده برسد این است که ماژول هسته دقیقا چیست؟ در پاسخ باید گفت که ماژول*ها تـکه کدهایی هـستند که در حین اجرای هسته لینوکس می توانند وارد آن شده و یا از آن خارج شوند. این تکه کدها عملکرد هسته را بدون نیاز به راه اندازی دوباره کامپیوتر توسعه می*دهند.
به عنوان مثال یــک نــوع از مــاژول*ها device driver ها هستند کـه به هسته امکان استفاده از قابلیت سخت افزار ها را می*دهند.
اگر ماژول*ها وجود نداشتند، بـرای هر قابلیتی که می*خواستیم بــه هسته اضافه کنیم یـا از آن کم کنیم، می*بایستی یک بار هسته را کامپایل می*کردیم و برای استفاده از ان قابلیت یا حذف آن یک بار سیستم را از نو راه اندازی می*کردیم.


ماژول ها چگونه به هسته وارد می شوند؟
شما می*توانید بــا اجرای دستور lsmod ماژول*هایی کــه هــم اکنـون در هسته وارد شده*انـد را ببیـنـید و از اطـلاعات آنها باخبر شوید. این دستور اطلاعات خود را از فایل proc/modules/ دریافت می*کند.
هنگامی که هسته، به امکان و عملکردی نیاز دارد که هم اکنون در آن نیست، یکــی از deamon های آن بــه نـام kmod دستور modprobe را اجرا می*کند تا ماژول مربوطه که آن عملکرد را دارد وارد هسته شود . هنـگامی که modprobe اجرا می شود به آن یک رشته کاراکتر به دو صورت زیر داده می*شود:
  1. ۱) نام ماژول مانند softdog یا ppp
    ۲) یک مشخصه کلی مانند char-major-10-30
اگر حالت اول بــه modprobe داده شود، ایــن دستور بـه دنبال فایلی به نام softdog.ko یا ppp.ko با روشی که در ادامه می*آید می*گردد. ولی اگــر حــالـت دوم بــه modprobe داده شود، ایــن دستــور ابـــتدا بــه دنــبال رشتـه کاراکتر در فایل etc/modprobe.conf/ می گردد و اگر توانست alias یا مستعاری مانند:

alias char-major-10-30 softdog
پیدا کند، متوجه می*شود کــه ایــن نــام کلی که در اینجا char-major-10-30 است به ماژول softdog اشاره می*کــند که فایل ماژول آن softdof.ko می*باشد.
در مرحله بعد modprobe فایل lib/modules/version/modules.dep/ را باز کرده و به دنبال ماژول*هایی می*گــردد کـه باید قبل از ماژول مورد نظر به هسته وارد شوند. ایــن فــایل به وسیله دستور depmod -a ایجاد می*شود و حــاوی وابستگی بین ماژول هاست.
به عنوان مثال اگر به دنبال مــاژول msdos.ko در ایــن فــایل بگردید خواهید دید که به ماژول دیگری به نام fat.ko وابسته است یعنی برای اینکه msdos.ko وارد هسته شود حتما باید قبل از ان fat.ko وارد شده باشد. ایــن مسـاله برای fat.ko نیز تــکــرار شده تــا بـه مرحله*ای برسیم که دیگر وابستگی موجود نباشد. در نهایت modprobe دستور insmod را به کار می*برد تا ابتدا وابستگی*ها را به هسته وارد کرده و در نهایت ماژول مورد نظر ما به هسته وارد می*شود.
پس modprobe وظــیـفه پـیـدا کــردن مــاژول، تعیین وابستگیهای آن و وارد کردن آن بــه هستــه بــه وسیــله صـدا کردن insmod را دارد در حالی که insmod فقط وظیفه وارد کردن آن ماژول به هسته را دارد.
به عنوان مثال اگر بخواهیم به صورت دستی msdos.ko را وارد هسته کنیم به صورت زیر عمل می کنیم :

# insmod /lib/modules/2.6.11/kernel/fs/fat/fat.ko
# insmod /lib/modules/2.6.11/kernel/fs/fat/msdos.ko
معادل دو دستور بالا با modprobe به صورت زیر است:

# modprobe msdos
مطلب قابل ذکر این است که insmod مسیر کامل تا فایل ماژول را می*خواهد در حالی که modprobe فقط نـــام ماژول را می*گیرد.


قبل از شروع
قبل از اینکه وارد کد و کدزنی شویم چند نکته مهم را بررسی می*کنیم:
۱) modversioning: یــک ماژول کـه برای یک هسته خاص کامپایل شده است بر روی هسته دیگر load نخواهد شد مگر اینکه شــما CONFIG_MODVERSIONS را در هسته فــعــال کنــیـد. در قـســمت*های بـعــد بیشتر به این مقوله خواهیم پرداخت.
۲) ماژول*ها نمی*توانند چــیزی به غیر از خطاها و هشدارها را بر روی صفحه نمایش نـشان دهند. آنها بــرای نـشان دادن اطلاعات خود، آنها را در log فایلها می*نویسند.
۳) مورد سوم که کاملا مورد قبول بنده نمی*باشد این است که نویسنده می گوید:
«اغلب توزیع کنندگان لینوکس کد منبع هسته را که مورد Patch نیز قرار گرفته به طرز غیر استانداردی توزیع می*کنند که ممکن است باعث ایجاد مشکلاتی شود. یکی از شایع ترین این مشکلات فایل های ناقص Header برای هسته لینوکس هستند. شما برای ماژول نویسی نیاز دارید که فایل های Header زیــادی را در کـــدهای خـود ضمیمه کـنـید و فایــلهای ناقص اغلب فایل هایی هستند که برای ماژول نویسی به کار می روند.» نویــسنده پیشنهاد می*کند کـه برای جلوگیری از این مشکل هسته را برای خود کامپایل کنید.


یک مثال – ساده ترین ماژول
برای شروع از مثال سنتی Hello World! شروع می*کنیم. فایلی به نام hello-1.c باز کرده و کد C زیر را در آن بنویسید:

کد:
کد:
 
 #include <linux/module.h> /*needed by all modules */
#include <linux/kernel.h> /*needed for Macros like KERN_INFO */
/* this function is called as initialization for all modules, if this function returns non-zero means init_module failed and this module can’t be loaded .*/
int init_module(void) { printk(KERN_INFO "Hello World1.\n"); return 0;}
/* it iscalled when module is terminated and unloaded */
void cleanup_module(void) { printk( KERN_INFO "Goodbye World1.\n");} 


هــر ماژول هسته*ای حداقل بایستی ۲ تابع داشته باشد. اولـی تابع شروع که init_module() نامیده می*شــود و هنگام load شدن ماژول در هسته صدا زده می*شود و دیــگــری تــابــع پــایان که cleanup_module() نامیده می*شــود و هنگام unload شدن ماژول از هسته صدا زده می*شود. در قسمت*های بـعد به این موضوع می*پـردازیم که بعد از هسته 2.3.13 شما می*توانید هــر نـــام دیــگری بــرای این دو تــابع قرار دهید. بــا ایـــن حــال خـیـلی از افـــراد هنـــوز از ایـن استاندارد قدیمی استفاده می*کنند. دو فــایــل Header در ایــن کــد ضمیمه شده*اند. یــکی linux/module.h می*باشد که برای هر مــاژولی مــورد نیاز است و تعریف خیلی از توابع را در خـود دارد و دیــگــری linux/kernel.h می*باشد کــه حــاوی تعدادی ماکرو می*باشد مانند KERN_INFO.


مختصری درباره printk()
بر خلاف آن چیزی که ممکن است درباره printk() تصور کنید این تابع چیزی در صفحه نمایش چاپ نمی کند و برای کار با کاربر نیست. ایــن تــابع برای مکانیزم log هستــه بـه کار میــرود . هــر printk() بــا یـک اولویت می*آید کــه در ایـن مثال مــاکــروی KERN_INFO بــرای ایــن منظور بــه کــار رفته است. تـعـداد ۸ اولــویت وجــود دارند کــه بــه صــورت مـاکرو در فــایــل linux/kernel.h تعـــریف شــده*انــد. اگـــر شـمــا ایـــن اولــویــت را تـعــیــین نـکــنــیــد بـــه طـــور پــیــش فـــرض DEFAULT_MESSAGE_LOGLEVEL به آن تخصیص می*یابد .
اگــر این اولویت کمــتر از اولــویت int console_loglevel (که در linux/kernel.h تعریف شده) باشــد، message در دستور printk() بر روی صفحه ظاهر می*شود. اگــر syslogd و یــا klogd در سیستم در حــال اجرا باشند این message در فایل var/log/messages/ نوشته می*شود.


کامپایل ماژول های هسته
ماژول های هسته کمی متفاوت نسبت به برنامه های معمولی کامپایل می*شوند. بــرای ایـنکه بتوانید یک ماژول هسته را بــه درستــی کامپایل کنید، نیاز به تنظیمات بسیار زیادی دارید. بــا پیـچیده*تر شــدن ماژول*ها ایـن تنظیمات پیچیده*تر می*شوند. خــوشبختانه مکانیزمی به نام kbuild وجود دارد که تمام این تنظیمات را انجام می*دهد. بـرای اگاهی بیشتر از ایـن مکانیزم به فایلهای مستند هسته که در آدرس linux/Documentation/kbuild/modules.txt کد منبع هسته مـوجـود است مراجعه کنید. بــرای اینکه بتوانیم از مکـانیزم kbuild استفاده کنیم، بایستی Makefile ای با استاندارد آن بنویسیم. برای این کار یک فایل به نام Makefile باز کرده و دستورات زیر را در آن بنویسید:
obj-m += hello-1.oall : make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) cleanحال با اجرای دستور make ماژول خود را کامپایل کنید. در هسته 2.6 بــه بــعد از پسوند ko بــرای نــامیدن مـــاژول*های هسته استفاده شده است که به راحتی قابل تمییز از o که پسوند فایل های object است می*باشد.
برای بدست آوردن اطلاعاتی از ماژول خود دستور زیر را اجرا کنید:
# modinfo hello-1.ko
برای وارد کردن ماژول خود در هسته از دستور زیر استفاده کنید:
# insmod ./hello-1.ko
اگر بعد از اجرای این دستور فایل var/log/messages/ را باز کرده و به انتهای آن بروید، خواهید دیــد کـه ماژول hello-1 در هسته load شده است. با دستور lsmod نیز ماژول load شده را خواهید دید. بــرای unload یــا خارج کردن ماژول خود از هسته از دستور rmmod به صورت زیر استفاده کنید :
# rmmod hello-1
دوباره اگر فایل var/log/messages/ را بــاز کنید و به انتهای آن بــروید خواهید دید که ماژول hello-1 از هسته خارج شده است.در قسمت های بعدی با مثال های بیشتر به دیگر جزئیات ماژول نویسی برای هسته لینوکس خواهیم پرداخت
View !!SPY!!'s Photo Album !!SPY!! آفلاين است   پاسخ با نقل قول
پاسخ

برچسب ها
قسمت , لینوکس , ماژول , نویسی , هسته , اول , برای

ابزارهای موضوع

مجوز های ارسال و ویرایش
شما نمیتوانید موضوع جدیدی ارسال کنید
شما امکان ارسال پاسخ را ندارید
شما نمیتوانید فایل پیوست در پست خود ضمیمه کنید
شما نمیتوانید پست های خود را ویرایش کنید

BB code is فعال
شکلک ها فعال است
کد [IMG] فعال است
کد HTML غیر فعال است
Trackbacks are فعال
Pingbacks are فعال
Refbacks are فعال


موضوعات مشابه

موضوع نویسنده موضوع انجمن پاسخ ها آخرين نوشته
نحوه راه اندازي Isp قسمت پنجم Kamran1358 سخت افزار 0 Monday 12 March 2007 01:15 PM
انتظار کاربران خانگی برای ویستا به*سر رسید vista سیستم های عامل 3 Saturday 24 February 2007 11:05 AM
بررسی لینوکس شریف Raminmetal مباحث لینوکس (Linux) 2 Tuesday 24 October 2006 10:54 PM
تاریخچه لینوکس......... 007 مباحث لینوکس (Linux) 0 Friday 1 September 2006 07:44 PM
پشتیبان*گیری از اطلاعات در لینوکس atn_1366 مباحث لینوکس (Linux) 0 Wednesday 23 August 2006 02:25 AM


اکنون ساعت 05:05 AM برپایه ساعت جهانی (GMT - گرینویچ) +4.5 می باشد.


Powered by vBulletin
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.

Skin developed by: ParsDVB


نقل مطالب سايت با ذکر منبع (http://drdvb.com) و نام نويسنده مجاز است. مسئوليت پستها بر عهده نويسنده آن است و سايت parsdvb به هيچ عنوان در قبال نوشته‌های ديگران مسئوليتی ندارد.
 

تمامي قوانين اين سايت از جمهوري اسلامي ايران پيروي مي کند و هرگونه مطالب مخالف قوانين ايران و بنر يا لينک مستهجن در اين سايت جايي ندارد

website monitoring service check web page

    

100
Search 2

parsdvb satdw skynet skynet جدید skystar3 tps.bin vplug vplug جدید vpnمجانی zeeaflam آموزش لب گرفتن استارست اموزش لب گرفتن انتخاب رشته مجازي ترانه ی مادری ثبت نام فيات ثبت نام فیات حسین استیری دانلود نرم افزار ویروس ساز دانلود ويروس ساز رضایا ساسي مانكن ساسی مانکن سریال ترانه ی مادری عکس دختر عکس لب عکس لب گرفتن فركانس شبكه هاي استاني فركانس ماهواره فرکانس فرکانس شبکه های استانی فرکانس ماهواره فرکانسهای ماهواره فيات فيات سينا فیات فیات سینا لب لب گرفتن مجله تپش منصور حیدری مولتی ویژن همسر خسرو شكيبايي همسر خسرو شکیبایی پخش افتتاحیه المپیک پخش المپیک پخش زنده ماهواره پوریا شکیبایی کانالهای پخش المپیک یاسر محمودی ... powered by Search 2
Google
جستجو در گوگل جستجو درانجمنهای آموزشی پارس