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


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

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

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

   ورود کاربران




 


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

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

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

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

در قسمت قبل با چگونگی خواندن از و نوشتن در فایل سیستم مجازی proc/ آشنا شدیم. در این قسمت مدیریت این فایل سیستم را با استفاده از inode‌ها و seq_file‌ها از نظر می‌گذرانیم.

در هسته لینوکس مکانیزم استانداردی برای ثبت فایل سیستم وجود دارد. از آن جاییکه هر فایل سیستم بایستی توابع مخصوص به خود برای به کار بردن inode و عملیات فایل داشته باشد ساختار ویژه‌ای به نام struct inode_operations برای نگهداری اشاره‌گر به تمام آن توابع وجود دارد که در خود اشاره‌گری به ساختار struct file_operations دارد.

در فایل سیستمproc/ هنگامی‌که یک فایل جدید ثبت می‌شود ما اجازه خواهیم داشت که ساختار inode_operations ای که برای دسترسی به این فایل به کار می‌رود را تعیین کنیم.

بـــه طـور خلاصه در ایـن مــکـانیزم یــک struct inode_operations وجـــود دارد کــه در خــود اشاره‌گــری بــه یــک struct file_operations دارد کــه این ساختار نیز اشاره‌گرهایی بــه تــوابـعـی مانند procfs_read و procfs_write دارد که وظیفه خواندن از و نوشتن در proc/ را بر عهده دارند.

نکته قابل توجه دیگر وجود توابعی مانند module_permission است. این تابع هنگامی‌ کــه یـک پروسه عملی در proc/ انجام می‌دهد صدا زده شده و تعیین می‌کند که آیا پروسه مذکور حق انجام عمل مورد نظر را دارد یا نه؟

در حال حاضر این قضاوت بر اساس عمل مذکور و uid کاربر حاضر (که در متغییر current که اشــاره‌گری بــه ساختاری در مورد اطلاعات پروسه حاضر است , وجود دارد.) صورت می‌پذیرد. اما باید توجه داشت که این قضاوت می‌تواند به دلخواه ما که ماژول هسته را می‌نویسیم صورت گیرد.

نکته دیگری که در اینجا بایستی ذکر گردد نقش توابع read و write برای هسته برعکس نقشی اســت کــه در مـورد یک پروسه وجود دارد. تابع read به عنوان تابع خروجی و تابع write به عنوان تابع ورودی در هسته استفاده می‌شود. دلیل این موضوع آن است که هنگامی‌که یک پروسه از هسته چیزی می‌خــوانـد هسته بایستی آن را به عنوان خروجی بیرون دهد و هنگامیکه یک پروسه در هسته می‌نویسد هسته بایستی آن را به عنوان ورودی دریافت دارد.

بــرای فــهم عمیق‌تــر و چگــونــگی کاربرد ساختارهای inode_operations و module_permission به مثال procfs3.c که توضیحات کاملی در کــد برای آن وجود دارد مراجعه کنید. کـــد این مثال را از اینجا [۱] می‌توانید بــدست آوریــد. مـاژول را کامپایل نموده و در هسته وارد نمایید و با دستورات cat و echo عملکرد آن را با بررسی فایل var/log/messages/ مورد بررسی قرار دهید.

مدیریت فایل سیستم مجازی proc/ با استفاده از seq_file

همان گونه که دیدیم کار با یک فایل proc/ ممکن است کاملا پیچیده باشد. بــرای رفـــع این پیــچـیدگــی API ای بــه نام seq_file در هسته لینوکس وجــود دارد کـه ما را در قالب بندی یک فایل proc/ برای خروجی یاری می‌نماید که بر اساس تــرتیب (sequence) می‌باشد. ایـن تـرتیب از ســه تابع ()start و ()next و ()stop تشکیل شده است. seq_file هنگامی‌ که یک کاربر از proc/ می‌خواند راه اندازی می‌شود.

یک ترتیب با صدا کردن تابع ()start آغــاز می‌شود. اگــر مقــدار بازگشتــی ایــن تــابـع NULL نبـاشد تابع ()next صدا زده می‌شود. نقش این تابع به عنوان یک iterator می‌باشد و هــدف از صــداکــردن پشت ســرهــم ایـن تابع جابجا شدن به اطلاعات بعدی فایل proc/ می‌باشد.

هر هنگام که این تابع صـدا زده می‌شود تابع دیگری به نام ()show نیز صدا زده می‌شود که اطلاعات دریافتی را در بافری که توسط پروسه فراهم شده می‌نویسد. تابع ()next تا زمانیکه NULL را به عنوان خروجی برگرداند صدا زده می‌شود. در این هنگام ترتیب با صدا زده شدن تابع ()stop خاتمه می‌پذیرد.

توجه نمایید که هنگامی‌که یک ترتیب خاتمه می‌پذیرد تــرتیــب جــدیدی شروع می‌شود. این بدان معناست که در انتهای تابع ()stop تابع ()start دوباره صدا زده می‌شـــود. ایــن چرخه، هــنگامی‌که ()start مقدار بازگشتی NULL باز می‌گرداند خاتمه می‌پذیرد. نحوه عملکرد seq_file در شکل ۱ نشان داده شده است.

شکل ۱ - نحوه عملکرد seq_file


seq_file توابع ساده‌ای مانند seq_read و seq_lseek و... را بــرای file_operations فــراهــم می‌نماید. امــا نمـی‌تواند در proc/ بنویسد. برای انجام این کار بایستی مانند مثال قبلی عمل کرد.

به عنوان مثالی از seq_file به مثال procfs4.c مراجعه کنید. برای کسب اطلاعات بیشتر در این زمینه به این صفحات وب در سایت‌های LWN و KernelNewbies مراجعه کنید:

http://lwn.net/Articles/22355

http://www.kernelnewbies.org/documents/seq_file_howto.txt

همچنین می‌توانید پیــاده ســازی seq_file در هسته لینوکس را در مســیر linux source/fs/seq_file.c مورد مطالعه قرار دهید. در قسمت آینده مرور مختصری بر proc/ به عنوان ورودی و sysfs خواهیم داشت.



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

PDF Version

[1] /files/procfs3-4.tar.bz2

منابع :

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

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

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