- آدرسهای مجازی به صورت پیوسته و پشت سر هم هستند و آدرس دهی بسیار راحت است ولی دادهها بر روی یک حافظه به صورت متصل به هم یا پیوسته ذخیره یا خوانده نمیشوند و کار آدرس دهی مشکل است. پس یکی از مزایای داشتن آدرس دهی مجازی پشت سر هم قرار گرفتن آدرس هاست.
- برنامه از آدرسهای مجازی برای دسترسی به بافر حافظه استفاده میکند که بزرگتر از حافظه فیزیکی موجود هست. موقعی که نیاز به حافظه بیشتر باشد و حافظه سیستم کوچکتر یا کمتر از تقاضا باشد، مدیر حافظه، صفحات حافظه فیزیکی را به صورت یک فایل (عموما 4 کیلیویی) بر روی دیسک سخت ذخیره میکند و صفحات دادهها در موقع نیاز بین حافظه فیزیکی و دیسک سخت جابجا میشود.
- هر پردازشی که بر روی آدرسهای مجازی کار میکند ایزوله شده است. یعنی یک پروسه هیچ گاه نمیتواند به آدرسهای یک پروسه دیگر دسترسی داشته باشد و باعث تخریب دادههای آن شود.
در شکل بالا دو پروسه 64 بیتی به نامهای notepad.exe و myapp.exe قرار دارند که هر کدام فضای آدرسهای مجازی خودشان را دارند و از آدرس 0x000'0000000 شروع و تا آدرس 0x7FF'FFFFFFFF ادامه میابند. هر قسمت شامل یک صفحه 4 کیلویی از حافظه مجازی یا فیزیکی است. به برنامه نوتپد دقت کنید که از سه صفحه پشت سر هم یا پیوسته تشکیل شده که آدرس شروع آن 0x7F7'93950000 می باشد ولی در حافظه فیزیکی خبری از پیوسته بودن دیده نمیشود و حتما این نکته را متوجه شدید که هر دو پروسه از یک آدرس شروع استفاده کردهاند، ولی به آدرسی متفاوت از حافظه فیزیکی نگاشت شده اند.
فضای کاربری و فضای سیستمی User space and system space
گفتیم بسیاری از پروسهها در حالت user mode و پروسههای هسته سیستم عامل و درایورها در حالت kernel mode اجرا میشوند. هر پروسه مد کاربر از فضای آدرس دهی مجازی خودش استفاده میکند ولی در حالت کرنل همه از یک فضای آدرس دهی استفاده میکنند که به آن فضای سیستمی میگویند و برای مد کاربری میگویند فضای کاربری.
در سیستمهای 32 بیتی نهایتا تا 4 گیگ حافظه میتوان به اینها تخصیص داد؛ 2 گیگ ابتدایی به user space و دو گیگ بعدی به system space :
در ویندوزهای 32 بیتی شما امکان تغییر این مقدار حافظه را در میان بوت دارید و میتوانید حافظه کاربری را تا 3 گیگ مشخص کنید و یک گیگ را برای فضای سیستمی. برای اینکار میتوانید از برنامه bcedit استفاده کنید.
در سیستمهای 64 بیتی میزان حافظههای مجازی به صورت تئوری تا 16 اگزابایت مشخص شده است؛ ولی در عمل تنها بخش کوچکی از آن یعنی 8 ترابایت استفاده میشود.
- برنامه جهت اجرا در مد کاربر یک درخواست را برای خواندن دادههای یک device را آماده میکند. سپس برنامه آدرس شروع یک بافر را برای دریافت داده، مشخص میکند.
- وظیفه این درایور یک قطعه در مد کرنل این است که عملیات خواندن را شروع کرده و کنترل را به درخواست کننده ارسال میکند.
- بعد device یک وقفه را به هر تردی thread که در حال اجراست ارسال میکند تا بگوید، عملیات خواندن پایان یافته است. این وقفه توسط ترد درایور مربوطه دریافت میشود.
- حالا دیگر درایور نباید دادهها را در همان جایی که گام اول برنامه مشخص کرده است ذخیره کند. چون این آدرس که برنامه در مد کاربری مشخص کرده است، با نمونهای که این فرآیند محاسبه میکند متفاوت است.