Konu Başlıkları Gizle
Herkese selamlar, eski bilgisayar gunluklerinden tuhaf ve ilginc bir hatayi anlatmak istedim. Islemcilerin nasil calistigi ile alakali eglenceli ve zararsiz bir hata oldugu icin ornek vermeyi sevdigim bir hata oluyor kendileri.
Aslina bakarsaniz cok absurt bir durum oluyor bu. Islemciye kendi bellegini kitlettirip ona imkansiz bir durum veriyorsunuz ve islemci imkansiz durumu raporlamaya calisirken bellek alani kitli oldugu icin sonsuz bir donguye giriyor. P5 ve P55C mimarilerinde bulunan bu hata P6 serisinde duzeltilmis bulunuyor.
F0 0F C7 C8'in anlami aslen LOCK CMPXCHG8B EAX demek. Turkce mealine cevirmemiz gerekirse su sekilde anlatabiliriz:
Intel ileri tarihlerde urettigi revizyonlarda (spesifik olmak gerekirde B2 Stepping) mikrokod duzenlemeleri yaparak bu hatayi silikon duzeyinde cozdu. Yazilim tarafi ise cekirdek duzeyinde IDT girisilerini okunamaz adreslere yonlendirerek sayfa hatasi yakalamis ve bu sekilde hatayi daha baslamadan onlemistir. Teknik dille cekirdek, IDT'nin ilk sayfasini kasitli olarak Present=0 haline sokup islemcinin #UD gondermeden #PF almasini saglar. Unutmadan bu hatanin 80186, 80286, 80386 ve 80486 serilerinde yasanmadigini, P5 ve P55C ozelinde oldugunu belirtmek gerekli.
Okudugunuz icin tesekkur eder, iyi gunler dilerim millet.
Ne ola "F0 0F C7 C8"?
Aslina bakarsaniz cok absurt bir durum oluyor bu. Islemciye kendi bellegini kitlettirip ona imkansiz bir durum veriyorsunuz ve islemci imkansiz durumu raporlamaya calisirken bellek alani kitli oldugu icin sonsuz bir donguye giriyor. P5 ve P55C mimarilerinde bulunan bu hata P6 serisinde duzeltilmis bulunuyor.
Nasil olustu?
F0 0F C7 C8'in anlami aslen LOCK CMPXCHG8B EAX demek. Turkce mealine cevirmemiz gerekirse su sekilde anlatabiliriz:
- Gereksiz LOCK/F0 oneki: Bellek uzerinde atomik islemlerde veri/sistem yolunu kilitler. Ancak; LOCK kurallardan oturu sadece ve sadece bellek adreslerinde gecerlidir. Ismi gibi kilitlemeye yariyor kisa kesmek gerekirse.
- Gecersiz C8 kullanimi: Kodda bulunan C8 bayti, hedefi CMPXCHG8B talimatinin hedefini bellek yerine EAX yazmaci olarak belirler. Bellek yerine hedefi yazmaca yonlendirmeye yaramakta.
- Sirayla isleme: Islemci, kendisine F0 0F C7 C8 talimatlari geldiginde bunu gelen sirayla isler ve once F0, yani LOCK, talimatini isleyerek veri/sistem yolunu tamamen kilitler. LOCK talimati islenmis olur.
- Gecersiz Talimat Istisnasi: Ardindan operatorun bir bellek adresi degil yazmac oldugunu islemci fark eder ve olmasi gerektigi gibi #UD (gecersiz talimat istisnasi/invalid opcode exception) yollar.
- Kilit: Hata tam olarak bu surecte yatiyor. Islemci istisnayi islemek icin isletim sisteminin Exception Handler (istisna dizginleyicisi) adresine hoplamaya calisir. Lakin, veri/sistem yolu LOCK oneki yuzunden halen kitlidir ve islemci gereken istisna durumunu yonetemez. Kendi bellegini acmadan kendi bellegini okuyamadigindan oturu sinirsiz bir dongude kendini mahsur birakir ve sonsuza dek kitlenir. Yalnizca ve yalnizca reset ile duzeltilebilir.
Nasil duzeldi?
Intel ileri tarihlerde urettigi revizyonlarda (spesifik olmak gerekirde B2 Stepping) mikrokod duzenlemeleri yaparak bu hatayi silikon duzeyinde cozdu. Yazilim tarafi ise cekirdek duzeyinde IDT girisilerini okunamaz adreslere yonlendirerek sayfa hatasi yakalamis ve bu sekilde hatayi daha baslamadan onlemistir. Teknik dille cekirdek, IDT'nin ilk sayfasini kasitli olarak Present=0 haline sokup islemcinin #UD gondermeden #PF almasini saglar. Unutmadan bu hatanin 80186, 80286, 80386 ve 80486 serilerinde yasanmadigini, P5 ve P55C ozelinde oldugunu belirtmek gerekli.
Okudugunuz icin tesekkur eder, iyi gunler dilerim millet.