مروری بر حافظهی مجازی در ویندوز
وقتی یک برنامه اجرا میشود، برای آن پروسهای ایجاد شده که امکانات مختلفی از جمله دسترسی به حافظه را فراهم میکند. پروسهها مستقیم به حافظهی فیزیکی (همان RAM) دسترسی نداشته و یک لایهی Abstraction توسط سیستمعامل ایجاد میشود که به آن حافظهی مجازی میگویند.
این لایه وظایفی دارد که بخشی از آن به صورت خلاصه عبارتند از:
• مدیریت اینکه داده دقیقا در کدام آدرس RAM قرار دارد و Map کردن آن در فضای مجازی پروسه
• استفاده از Hard Disk در صورت کم بودن RAM بدون اینکه پروسه از آن اطلاع داشته باشد
• جلوگیری از تکرار داده در حافظهی فیزیکی و Map کردن بخشی که بین چند پروسه مشترک است برای آنها
• کنترل دسترسی به اطلاعات خاص و تعیین permission برای داده
• دسترسی به دادهها به صورت یکسری Chunk بجای دسترسی بایت به بایت (تعریف Page)
از طرف دیگر از دید پروسه کل فضای آدرسدهی ممکن (در مدل ۳۲بیتی ۲گیگابایت و در مدل ۶۴بیتی ۱۲۸ترابایت) قابل تخصیص بوده و میتوان از آن استفاده نمود ولی اینکه واقعا چقدر از آن قابل استفاده است بسته به میزان RAM موجود و میزان Hardای دارد که برای استفاده به عنوان حافظه در سیستمعامل تعیین شده است.
ویندوز امکان رزرو کردن کل فضای آدرسدهی ممکن را به پروسهها میدهد ولی برای استفادهی واقعی و قراردادن داده در آن باید آن فضا commit شده و در این مرحله است که امکانپذیر بودن آن با توجه به میزان کل فضای موجود، توسط سیستمعامل چک شده و اگر امکانپذیر بود به پروسه امکان دسترسی داده میشود.
در ابزارهای مختلفی که در ویندوز وجود دارند (مثل Task Manager, Process Explorer) یکسری Counter برای اطلاع پیدا کردن از وضعیت حافظه در سیستم و میزان فضای رزرو یا استفاده شده توسط پروسهها وجود دارد که میتوان به کمک آنها از اتفاقاتی که برای حافظه رخ میدهد اطلاع پیدا کرد.
در این ویدئو مروری بر وظایف حافظهی مجازی در ویندوز انجام گرفته و Counterهای موجود، برای بررسی آن در ابزارهای مختلف شرح داده میشوند.
لینک ویدئو در یوتیوب:
https://youtu.be/x5AnJpGBdW4
لینک ویدئو در آپارات:
https://aparat.com/v/NIsUi
#ShortWinInternals #windows #memory #internals #VirtualMemory #MemoryCounters
وقتی یک برنامه اجرا میشود، برای آن پروسهای ایجاد شده که امکانات مختلفی از جمله دسترسی به حافظه را فراهم میکند. پروسهها مستقیم به حافظهی فیزیکی (همان RAM) دسترسی نداشته و یک لایهی Abstraction توسط سیستمعامل ایجاد میشود که به آن حافظهی مجازی میگویند.
این لایه وظایفی دارد که بخشی از آن به صورت خلاصه عبارتند از:
• مدیریت اینکه داده دقیقا در کدام آدرس RAM قرار دارد و Map کردن آن در فضای مجازی پروسه
• استفاده از Hard Disk در صورت کم بودن RAM بدون اینکه پروسه از آن اطلاع داشته باشد
• جلوگیری از تکرار داده در حافظهی فیزیکی و Map کردن بخشی که بین چند پروسه مشترک است برای آنها
• کنترل دسترسی به اطلاعات خاص و تعیین permission برای داده
• دسترسی به دادهها به صورت یکسری Chunk بجای دسترسی بایت به بایت (تعریف Page)
از طرف دیگر از دید پروسه کل فضای آدرسدهی ممکن (در مدل ۳۲بیتی ۲گیگابایت و در مدل ۶۴بیتی ۱۲۸ترابایت) قابل تخصیص بوده و میتوان از آن استفاده نمود ولی اینکه واقعا چقدر از آن قابل استفاده است بسته به میزان RAM موجود و میزان Hardای دارد که برای استفاده به عنوان حافظه در سیستمعامل تعیین شده است.
ویندوز امکان رزرو کردن کل فضای آدرسدهی ممکن را به پروسهها میدهد ولی برای استفادهی واقعی و قراردادن داده در آن باید آن فضا commit شده و در این مرحله است که امکانپذیر بودن آن با توجه به میزان کل فضای موجود، توسط سیستمعامل چک شده و اگر امکانپذیر بود به پروسه امکان دسترسی داده میشود.
در ابزارهای مختلفی که در ویندوز وجود دارند (مثل Task Manager, Process Explorer) یکسری Counter برای اطلاع پیدا کردن از وضعیت حافظه در سیستم و میزان فضای رزرو یا استفاده شده توسط پروسهها وجود دارد که میتوان به کمک آنها از اتفاقاتی که برای حافظه رخ میدهد اطلاع پیدا کرد.
در این ویدئو مروری بر وظایف حافظهی مجازی در ویندوز انجام گرفته و Counterهای موجود، برای بررسی آن در ابزارهای مختلف شرح داده میشوند.
لینک ویدئو در یوتیوب:
https://youtu.be/x5AnJpGBdW4
لینک ویدئو در آپارات:
https://aparat.com/v/NIsUi
#ShortWinInternals #windows #memory #internals #VirtualMemory #MemoryCounters
❤12👍6👏1
شیوهی دریافت حافظه توسط برنامهها و درایورها در ویندوز
در پست قبلی در مورد حافظهی مجازی در ویندوز صحبت کردیم و وظایف این لایه و پارامترهایی که در ابزارهای مختلف برای بررسی میزان حافظهی تخصیص داده شده به پروسهها وجود دارند را مرور کردیم. در این پست جزئیات دریافت حافظه از ویندوز توسط برنامهها و درایورها را شرح داده و این فرآیند را در سمت کرنل عمیقتر بررسی میکنیم.
در 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
در پست قبلی در مورد حافظهی مجازی در ویندوز صحبت کردیم و وظایف این لایه و پارامترهایی که در ابزارهای مختلف برای بررسی میزان حافظهی تخصیص داده شده به پروسهها وجود دارند را مرور کردیم. در این پست جزئیات دریافت حافظه از ویندوز توسط برنامهها و درایورها را شرح داده و این فرآیند را در سمت کرنل عمیقتر بررسی میکنیم.
در 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
YouTube
System Memory Pools in Windows [PER]
در سمت کرنل چیزی با عنوان VirtualAlloc/Heap وجود ندارد و به درایورها حافظه از طریق دو نوع Pool اختصاص داده میشود. اولین نوع Non-Paged Pool است که حافظهی تخصیص داده شده از آن تضمین میشود که همیشه در RAM باشد. این موضوع برای جلوگیری از Deadlock و Crash کردن…
👍10❤3
ساعتی با حافظهی مجازی در لینوکس
یکی از کارهایی که سیستمهای عامل از جمله لینوکس انجام میدهند مدیریت حافظه و ایجاد یک لایهی Abstraction برای پروسههاست که به کمک آن هر پروسهای تصور میکند کل حافظهی موجود در سیستم، معمولا ۳ گیگ در مدل ۳۲بیتی و ۱۲۸ترابایت در مدل ۶۴بیتی، را در اختیار داشته و از اینکه واقعا چه مقداری حافظه در سیستم موجود بوده و داده بر روی RAM یا Disk ذخیره میشود اطلاعی نخواهد داشت.
دریافت حافظه از سیستمعامل و نگاشت آن در فضای آدرس دهی پروسهها نیز در واحدهایی به اسم Page و به کمک فراخوانی سیستمی mmap انجام میشود که پیشفرض مقدار 4KB داشته و از یک Page Table برای مشخص کردن اینکه چه فضایی از پروسه در کجای RAM/Disk قرار گرفته است استفاده میشود.
در این ویدئو مفاهیم مربوط به آدرسدهی مجازی Virtual Addressing در لینوکس و بخشهایی که در آن دخیل بوده شرح داده شده و به کمک چند نمونه کد مفاهیم تست میشوند.
برخی از مواردی که در مورد آنها صحبت میکنم به شرح زیر است:
• مقدمهای بر حافظه مجازی و دلیل استفاده از Virtual Addressing
• نحوه نگاشت Page و Frame
• مفهوم Page Table و نقش آن در نگاشت آدرسها
• بررسی فایل proc/iomem/ و نحوه نگاشت حافظه در RAM
• تفاوت Page Faultهای Major و Minor و نحوه مدیریت آنها
• آشنایی با Zoneهای حافظه در لینوکس
• معرفی Slab Allocator و مفهوم کشهای حافظه
• مقایسه روشهای تخصیص حافظه در کرنل kmalloc vs vmalloc
• بررسی اطلاعات در حافظه مجازی و RAM به کمک Qemu
لینک ویدئو در یوتیوب:
https://youtu.be/2bjuqRLFaHc
لینک ویدئو در آپارات:
https://aparat.com/v/xqj64rn
#ShortLinuxInternals #linux #internals #VirtualMemory #MemoryManagement #KernelProgramming #PageTable #PageFault #SlabAllocator #kmalloc #vmalloc #SystemProgramming #EmbeddedLinux
یکی از کارهایی که سیستمهای عامل از جمله لینوکس انجام میدهند مدیریت حافظه و ایجاد یک لایهی Abstraction برای پروسههاست که به کمک آن هر پروسهای تصور میکند کل حافظهی موجود در سیستم، معمولا ۳ گیگ در مدل ۳۲بیتی و ۱۲۸ترابایت در مدل ۶۴بیتی، را در اختیار داشته و از اینکه واقعا چه مقداری حافظه در سیستم موجود بوده و داده بر روی RAM یا Disk ذخیره میشود اطلاعی نخواهد داشت.
دریافت حافظه از سیستمعامل و نگاشت آن در فضای آدرس دهی پروسهها نیز در واحدهایی به اسم Page و به کمک فراخوانی سیستمی mmap انجام میشود که پیشفرض مقدار 4KB داشته و از یک Page Table برای مشخص کردن اینکه چه فضایی از پروسه در کجای RAM/Disk قرار گرفته است استفاده میشود.
در این ویدئو مفاهیم مربوط به آدرسدهی مجازی Virtual Addressing در لینوکس و بخشهایی که در آن دخیل بوده شرح داده شده و به کمک چند نمونه کد مفاهیم تست میشوند.
برخی از مواردی که در مورد آنها صحبت میکنم به شرح زیر است:
• مقدمهای بر حافظه مجازی و دلیل استفاده از Virtual Addressing
• نحوه نگاشت Page و Frame
• مفهوم Page Table و نقش آن در نگاشت آدرسها
• بررسی فایل proc/iomem/ و نحوه نگاشت حافظه در RAM
• تفاوت Page Faultهای Major و Minor و نحوه مدیریت آنها
• آشنایی با Zoneهای حافظه در لینوکس
• معرفی Slab Allocator و مفهوم کشهای حافظه
• مقایسه روشهای تخصیص حافظه در کرنل kmalloc vs vmalloc
• بررسی اطلاعات در حافظه مجازی و RAM به کمک Qemu
لینک ویدئو در یوتیوب:
https://youtu.be/2bjuqRLFaHc
لینک ویدئو در آپارات:
https://aparat.com/v/xqj64rn
#ShortLinuxInternals #linux #internals #VirtualMemory #MemoryManagement #KernelProgramming #PageTable #PageFault #SlabAllocator #kmalloc #vmalloc #SystemProgramming #EmbeddedLinux
YouTube
Virtual Memory in Linux
یکی از کارهایی که سیستمهای عامل از جمله لینوکس انجام میدهند مدیریت حافظه و ایجاد یک لایهی Abstraction برای پروسههاست که به کمک آن هر پروسهای تصور میکند کل حافظهی موجود در سیستم، معمولا ۳ گیگ در مدل ۳۲بیتی و ۱۲۸ترابایت در مدل ۶۴بیتی، را در اختیار داشته…
❤26👍4