Memory segment — jarayon virtual manzil makonining ma’lum vazifa va himoya xususiyatiga ega oralig‘idir. An’anaviy executable tasvirida text, read-only data, initialized data, BSS, heap va stack segmentlari ajratiladi. Zamonaviy operatsion tizim pagingdan foydalansa ham linker, loader va protection nuqtai nazaridan segment tushunchasi saqlanadi.
Asosiy segmentlar
Text segment kompilyatsiya qilingan kodni saqlaydi va odatda read-execute, write emas. Read-only data konstantalar va literalni tutadi. Data segment boshlang‘ich qiymatli global va static o‘zgaruvchilarni, BSS esa nolga boshlanadiganlarini ifodalaydi. BSS faylda to‘liq nol baytlar sifatida saqlanmay, loader tomonidan zero-filled memory sifatida ajratiladi.
Heap dinamik allocation uchun yuqoriga yoki alohida mappinglar orqali o‘sadi. Stack har thread uchun call frame, lokal qiymat va return address saqlaydi. Ularning aniq joylashuvi ABI, loader va ASLRga bog‘liq; “heap doim pastdan yuqoriga” kabi tasvir barcha tizim uchun qat’iy emas.
Executable format
ELF program header loader xaritalaydigan segmentlarni, section header esa linker va tahlil vositasi uchun .text, .data kabi bo‘limlarni tavsiflaydi. Section bilan segment bir xil emas: bir nechta section bitta load segmentga tushishi mumkin. Production binary section jadvalisiz ham yuklanishi mumkin.
Loader fayl offsetini virtual addressga map qiladi, permission va alignmentni o‘rnatadi. Shared library segmentlari bir nechta jarayonda read-only fizik sahifalarni bo‘lishishi mumkin. Relocation va dynamic linking ayrim jadvalni startupda o‘zgartiradi; RELRO keyin uni read-only qiladi.
Himoya
W^X siyosati sahifa yoziladigan yoki bajariladigan bo‘lishini, ikkalasini bir vaqtda emas, talab qiladi. NX stack va heapdan tasodifiy kod bajarishni cheklaydi. ASLR segment bazalarini tasodifiylashtirib, aniq manzilga tayanadigan exploitni qiyinlashtiradi. U memory safety xatosini yo‘q qilmaydi.
Guard page stack oxirida ruxsatsiz sahifa bo‘lib, o‘sish limitidan oshishni faultga aylantiradi. Thread stack hajmi juda katta berilsa virtual address va commit resursi, juda kichik bo‘lsa chuqur recursion muammosi yuz beradi.
Segmentatsiya va paging
X86 tarixiy segmentation selector, base va limit orqali manzil hosil qilgan. Zamonaviy 64-bit umumiy maqsadli OSlar ko‘pincha flat segment model va pagingdan foydalanadi, ayrim segment registrlari thread-local storage uchun saqlanadi. “Memory segment” atamasi shu apparat segmentatsiyasi bilan process memory region ma’nosini aralashtirmasligi kerak.
Memory map vositasi har regionning manzil, permission, backing file va private/shared holatini ko‘rsatadi. Diagnostikada executable anonymous region, kutilmagan writable-executable page yoki juda katta heap mapping xavf va leak belgisi bo‘lishi mumkin.
Shared library va nusxalar
Position-independent code shared library text segmentini turli virtual manzilga ko‘chirishga imkon beradi. Kod read-only qolsa bir fizik nusxa ko‘p jarayonda bo‘lishiladi. Relocation textni yozishni talab qilsa private dirty page hosil bo‘lib xotira sarfi oshadi. Data segment esa jarayon uchun alohida copy-on-write nusxa bo‘ladi. /proc memory map yoki debugger bir regionning file offseti, inode va permissionini ko‘rsatadi. Bir xil faylga tegishli ikkita mapping turli offset yoki permissionga ega bo‘lishi mumkin. Core dump policy maxfiy segment, shared mapping va huge page’ni qamrash-qamramasligini belgilaydi; dumpning o‘zi sezgir artefakt sifatida himoyalanadi.
Bog‘liq tushunchalar
Text segment, Heap, Stack, ELF, ASLR, Memory protection