سگمنت کردن حافظه و سگمنت ها
سگمنت کردن حافظه به انگلیسی memory segmentation به تقسیم کردن بخش های مختلف حافظه کامپیوتر به بخش های مختلف گفته میشود که توسط CPU انجام میشود.
تاریخ segment کردن
سگمنت کردن نخستین بار در پردازنده Intel 8086 معرفی شد که در آن مجموعه کوچکی از index ها یا آدرس هایی از محل های مشخصی از حافظه برای دسترسی نگهداری میکرد. این محل ها سگمنت نامیده میشوند. ریز پردازنده های خانواده Intel 8086 چهار نوع سگمنت ارائه دادند که عبارتند از:
- کد سگمنت (CS) یا code segment
- سگمنت داده (DS) یا data segment
- سگمنت پشته (SS) یا stack
- سگمنت اضافه (ES) یا extra segment
سگمنت کردن به عنوان راه حلی برای آدرس دهی بیشتر از ۶۴ کیلوبایت از حافظه معرفی شد. اینتل 80286 نسخه دوم سگمنت کردن را در سال ۱۹۸۲ ارائه کرد که در آن پشتیبانی از حافظه مجازی (virtual memory) و محافظ حافظه (memory protection) اضافه شد. در سگمنت کردن نسخه دو ۲ سگمنت جدید به نام های FS و GS اضافه شدند که هیچ استفاده مشخصی توسط سخت افزار برای آنها مشخص نشد.
نقش CPU در سگمنت کردن
واحد پردازش مرکزی یا Central Processing Unit یک مدار کامپیوتری است که اطلاعات را برای انجام محاسبات به دروازه های منطقی هدایت میکند.
ثبات ها
ثبات, به انگلیسی register قسمت ویژهای در پردازشگر است که آدرس ها و داده ها را در خود ذخیره میکند.
ثبات سگمنت
ثبات سگمنت، به انگلیسی segment register بخشی از ثبات پردازنده میباشد که آدرس segment ها در RAM را حفظ میکند.
- کد سگمنت (CS) یا code segment
- سگمنت داده (DS) یا data segment
- سگمنت پشته (SS) یا stack
- سگمنت اضافه (ES) یا extra segment
برخی از segment ها هستند.
انواع آدرس
Absolute Address
یک مقدار عددی یکتا است که به یک درایه در RAM اشاره دارد.
Relative Address
روش دیگر آدرس دهی به صورت یک جفت با استفاده از segment و offset است.
Memory Address = Segment Index + Offset
انواع Segment در RAM
حافظه دسترسی تصادفی یا RAM, مخفف random access memory یک ماتریس بزرگ از bit ها است که در برخی CPU ها از نظر منطقی به سگمنت ها یا بخش هایی مختلفی تقسیم میشود؛ RAM الزاما به طور کامل به هیچ کدام از بخش های منطقی اختصاص داده نمیشود, و این امر بستگی به معماری CPU دارد.
کد سگمنت
کد سگمنت، به انگلیسی code segment، همچنین مشهور به text segment یا به اختصار .text محل ذخیره یک نرمافزار و ثابت های آن یا constant ها برای اجرا میباشد.
سگمنت داد
سگمنت داده، به انگلیسی data segment، یا به اختصار .data محل ذخیره متغیر هایی میباشد که مقدار دهی اولیه شده اند و مقدار آنها قابل تغیر است.
نکته: همه متغیر های global و static در سگمنت داده ذخیره میشوند.
سگمنت پشته
سگمنت پشته، به انگلیسی stack segment یک پشته است که به عنوان یک منبع ذخیره موقت استفاده میشود, و همچنین سگمنت پشته به واسطه compiler کنترل میشود و برنامه نویس کنترلی بر آن ندارد.
پشته / stack یک ساختمان داده ADT است که برای ذخیره مجموعهای از آیتمها یا آجبکت ها مورد استفاده قرار میگیرد.
از آنجا که stack یا پشته برخلاف آرایه یک ساختمان داده static نیست, حافظه استک دارای اندازه مشخص نیست, و در آن مشکلی به مانند stack overflow نخواهد بود.
هر سگمنت توابعی به مانند توابع زیر دارد:
- تابع push برای درج داده
- تابع pop برای حذف داده
- تابع peek برای دسترسی به بالاترین داده استک بدون تغیر داده
- تابع count برای بدست آوردن تعداد عناصر stack
- و...
همه متغیر های محلی در یک برنامه, و function call ها در سگمنت پشته ذخیره میشوند.

سگمنت پشته یک ساختمان داده ساده به شکل LIFO یا آخر به اول است که آیتم ها فقط از بالای پشته اضافه یا حذف میشوند.
سگمنت اضافه
The extra segment is the default destination for string operations (for example MOVS or CMPS).
سگمنت heap
حافظه یا سگمنتِ heap، معمولا از انتهای .bss و .data سگمنت شروع میشود، و افزایش مییابد؛ متغیر های ذخیره شده در هیپ توانایی تغیر اندازه و resize شدن دارند.
حافظه اختصاص داده شده به متغیر ها در هیپ باید توسط برنامه نویس آزاد شود, و همچنین داده ها در هیپ هیچ ترتیبی ندارند.
هیپ سگمنت را میتوان به یک استخر بزرگ داده در RAM تشبیه کرد (به ازای هر پردازش) که پردازش درحال اجرا میتواند داده های تولید شده یا chunk را از آن درخواست کند.
تولید و دسترسی به داده ها به صورت پویا انجام میشود مثل پیدا کردن اعداد اول با recursion. از این رو, این مرحله تخصیص پویا یا dynamic allocation خوانده میشود.
توجه شود که این با حافظه استک که متغیر ها اولیه به آن اختصاص داده میشوند متفاومت است.