General Protection Fault (GPF) — x86 protsessorida boshqa maxsus exceptionga ajratilmagan protection qoidasi buzilishlari uchun chiqariladigan umumiy synchronous exception, odatda #GP sifatida belgilanadi.
Sabablar
Sabab invalid segment selector, descriptor privilege buzilishi, non-canonical addressning ayrim ishlatilishi, privileged instruction yoki reserved bitni noto‘g‘ri sozlash bo‘lishi mumkin. Aniq sabab instruction va error code’dan topiladi.
Page fault farqi
GPF faqat xotira page permissioni xatosi emas; bunday access ko‘pincha page fault beradi. #GP segmentation, privilege va architecture-level checking uchun kengroq toifadir.
OSga uzatish
User mode’da OS uni access violation yoki SIGSEGV/SIGILLga o‘xshash signalga aylantirishi mumkin. Kernel mode’da handler recover qilolmasa oops yoki panic yuz beradi.
Exception frame
Exception frame instruction pointer, code segment, flags va privilege transition bo‘lsa stack state’ni saqlaydi. Error code descriptor reference haqida ma’lumot berishi mumkin, lekin barcha holatda address bermaydi.
Virtualizatsiya
Virtualizationda guest #GP guestga inject qilinishi yoki hypervisor instructionni emulate qilishi mumkin. Handler recursion double faultga olib kelmasligi kerak.
Test
Test descriptor table, privileged opcode, canonical address va user/kernel boundaryni emulator hamda real hardware’da qamraydi. Crash decoder CPU mode va instruction bytesni ko‘rsatadi.
Amaliy nazorat
General Protection Fault bilan ishlaydigan tizim exception frame, error code va modeni aniq lifecycle va version bilan yuritadi. Pointer, mapping, navbat yoki exception holati boshqa qatlamga uzatilganda ownership hamda permission shartlari yo‘qolmaydi. Debug rejimda manzil, obyekt identifikatori va state transition qayd etiladi; production log ASLR, maxfiy ma’lumot va raw pointerlarni ochib yubormaydigan shaklga keltiriladi. Eskirgan handle yoki metadata reuse qilinmasligi uchun generation, build-id yoxud reference hisobidan foydalaniladi.
Muhim xavf — page fault bilan #GPni aralashtirish. Bunday vaziyatda tizim taxmin bilan davom etmaydi: access fault, aniq error, konservativ fallback yoki nazoratli cleanup qo‘llanadi. Signal/fault kelgan nuqta har doim asl buzilish joyi emas; allocation, mapping va oxirgi ownership amallari trace’i tashxisga yordam beradi. Parallel accessda lock, atomic ordering va lifetime birgalikda tekshiriladi. Timeout yoki null check memory safetyning o‘rnini bosa olmaydi.
Sifat nazorati descriptor, opcode va VM testi orqali bajariladi. Sinovlar normal holat bilan birga nol uzunlik, page boundary, alignment, juda katta offset, concurrent close/free, permission o‘zgarishi va platforma farqlarini qamraydi. Correctness avval etalon hamda invariant bilan tekshiriladi, keyin page fault, cache miss, contention, latency yoki xotira sarfi o‘lchanadi. Sanitizer, fault injection va malformed-input fuzzing topgan minimal holat doimiy regressiya testiga aylantiriladi.
x86 arxitekturasidagi general protection exception #GP vektori 13 orqali keladi va page translationga xos bo‘lmagan ko‘plab himoya buzilishlarini qamraydi. Noto‘g‘ri segment selector, non-canonical address, privilege talab qiluvchi instruktsiya yoki descriptor qoidasi bunga sabab bo‘lishi mumkin. Ayrim holatda error code tegishli selector indeksini beradi, boshqasida nol bo‘ladi. Kernel exception frame’dagi instruction pointer, code segment, flags va privilege o‘tishini tekshiradi. User rejimidagi holat odatda process signaliga aylantiriladi; kernel rejimidagi kutilmagan #GP esa jiddiy kernel bugi yoki buzilgan control state belgisi hisoblanadi.
Bog‘liq tushunchalar
x86 exception, privilege, segment descriptor, page fault, illegal instruction, kernel fault