شیوهی دریافت حافظه توسط برنامهها و درایورها در ویندوز
در پست قبلی در مورد حافظهی مجازی در ویندوز صحبت کردیم و وظایف این لایه و پارامترهایی که در ابزارهای مختلف برای بررسی میزان حافظهی تخصیص داده شده به پروسهها وجود دارند را مرور کردیم. در این پست جزئیات دریافت حافظه از ویندوز توسط برنامهها و درایورها را شرح داده و این فرآیند را در سمت کرنل عمیقتر بررسی میکنیم.
در user mode چند لایه API برای دریافت حافظه از سیستمعامل ویندوز وجود دارد. در پایینترین سطح، APIهای VirtualAlloc وجود دارند که هیچگونه مدیریتی بر روی حافظهی دریافت شده انجام نداده و حافظه را در واحدهایی به اندازهی Page (پیشفرض 4KB) تخصیص میدهند. این APIها امکان reserve/commit کردن حافظه را فراهم کرده و برای کار با حافظههای بزرگ مناسب هستند.
لایهی بعدی APIهای حافظه که برای کار با اندازهای کوچک حافظه مثل چندبایت نیز مناسب است Heap میباشد. این APIها به صورت داخلی از APIهای لایهی قبلی استفاده کرده و نیازی به تخصیص حافظه در ابعاد Page را ندارند. بر روی این لایه است که زبانهایی مثل C/C++ پیادهسازیهای malloc/new و free/delete را انجام میدهند (جزئیات پیادهسازی وابسته به کامپایلر است) که مربوط به پیادهسازیهای Compilerها میباشد. در این لایه دیگر APIهای ویندوز مستقیم توسط برنامهنویس استفاده نشده و نیازی به کار با آنها ندارد.
اما در سمت کرنل ماجرا از چه قرار است؟ در سمت کرنل چیزی با عنوان VirtualAlloc/Heap وجود ندارد و به درایورها حافظه از طریق دو نوع Pool اختصاص داده میشود. اولین نوع Non-Paged Pool است که حافظهی تخصیص داده شده از آن تضمین میشود که همیشه در RAM باشد. این موضوع برای جلوگیری از Deadlock و Crash کردن درایور اهمیت دارد (جزئیات این موضوع بماند برای یک پست و ویدئوی دیگر!) نوع دوم Pool که حافظهی آن ممکن است در RAM نبوده و به دیسک منتقل شود Paged Pool است.
در این ویدئو جزئیات تخصیص حافظه در سمت کرنل و APIهای ExAllocatePool بررسی شده، در یک درایور تخصیص و آزاد شدن حافظه نمایش داده شده و سپس به کمک WinDbg حافظهی تخصیص داده شده به درایور بررسی میشود.
لینک ویدئو در یوتیوب:
https://youtu.be/pMPyT13jzwk
لینک ویدئو در آپارات:
https://aparat.com/v/VIvgR
#ShortWinInternals #windows #memory #internals #VirtualMemory #MemoryCounters #kernel #drivers #SystemPools #WinDbg
Post #121
3.96K