یوشا آل ایوب

وبگاه دست نوشته ها و تجربیات شخصی

یوشا آل ایوب

وبگاه دست نوشته ها و تجربیات شخصی

یوشا آل ایوب

دکتر مصطفی چمران: می گویند تقوا از تخصص لازمتر است، آنرا می پذیرم، اما می گویم: آنکس که تخصص ندارد و کاری را می پذیرد، بی تقواست!

تبلیغات
Blog.ir بلاگ، رسانه متخصصین و اهل قلم، استفاده آسان از امکانات وبلاگ نویسی حرفه‌ای، در محیطی نوین، امن و پایدار bayanbox.ir صندوق بیان - تجربه‌ای متفاوت در نشر و نگهداری فایل‌ها، ۳ گیگا بایت فضای پیشرفته رایگان Bayan.ir - بیان، پیشرو در فناوری‌های فضای مجازی ایران
بایگانی

Virtual File System یا سیستم فایل مجازی

 

Virtual File System(مخفف VFS) یک ساب سیستم مهم در Kernel لینوکس هست که لایه بین filesystem و برنامه های user-space رو تشکیل میده. درواقع همه filesystem ها، با تکیه بر VFS می تونن شناسایی بشن و تبادل اطلاعات کنن. همین مسئله، برنامه های user-space رو قادر کرده که توسط دستورات موجود در VFS برای خواندن و نوشتن در filesystem های گوناگون اقدام کنن:

 

نکته: در اینجا منظور از لایه، همون Abstraction layer و منظور از دستورات، همون System call/SysCall هستش.

نکته 2: البته به برکت wrap های Gnu C Library، کمتر پیش میاد که برنامه user-space نیاز به استفاده از System call داشته باشه.

 

VFS، درواقع اسباب استفاده از System call هایی مثل open(), read(), write(), move() شده، علیرغم نوع filesystem و زیر و بم فیزیکیشون...

شاید این مسئله در این روزها شاهکار نباشه اما در دنیای System call ها، ارتباط برقرار کردن با تعداد بیشماری filesystem و device های متنوع چیز کمی نیست! اینکه می تونیم براحتی از یک filesystem به filesystem دیگر، از یک device به device دیگر اطلاعات جابه جا کنیم و عملیات انجام بدیم خودش دنیاییه! برای نمونه، در سیستم عامل های قدیمی مثل DOS همچین چیزی امکان نداشت; برای انجام هر نوع عملیات در یک filesystem غیر بومی(از FAT8 به Minix ,Ext) لازم بود تا از ابزارهای خاصی استفاده بشه تا کار انجام بشه... 

نکته: البته در حالت معمول زمانی که سیستم در حال بوت شدن هست، بیشتر filesystem ها init میشن و خودشون رو توسط VFS ثبت می کنن. بعضی از این filesystem ها بصورت built-in در داخل Kernel تعبیه شدن و برخی دیگر بصورت Loadable Kernel Module... این filesystem های LKM هم فقط زمانی Load میشن که سیستم بهشون نیاز داشته باشه، مثلا وقتی که دیسک FAT به داخل دستگاه میره و mount میشه.

 

امروزه به لطف VFS،اfilesystem های جدید و device های مختلف براحتی می تونن راهشونو در لینوکس پیدا کنن; و برنامه ها هم نیازی به نوشته و کامپایل شدن مجدد ندارن... به این صورت که طرف Abstraction layer در VFS، توسط تعریف اینترفیس های اولیه و ساختمانهای داده ای کار می کنه که همه filesystem ها و برنامه ها ازش پیروی می کنن و طرف filesystem هم توسط تعریف رفتار و عملکرد استانداردش، با Abstraction layer در VFS ارتباط برقرار میکنه. 

بنابراین از اونجایی که همه filesystem ها قادرن با فایل و دایرکتوری کار کنن، عملیات حذف، ساخت و جابه جایی انجام بدن و حتی خروجی و ورودیشون رو با VFS منطبق بدن، میشه گفت همه filesystem های disk-based یکی هستن!

 

نکته: در Kernel هیچ چیزی نیازی نداره تا از زیر و بم filesystem ها مطلع باشه، بغیر از VFS و خود filesystem.

مثال C استاندارد:

write(int fileHandler, void *buff, int len)

این دستور user-space، داده موجود در buff رو با طول len بایت در فایل fileHandler می نویسه... به این صورت که ابتدا از برنامه به دستور write()، بعد به System call هه sys_write() در VFS، بعد به متد نوشتن در filesystem هدایت میشه و نهایتاً دیتا در دیسک سخت ذخیره میشه:

 

VFS شی گرایی هستش!

البته نه اون شی گرایی مثل کلاس، آبجکت و غیره در Java و ++C، بلکه منظور ساختمان داده و شبیه سازی الگوهاست:

Robert Love: People often miss this, or even deny it, but there are many examples of object-oriented programming in the Kernel. Although the Kernel developers may shun C++ and other explicitly object-oriented languages, thinking in terms of objects is often useful. The VFS is a good example of how to do clean and efficient OOP in C, which is a language that lacks any OOP constructs.

این اشیای VFS، درواقع همون ساختمان های داده هستن، لیکن شامل داده و اشاره گرهایی هستند که به توابع داخلی filesystem اشاره دارن که بر روی داده ها عملیات انجام میدن.

از جمله مهمترین این ساختمان های VFS میشه:

1- ساختمان داده superblock - مربوط به یک filesystem ای که mount شده

2- ساختمان داده iNode - مربوط به اطلاعات پایه ای فایل و دایرکتوری (مالکیت، شیوه دسترسی، نوع...)

3- ساختمان داده dentry - مربوط به directory (دایرکتوری ها در واقع پوشه نیستند، نوعی فایل هستند و با Folder در ویندوز هم متفاوتند)

4- ساختمان داده file - مربوط به File

رو نام برد.

حال هر یک از این ساختمان های داده(parent)، ساختمان عملیاتی(child) مربوط به خودشون رو دارن:

1- ساختمان super_operations - حاوی متدهایی که Kernel میتونه روی یک filesystem خاص کار کنه. (مثل write_inode, sync_fs...)

2- ساختمان inode_operations - حاوی متدهایی که Kernel میتونه روی یک فایل بسته کار کنه. (مثل create, link...)

3- ساختمان dentry_operations - حاوی متدهایی که Kernel میتونه روی یک دایرکتوری خاص کار کنه. (مثل d_compare, d_delete...)

4- و ساختمان inode_operations - که حاوی متدهایی هستن که Process میتونه روی یک فایل باز کار کنه. (مثل read, write...)

 

در انتها لازمه بگم دو ساختمان استاندارد دیگری هم وجود دارن که Kernel از اونها برای مدیریت داده های مربوط به filesystem ها استفاده میکنه... ولی خارج از بحث VFS هستن پس ما کاری باهاشون نداریم.

تصویر دقیق System calls و Function calls

 

مراجع:

https://kernel.org/doc/Documentation/filesystems

http://tldp.org/LDP/tlk/fs/filesystem.html

Linux Kernel Development

http://lxr.free-electrons.com/source/Documentation/filesystems/vfs.txt

نظرات (۱)

سلام مرسی مفید بود.
دیوایس ها از کدوم ساختمان داده هستن ؟

موفق باشی ، بیشتر پست بزار <3
کاربران بیان میتوانند بدون نیاز به تأیید، نظرات خود را ارسال کنند.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">