ماژول نویسی برای هسته لینوکس - قسمت چهاردهم و پایانی(1019 مجموع کلمات موجود در متن) (6836 بار مطالعه شده است) ماجول
نویسی برای هسته لینوکس (قسمت
چهاردهم و پایانی)
در
این قسمت با بررسی چند موضوع باقیمانده
مجموعه مقالات اشنایی با ماجول نویسی
هسته لینوکس را به پایان می بریم.
در
ابتدا با دو مثال دو راه ساده ارتباط هسته
با دنیای بیرون را شرح خواهیم داد.
سپس
با نحوه زمان بندی کارها در هسته اشنا
خواهیم شد و در ادامه روتین های رسیدگی
کننده به وقفه ها (Interrupt
Handlers) را
مورد بررسی قرار خواهیم داد.
در
انتها نیز با ذکر چند نکته و جمع بندی این
مجموعه مقالات را به پایان خواهیم برد.
تعویض
printk در
این بخش نحوه فرستادن پیغام ها از طرف
ماجول هسته به tty
ها
را بررسی خواهیم کرد.
این
کار با استفاده از متغیر current
که
اشاره گری به پروسه در حال اجرا است صورت
می پذیرد.
با
استفاده از ساختار داده tty
مربوط
به این پروسه و صدا کردن تابعی که می تواند
یک رشته کاراکتر را بر روی tty
چاپ
کند این کار انجام می گیرد.
مثال
print_screen.c
نحوه
انجام این کار را نشان می دهد.
کد
ان را از [۱]
دریافت
کنید.
فلاش
LED
های
کیبورد در
بعضی شرایط شما مایلید که از یک راه ساده
با دنیای بیرون ارتباط برقرار کنید.
روشن
و خاموش کردن LED
های
کیبورد می تواند یکی از این راه ها باشد.
این
راه یک راه سریع برای جلب توجه و نشان دادن
وضعیت سیستم می تواند باشد.
LED های
کیبورد در هر سخت افزاری وجود دارند,
همیشه
قابل دیدن هستند,
به
نصبی یا چیزی مشابه ان احتیاج ندارند و
کارکرد ساده تری نسبت به نوشتن در tty
یا
یک فایل دارند.
در
این مثال که کد ان را می توانید از ]
بدست
اورید ماجول هسته کوچکی نوشته شده است که
از زمان وارد شدن به هسته تا زمان خارج
شدن چراغ های کیبورد شما را خاموش و روشن
می کند.
(البته
این مثال کمی تغییر داده شده تا جذاب تر
باشد
زمان
بندی کارها اغلب
ما کارهایی داریم که می خواهیم سر زمان
مشخصی اجرا شوند.
اگر
کار ما توسط پروسه ها قابل انجام است ان
را در فایل crontab
می
گذاریم.
اگر
قرار است این کار توسط هسته انجام شود دو
امکان در اختیار داریم:
راه
اول این است که پروسه موردنظرمان را در
crontab
بگذاریم
و ماجول موردنظر را با استفاده از تابع
سیستمی ای که در این پروسه بیدار نماییم.
مثلا
با باز کردن فایلی ماجولی را بیدار کنیم.
همانطور
که حدس زده اید این کار کاملا غیر بهینه
است.
با
استفاده از crontab
پروسه
ای را اجرا می کنیم و فایل اجرایی را به
حافظه می اوریم که فقط یک ماجول هسته را
بیدار کنیمبه
جای این کار می توانیم تابعی ایجاد کنیم
که در هر وقفه زمانی (timer
interrupt) صدا
زده شود.
برای
انجام این کار ابتدا بایستی کار (task)
مورد
نظرمان را ایجاد نماییم,
ان
را در ساختاری به نام workqueue_struct
قرار
دهیم.
در
واقع اشاره گری به این تابع در این صف قرار
می گیرد.
سپس
از تابع queue_delayed_work
برای
قراردادن ان کار در لیست کارهای my_workqueue
که
لیست کارهایی که در وقفه زمانی بعد اجرا
می شوندقرار می دهیمکد
مثال sched.c
یک
نمونه ای از این زمان بندی را نشان می دهد.
در
این کد کار خاصی در هر وقفه زمانی انجام
می شود.
برای
دریافت این مثال به ]
مراجعه
کنید
راه
انداز وقفه ها (Interrupt
Handlers) مواردی
که تاکنون در این مجموعه مورد بررسی قرار
دادیم توابعی بودند که به عنوان پاسخی
برای پروسه هایی که ان امکانات را درخواست
داده بودند نوشته می شدند.
به
عنوان مثال توابعی برای ارتباط با یک
فایل,
پاسخی
به ()ioctl
یا
صدا کردن یک تابع سیستمی برای پاسخ به یک
درخواست.
اما
باید توجه داشت که وظیفه هسته تنها پاسخ
گویی به درخواست های پروسه ها نیست.
یکی
دیگر از وظایف مهم هسته ارتباط با سخت
افزار های متصل به سیستم است.
به
طور کلی دو نوع روش کلی ارتباط بین CPU
و
دیگر سخت افزار های کامپیوتر وجود دارد.
روش
اول بدین صورت است که CPU
به
طور متناوب به دستگاه های دیگر سرک کشیده
و دستورات لازم را می دهد.
در
روش دوم دستگاه هر وقت نیاز داشت که با
CPU
ارتباط
برقرار کند ان را خبر می کندروش
دوم که اصطلاحا interrupt
یا
وقفه نامیده می شود,
نسبتا
پیاده سازی سخت تری نسبت به روش اول دارد
بدلیل اینکه راحتی را برای دستگاه ها به
همراه می اورد نه CPU.
دستگاه
های سخت افزاری معمولا حافظه کمی دارند
و اگر شما نتوانید در زمان معین اطلاعات
انها را بخوانید ان اطلاعات از دست می
رونددر
لینوکس وقفه های سخت افزاری Interrupt
Request) IRQ) نامیده
می شوند.
IRQ ها
دو دسته هستند:
کوتاه
وبلند.
یک
IRQ
کوتاه
زمان کوتاهی دارد لذا در حین این IRQ
دیگر
قسمت های سیستم متوقف شده و وقفه دیگری
پاسخ داده نمی شود.
IRQ بلند
زمان بیشتری طول می کشد و در طی ان وقفه
های دیگری نیز ممکن است اتفاق بیفتد.
( البته
این وقفه ها از دستگاه های یکسانی نمی
تواند باشد).
بنابراین
بهتر است که یک راه انداز وقفه به صورت
بلند تعریف شودهنگامی
که یک وقفه به CPU
می
رسد,
CPU کار
خود را متوقف کرده مگر
اینکه رسیدگی به وقفه جاری مهم تر از
رسیدگی به وقفه رسیده باشد,
در
این صورت اجرای وقفه رسیده تا زمانی که
وقفه مهم تر تمام شود به تاخیر می افتد),
پارامترهای
معینی در حافظه پشته (stack)
ذخیره
و تابع رسیدگی کننده به وقفه صدا زده می
شوداین
بدان معنی است که بعضی کارهای معین حق
اجرا شدن در تابع رسیدگی کننده به وقفه
را ندارند بدلیل اینکه سیستم در وضعیت
نامشخصی می باشد.
راه
حل این مساله این است که تابع رسیدگی کننده
به وقفه بعضی کارهای لازم را بی درنگ انجام
داده که معمولا چیزی از سخت افزار می خواند
یا چیزی به ان می فرستد و ادامه کار را در
زمان دیگری زمان بندی می کند (
که
به این زمان “bottom
half” گفته
می شود )
و
باز می گرددهسته
تضمین می کند که ادامه کار را در اولین
زمان ممکن انجام دهدمثال
زیر نحوه پیاده سازی این رویه را نشان می
دهد.
کد
این مثال را از ]
دریافت
کنید
جمع
بندی مطالب در
این مجموعه از مقالات با مفاهیم کلی و
نحوه پیاده سازی بعضی از ماجول های هسته
لینوکس اشنا شدیم.
در
ابتدا مفاهیم کلی را بررسی کردیم.
سپس
به دستگاه های کاراکتری و ویژگی های انها
پرداختیم.
با
فایل سیستم proc/
به
عنوان یکی از راه های ورودی خروجی هسته
اشنا شدیم.
به
بررسی sysfs
به
عنوان یک متدلوژی هوشمند انرژی در سیستم
پرداختیم و با مرور مباحثی چون توابع
سیستمی,
متوقف
کردن پروسه ها,
زمان
بندی کارها,
پاسخ
گویی به وقفه ها و ...
اشنا
شدیم.
این
مجموعه مسلما فقط در حد اشنایی بوده و
تسلط کافی برای طراحی و پیاده سازی ماجول
های هسته را به شما نخواهد داد.
لذا
در ذیل منابعی معرفی شده اند که با مطالعه
انها می توانید این تسلط لازم را کسب
نمایید
1- Linux Kernel Source Code [5]
2- Linux Kernel Documentation ( Linux Source Code/Documentations )
3- Understanding the Linux Kernel,2nd edition, O'Reilly.
4- Linux Kernel Development, Sams publishing
5- Linux Device Drivers, 3rd edition, O'Reilly.
6-List of Kernel Resources [6]
امید
است که این مجموعه مقالات برای علاقه
مندان به هسته و سیستم عامل لینوکس مفید
بوده باشد.
اگر
روزی ان قدر در ماژول نویسی هسته لینوکس
مهارت کسب نمودید و توانستید ماژول های
مفید بنویسید,
امیدوارم
آنها را با مجوز GPL
منتشر
کنید تا همه بتوانند باآزادی کامل از ان
استفاده نمایند
ترجمه و تکمیل:
سعید تقوی
[1]- /images/down/print_string.tar.bz2"
[2]- /images/down/kbleds.tar.bz2"
[3]- /images/down/sched.tar.bz2"
[4]- /images/down/intrpt.tar.bz2"
[5]- http://kernel.org/"
[6]- http://jungla.dit.upm.es/~jmseyas/linux/kernel/hackers-docs.html"
http://www.tldp.org/LDP/lkmpg/2.6/html"
PDF Version
|