ماژول نویسی برای کرنل قسمت ۱۲(575 مجموع کلمات موجود در متن) (6033 بار مطالعه شده است)
(
ماژول
نویسی برای هسته لینوکس (
قسمت
دوازدهم
در این
قسمت نحوه پیاده تابع 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 |