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


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

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

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

   ورود کاربران




 


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

ماژول نویسی برای کرنل قسمت ۱۲

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

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

در این قسمت نحوه پیاده تابع ioctl برای یک راه‌انداز را بررسی خواهیم کرد و با نوشتن یک برنامه نحوه‌استفاده‌از پیاده سازیمان را فرا خواهیم گرفت.

IOCTL

فایل های دستگاه ( که معمولا در dev/ قرار می گیرند ) برای نمایش و استفاده‌از دستگاه‌های فیزیکی ایجاد شده‌اند. بیشتــر دستگاه‌های فیزیکی همــان طــور که برای خــروجی به کار می روند به عنوان ورودی نیز استفاده می شوند. بنابراین بایستی در هسته مکانیزمی وجود داشته باشد که بتواند خروجی را دریافت کند تا از پروسه ها به دستگاه ها بفرستد. این رویه با باز کردن فایل دستگاه برای خروجی و نوشتن در ان انجام می شود , دقیقا مانند نوشتن در یک فایل معمولی. در مثال پیش روی که می تــوانـــیـد از این آدرس [۳] دریــافت داریــد ایــن تابــع با نام device_write در فایل chardev.c پیاده سازی شده‌است.

پیاده سازی توابعی که تاکنون دیده‌ایم در یک راه‌انداز معمولا کفایت نمی کند. فرض کــنـیــد که شما یک پورت سریال دارید که به یک مودم متصل اسـت ( حتی اگر شما یه مودم داخلی داشته باشید از دید پردازنده‌این یک پورت سریال است که به یک مودم متصل شده‌است ). رویه متداول این است که شما از فایل دستگاه برای نوشتن و خواندن از مودم استفاده می کنید. سوالی که ممکن است مطرح شود این است که چگونه می توان با خود پورت سریال صحبت کرد؟ به عنوان مثال سرعت دریافت یا انتقال داده را تعیین کرد.

جواب این سوال در یونیکس استفاده‌از تابع ویژه‌ای به نام ioctl ( کوتاه شده Input Output Control ) است. هر دستگاه می تواند دستــور ioctl مــخصوص به خود داشته باشد , که هم می تواند بخواند ( اطلاعات را از یک پروسه به هسته بفرستد ) و هم بنویسد ( اطلاعات را به پروسه برگرداند ).

صورت کلی تابع ioctl به صورت زیر است :

#include <sys/ioctl.h>
int ioctl(int fd, int request, ... );

آرگومان اول یک file descriptor است که همان فایل دستگاه می باشد که بایستی قبلا باز شده باشد و fd ان به عنوان آرگومان اول در ioctl استفاده می شود. آرگومـان دوم ( request ) اصصلاحـا عدد ioctl نـــامیده شده کـــه عدد اصلی دستگاه , نوع ioctl , دستور و نوع پارامتر ( آرگومان سوم ) را در خود کد می کند. برای تولید این عدد بسته به پارامتر از ماکــروهایی چون IO_ , IOR_ , IOW_ , IOWR_ و ... استفاده می شود.

این ماکروها بایستی در یک فایــل هدر قرار گرفته (در این مثال chardev.h) ودر هر دو فایل ماژول هسته (در این مثال chardev.c) و کد برنامـه (در این مثال ioctl.c) ضمیـمه شود.

اگر شما می‌خواهید از ioctl در مــاژول خود استــفاده کنید , بهترین راه‌انست که مستقیما ioctl را در ماژول خود پیاده سازی کنید ( در مثال به طور کاملا واضحی توضیح داده شده‌است ) واگر از ioctl دیگران استفاده کنید ممکن است دچار مشکل شوید .

برای کسب اطلاعات بیشتربه فایل Linux Source Code/Documentation/ioctl-number.txt مراجعه کنید.

درباره مثال

ابتدا مثال را از این آدرس [۳]دریافـت کــرده و از حالت فشـرده خــارج سازید. سپس از دسـتور make بـرای ایجاد ماژول استفاده کنید . فایلی به نام chardev.ko ساخته خواهد شد . با استفاده‌از دستور زیر ماژول را در هستـه وارد نمایید.

#insmod ./chardev.ko

با وارد کردن ماژول در هسته دستور العمل لازم در انــــتهای فایل var/log/messages/ که فایل log هسته‌است نوشته خواهد شد. بر طبق دستورعمل کرده و فایل دستگاه char_dev را بسازید. اکنون ماژول شما در هسته وارد شده و شما می توانید با استفاده‌از فایل char_dev در ان بنویسید یا از ان بخوانید. سپس با استفاده‌از دستور زیر فایل اجرایی ioctl را بسازید.

$gcc ioctl.c -o ioctl

و با اجرای ان می توانید دستورات ioctl پیاده سازی شده در chardev را امتحان کنید و خروجی ماژول خود را مشاهده نمایید.

توضیحات لازم در کدهای مثال به صورت comment امده‌است.

در اینجا این قسمت به پایان می رسد. در قسمت آینـــده مطالــب پیشرفته در ماژول نویسی هسته لینوکس را مورد بررسی قرار خواهیم داد.


پی‌نویس و منابع:

۱-http://www.tldp.org/LDP/lkmpg/2.6/html

۲-http://www.linuxhq.com/guides/LKMPG/mpg.html

۳- /images/down/chardev.tar.bz2


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


PDF Version

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