ماژول نویسی برای هسته لینوکس (قسمت نهم)(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 |