تبدیل آدرس ها تو مموری

اگه چیزی از نحوه تبدیل آدرس ها ندونید(منطقی به فیزیکال) با خوندن این صفحه قطعا گیج تر میشید(چون خودم شدم).
بیا من خیلی راحت بهت بگم.

فرض یه برنامه داری (code.c) و کامپایلش میکنی.
حالا کامپایلر میاد و برای هر چی تو کدت هست مثل متغیر ها و... یه آدرس منطقی تعیین میکنه و کدت به طور کامل به ماشین کد تبدیل میشه و میریزه تو (program.out).

وقتی program.out رو اجرا میکنی سیستم عامل میاد و برنامه رو یه جایی از حافظه لود میکنه مثلا شروع برنامه از ادرس ۵۰۰ هستش(ادرس فیزیکال). فرض رو بر این بگیریم که یه متغیر تو کدمون داشتیم و کامپایلر ادرس ۵۰ رو بهش داده بوده این آدرس منطقیه و باید تبدیل بشه به آدرس فیزیکی!! پس:
Phisical = base + logical
ادرس فیزیکی اون متغیر میشه ۵۵۰!

ادرسی که کامپایلر تولید میکنه ادرس منطقی و ادرسی که رم باهاش کار میکنه ادرس فیزیکی هستش.

اما این روش برای سیستم عامل های قدیمی بود. الان سخت افزاری به نام MMU(Memory managment unit) وجود داره که با استفاده از Virtual address space , mapping و Page table این کارو انجام میده.

حالا که اینم گفتم یه بار دیگم اشاره میکنم به بخش های مختلف حافظه از هر برنامه!(قبلا یه پست داشتم درموردش)
از پایین ترین سطح یعنی Code شروع میکنیم:
تو این بخش تمام دستور ها و اصلاحا Instruction ها ذخیره میشه.منظور از دستور همون کد ها هستش. منتها نه کدی که شما نوشتی بلکه کدی که کامپایلر کامپایل کرده و رسوندتش به ماشین کد!!📝

سطح بعدی یا همون Static/Global سطحی هستش که متغیر ها،ثابت ها، اشیاء و... که توی سطح برنامه به طور گلوبال قابل دسترسی هستن ذخیره میشه.(اسکوپ گلوبال)

و اما مهم ترین سطح یعنی Stack این بخش خیلی تو سطح برنامه مهمه!
توی این بخش فانکشن ها و اجزاشون ذخیره میشن. هر فانکشن یه فضای شخصی برای خودش توی استک داره به نام Stack frame.
هر فانکشن به محض کال شدن یه استک فریم توی استک میسازه و پارامتر های ورودی،متغیر ها و... خودش رو اونجا ذخیره میکنه.
هر وقت هم کار فانکشن تموم میشه استک فریمش از تو استک حذف و خالی میشه.🗂
بخش heap وقتی استفاده میشه که برنامه نیاز به حافظه بیشتر داره.فرقش با استک اینه که خودکار مدیریت نمیشه و باید خودت ازادش کنی،حجم داینامیکی داره و فضای بیشتر!


نظرات

هنوز نظری ثبت نشده است.

برای ارسال نظر باید وارد شوید.