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


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

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

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

   ورود کاربران




 


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

ماژول نویسی برای هسته لینوکس - قسمت چهاردهم و پایانی

(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


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