ورود/ایجاد حساب کاربری
   منوی اصلی
· خانه
· لیست کاربران
· جستجو
· آمار مشاهدات
· آرشیو مقالات


- شرح
· راهنمای نویسندگان
· درباره ما

   همکاری با نشریه
در صورتی که مایل به همکاری با نشریه هستید، می‌توانید در لیست پستی نشریه عضو شده و در جریان امور قرار گیرید. برای اطلاعات بیشتر، اینجا کلیک کنید.

   کاربران
سردبیر
هیچ مدیر کمکی حاضر
همکاران
هیچ مدیر کمکی حاضر
اعضا:
جدیدترین:جدید امروز:0
جدیدترین:جدید دیروز:0
جدیدترین:مجموع:2471
جدیدترین:جدیدترین:
ufumenarayu
اعضا:حاضر
اعضا:اعضا:0
مهمان‌ها:مهمان‌ها:4
مجموع:مجموع:4
کاربران حاضر
هیچ کاربر حاضری وجود ندارد

   ورود کاربران




 


 برای ورود مشکل دارید؟
 ثبت نام کاربران جدید

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

(566 مجموع کلمات موجود در متن)
(5776 بار مطالعه شده است)  نسخه چاپی

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


در دو قسمت پیشین با مفاهیم ابتدایی دستگاه‍‌های کاراکتری آشنا شدیم و نحوه ثبت این گونه دستگاه‌ها در هسته را متوجه شدیم . در این قسمت مطالبی را که در دو قسمت قبل فرا گرفتیم در ساده ترین مثال بررسی می‌نماییم.


کد ایـن مثــال را که حــاوی توضیحات تقریبا کامــلی است، می‌توانید از اینجا بــدست آورید. پـس از کـامـپـایل مـــاژول از دستور زیر برای وارد کردن این ماژول در هسته استفاده کنید:


# insmod ./chardev.ko

اگـــر اکنون به انتهای فایل var/log/messages/ بروید مشاهده می‌کنید کــه هسته به صورت دینامیک به ماژول شما یک عدد اصلی اختصاص داده است . با استفاده از راهنمایی‌ای کــه در ایــن فــایـل شــده، دســتـور mknod را بــرای ایـجـاد dev/chardev/ بــه صورت ذکــر شده اجرا کنید. اکنــون راه انداز شما قابــل استفاده است. می‌توانید آن را باز کنید، از آن بخوانید و در آن بنویسید.

برای خواندن از این دستگاه کاراکتری به صورت زیر عمل کنید:

# cat /dev/chardev

و یا برای نوشتن عبارتی مثلا “Hello” در آن به صورت زیر عمل کنید:

# echo “Hello” > /dev/chardev

همان گونه که ذکر شد توضیحات کامل این مثال در کد مثال به صورت comment آمده است. در زیر بــه دو نـکتــه از ایــن مثال اشاره کرده و در نهایت بحث این مثال را با یک سوال به پایان می‌بریم.

    ۱) در تابع device_read همان طــور کــه مشـاهده می‌کنید از تابع put_user استفاده شده است. بـه طور کلی هر پروسس دارای یک بافر در فضای کاربر است و هـر ماژول نیز دارای یک بافر در فضای هسته است. عملی که این تابع و توابع مشابه آن انجام می‌دهند، اطلاعات را بــه صـــورت کامــلا محافظت شده بین این بافرها جابجا می‌کنند.

    ۲) همان طور که در تابع device_write می‌بینید، ایـن تابع عملی انجام نمی‌دهد. شما می‌توانید این تابع را به هر صورتی که می‌خواهید تغییر دهید. به عنوان مثال می‌توانید بــا دانستــن ساختار سخت افزاری مودم خود این تابع را پیاده سازی کرده و بدین ترتیب اطلاعات خود را در مودم خـود بنویسید. البته برای خواندن از مودمتان باید تابع device_read را با توجه به ساختار مودمتان تغییر دهید.

سوال: اکنون در کد مثال خط زیر را پیدا کنید:

static char msg[BUF_LEN];

و به صورت زیر تغییر دهید:

static char *msg;


یعنی در حقیقت برای اشاره گر بافر ماژول فضایی در نظر نگیرید. حــال دوباره مـاژول را در هسته وارد کرده و عملیات cat را انجام دهید. مشــاهده می‌کنید کــه بـه پیغام segmentation fault برخورد خواهید کرد. در صـورتی که در چند قسمت قبل گفتیم که اگر ماژول دچار seg fault شود هسته دچـــار seg fault خواهد شد. بـــا تــوجـه به این نکات این مساله را توجیه کنید. پاسخ‍‌های خود را به e-mail بنده که در انتهای این مقاله است بفرستید و جواب صحیح را دریافت دارید.

در اینجا این قسمت به پایان می‌رسد. در قسمت بعدی ادامه مطالب ماژول نویسی برای هسته لینوکس را از نگاهی جدیدتر پی خواهیم گرفت.



ترجمه و تکمیل : سعید تقویs.taghavi@ece.ut.ac.ir

PDF Version

منابع :

1) http://www.tldp.org/LDP/lkmpg/2.6/html

2) http://www.linuxhq.com/guides/LKMPG/mpg.html

تمامی مطالب و مقالات این سایت تحت مجوز GNU FDL قرار دارند. بنابراین کپی و ایجاد تغییر در آنها مطابق شرایط این مجوز آزاد می‌باشد.