جستجو در تالارهای گفتگو
در حال نمایش نتایج برای برچسب های 'آدرس مجازی'.
1 نتیجه پیدا شد
-
در این قسمت قصد داریم تا با چند مفهوم پایهای تر در سیستم عامل ویندوز آشنا شویم. در ابتدا مفهوم (VAS (Virtual address spaces را مورد بررسی قرار میدهیم. فضای آدرسهای مجازی (VAS) یک مُدل برای مدیریت بهتر حافظه میباشد، زمانی که یک پردازنده اقدام به خواندن یا نوشنتن در یک مکان حافظه میکند، از یک آدرس مجازی استفاده میکند. به عنوان بخشی از عملیات خواندن یا نوشتن، پردازنده آدرس مجازی را به آدرس فیزیکی ترجمه میکند. دسترسی به حافظه از طریق یک آدرس مجازی مزایای زیر را دارد : یک برنامه میتواند از محدودهٔ مجاور آدرس های مجازی برای دسترسی به یک بافر حافظه بزرگ استفاده کند که در حافظه فیزیکی به یکدیگر متصل نیستند. یک برنامه میتواند طیفی از آدرس های مجازی برای دسترسی به بافری بزرگتر از حافظه فیزیکی موجود را مورد استفاده قرار دهد. حافظهٔ فیزیکی ( که به اندازه 4 کیلوبایت میباشد) را به فایل دیسک میفرستد. صفحات داده یا کد بین حافظهٔ فیزیکی و دیسک در صورت مورد نیاز منتقل میگردد (اولویت با صفحات قدیمی تر میباشد.که دیرتر به آنها مراجعه شده است). آدرس های مجازی مورد استفاده در فرایندهای مختلف از یکدیگر جدا شده اند. کد در یک فرآیند نمیتواند حافظهٔ فیزیکی را که توسط فرآیند دیگری یا سیستم عامل مورد استفاده قرار میگیرد تغییر دهد. محدودهٔ آدرسهای مجازی که در فرآیند در دسترس است، فضای آدرس مجازی برای فرایند میباشد. هر فرایند حالت کاربر، دارای فضای آدرس مجازی خصوصی خود است. برای یک فرایند 32 بیتی، فضای آدرس مجازی معمولاً محدودهٔ 2 گیگابایتی از 0x00000000 تا 0x7FFFFFFF است. برای یک فرآیند 64 بیتی فضای آدرس مجازی محدوده 8 ترابایتی 0x00000000000 تا 0x7FFFFFFFFFF است. طیفی از آدرسهای مجازی گاهی اوقات طیفی از حافظههای مجازی نامیده میشوند. این نمودار برخی از ویژگی های آدرس مجازی را نشان میدهد: این نمودار فضاهای آدرس مجازی را برای دو فرایند 64 بیتی نشان میدهد: Notepad.exe و MyApp.exe هر فرایند دارای فضای آدرس مجازی خود است که از 0x000'0000000 تا 0x7FF'FFFFFFFF قرار دارد. هر بلوک آبی نشان دهنده یک صفحه (به اندازه 4 کیلوبایت) از حافظه مجازی یا فیزیکی است. توجه داشته باشید که فرایند Notepad از سه صفحه پیوندی از آدرس های مجازی استفاده میکند، با شروع از آدرس 0x7F7'93950000. اما این سه صفحه مجاور آدرسهای مجازی به صفحات غیر مستقیم در حافظه فیزیکی نقش میشود. همچنین توجه کنید که هر دو فرایند با استفاده از یک صفحه از حافظه مجازی شروع از 0x7F7'93950000 استفاده میکنند، اما آن صفحات مجازی به صفحات مختلف حافظه فیزیکی نقش میشوند. فضای کاربر و فضای سیستم: فرایندهایی مانند Notepad.exe و MyApp.exe در حالت کاربر اجرا میشوند. اجزاء اصلی سیستمعامل و بسیاری از درایورها بیشتر در حالت کِرنل مورد استفاده قرار میگیرند. هر فرایندِ حالت کاربر دارای فضای آدرس خود است ، اما تمام کدهایی که در حالت هسته اجرا میگردند، یک فضای آدرس مجزا به نام فضای سیستم دارند (دارای فضای آدرس مشترک هستند) . فضای آدرس مجازی برای فرآیند کاربر حالت فعلی کاربر، user space نامیده میشود. در ویندوز 32 بیت، فضای آدرس مجازی موجود در دسترس 2 به توان 32 بایت (4 گیگابایت) است. معمولاً 2 گیگابایت کمتر برای فضای کاربر میباشد و ۲ گیگابایت بالاتر برای فضای سیستر در نظر گرفته میشود. در ویندوز 32 بیتی شما میتوانید گزینه ای (در هنگام بوت شدن) را مشخص کنید که بیش از 2 گیگابایت برای فضای کاربر در دسترس باشد . در نتیجه آدر مجازی کمتری در دسترس سیستم قرار میگیرد. شما میتوانید حجم فضای کاربر را تا 3 گیگا بایت افزایش دهید ، در این صورت فقط 1 گیگ فضا برای سیستم باقش میماند. در ویندوز های 64 بیتی مقدار فضای آدرس مجازی 2 به توان 64 بایت (16 اگزابایت) میباشد . اما تنها بخش کوچکی از این محدوده استفاده میگردد محدوده 8 ترابایت از 0x000'00000000 تا0x7FF'FFFFFFFF برای فضای کاربر استفاده میشود و بخش هایی از 248 ترابایت از 0xFFFF0800'00000000 تا 0xFFFFFFFF'FFFFFFFF برای فضای سیستم استفاده میگردد. کُدِ در حال اجرا در حالت کاربر دسترسی به فضای کاربر دارد، اما دسترسی به فضایِ سیستم ندارد. این محدودیت باعث میشود که کد کاربر حالت خواندن یا تغییر ساختار داده های محافظت شده سیستم عامل را نداشته باشد. کد در حالِ اجرا در حالت هسته دارای دسترسی به فضای کاربر و فضای سیستم میباشد. درایورها (راهاندازهایی) که در حالت هسته اجرا میشوند باید در نوشتن یا خواندن در فضای آدرس کاربر به دلایل زیر بسیار محتاط باشد: یک برنامه یوزر مُد (حالت کاربر)، یک در خواست برای خواندن برخی از دادهها را به یک دستگاه میفرستد. این برنامه آدرس اولیه یک بافر برای دریافت داده ها را فراهم میکند. یک دستگاه روتینِ درایور در حالت اجرا در حالت هسته، عملیات خواندن را شروع میکند و کنترل را به تماس گیرنده خود بازمیگرداند سپس اینتراپت دستگاه هر نخ (ترد) را که در حال اجرا است را قطع میکند. در این مرحله، درایور نباید دادهها را به آدرس اولیها ارسال کند که در برنامه کاربر، در قسمت اول به آن اشاره شد. این آدرس در فضای آدرس مجازی فرایند است که درخواست را آغاز کرده است، که به احتمال زیاد همانند فرایند فعلی نیست. مخازن (استخر حافظه) صفحهبندی شده و صفحهبندی نشده (Paged pool and Nonpaged pool) در فضای کاربری، تمام صفحات حافظه فیزیکی را میتوان به عنوان یک فایل دیسک به صورت صحیح برگرداند. در فضای سیستم، برخی صفحات فیزیکی میتوانند از بیین بروند و برخی نیز نمیتوانند. فضای سیستم دارای دو منطقه برای تخصیص حافظه پویا میباشد : paged pool و nonpaged pool. در حالت paged pool حافظه میتواند به صورت فایل (در صورت نیاز) به دیسک منتقل گردد. در حالت nonpaged pool هرگز حافظه نمیتواند به دیسک منتقل گردد. کتابخانهٔ پیوند پویا و فایلهای اجرایی (DLL و PE) در این قسمت کمی با ساختار فایل های اجرایی و بخصوص DLL ها آشنا میشویم. در خلاصه ترین حالت میتوان گفت Dynamic link library نام کتابخانههایی است که توسط برنامه ها استفاده میشوند و توسط مایکروسافت پیاده سازی شده ( که اغلب دارای پسوند dll میباشند). این فایل ها همانند ساختار فایل های exe در ویندوز دارای ساختار (PE (Portable Executable میباشد. این کتابخانهها میتوانند شامل کد و داده و منابع (ریسورسها) باشند. یکی از مزایای فایل های dll این است که یک بار در حافظه بارگذاری میشود و میتواند توسط چندین برنامه مورد استفاده قرار گیرد (به صورت مجازی برای هر برنامه کپی میشود). میتوان dll ها را در موقه نیاز در برنامه بارگذاری کرد و هر جا که دیگر مورد نیاز نبود آن را خالی (Unload) کرد. از طرفی دیگر میتوان از آن برای استفاده از برنامه های قابل بهروزرسانی نیز استفاده کرد به این صورت که میتوان آیکنها ، فونتها و کدهایی که در هسته اصلی برنامه جایگاهی ندارند را درون dll ها قرار داد و در هنگام بهروزرسانی تنها این dll ها را تعویض کرد. هر فایل اجرایی جدا از کدها و دادههای خود میتواند اطلاعات را از خارج از خود و از dll بگیرد. در هر فایل pe بخشی از هدر فایل، شامل آدرس جدول آدرس وارد کردن (Import) میشود که اطلاعات موجود در آن، آدرس توابعی که از dll ها فراخوانی میشود را در خود نگه داری میکنند ( البته این آدرس ها با پایهٔ آدرس dll ترکیب میشوند که در تصویر دوم هم قابل مشاهده است). تصویر زیر خلاصهای ار هدر فایلهایی با ساختار PE میباشد. در این عکس import adress table حاوی آدرس iat در برنامه میباشد. شکل زیر یک توضیح کلی تر و بهتر در اختیار ما میگذارد. در این شکل میتوان iat را بین دو بخش کد و داده ببینید. نمونه ای از فراخوانی یکی از توابع dll ها را در زیر میتوان مشاهده کرد. این تصویر کد اسمبلی یک برنامه میباشد. مثال های کاربردی: مثال اول: در مثال اول یک dll ساخته و آن را با rundll32.exe اجرا کنید. از قسمت پروژه جدید (New project) در قسمت سیپلاسپلاس پروژه ای از نوع win32project بسازید. در صفحه باز شده Next را بزنید. dll را انتخاب کرده و سپس تیک Empty project را بزنید و پروژه را بسازید. سپس به پروژه خود یک فایل cpp اضافه کنید و کدهای زیر را در آن بنویسید: //[dll01.dll] #include <windows.h> extern "C" __declspec (dllexport) void __cdecl hello() { ::MessageBox(0, L"hello world", 0, 0); } BOOL APIENTRY Dll(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; } برنامه را کامپایل کنید، سپس cmd را باز کرده و دستور زیر را در آن تایپ کنید . (در آدرسی که dll قرار دارد دستور را اجرا کنید یا این که آدرس کامل dll را به آن بدهید) c:\rundll32.exe dll01.dll,hello شکل کلی استفاده از این دستور: RUNDLL32.EXE <dllname>,<entrypoint> <optional arguments> با اجرای این دستور پنجرهای را میبینید که در آن پیغام موجود در dll را چاپ میکند. مثال دوم: در این مثال، دیالال (dll) ای که در مثال قبل ساختید را در یک برنامه دیگر با زبان c++ ایجاد و بعد از اتمام کار، آن را آن بارگذاری کنید. کُد برنامه مورد نظر به صورت زیر خواهد بود: #include <windows.h> #include <stdio.h> typedef void(__cdecl *MYPROC)(); int main(void) { HINSTANCE hinstLib; MYPROC ProcAdd; BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; // Get a handle to the DLL module. hinstLib = LoadLibrary(TEXT("c://dll01.dll")); // If the handle is valid, try to get the function address. if (hinstLib != NULL) { ProcAdd = (MYPROC)GetProcAddress(hinstLib, "hello"); // If the function address is valid, call the function. if (NULL != ProcAdd) { printf("dll is loaded\n"); fRunTimeLinkSuccess = TRUE; (ProcAdd)(); } // Free the DLL module. fFreeResult = FreeLibrary(hinstLib); if (fFreeResult && ProcAdd) { printf("dll is Unloaded\n"); } else if (!fFreeResult && ProcAdd) { printf("error , dll is not Unload\n"); } } // If unable to call the DLL function, use an alternative. if (!fRunTimeLinkSuccess) { printf("Message printed from executable\n"); } system("pause"); return 0; }
-
- آدرس مجازی
- virtual address spaces
-
(و 3 مورد دیگر)
برچسب زده شده با :