1 puan yazan GN⁺ 2 시간 전 | 1 yorum | WhatsApp'ta paylaş
  • 80386 mikrokod ROM'u, 8086'nın 10.752 bitine kıyasla 94.720 bit olduğundan görüntü dönüştürme ve doğrulama çok daha zordu
  • Yüksek çözünürlüklü die görüntülerinde görüntü işleme, sinir ağları ve insan destekli otomasyon birleştirilerek birkaç gün içinde ikili blob çıkarıldı ve çapraz doğrulandı
  • Tersine disassembly sürecinde μ-op dizisi, bit alanları, komut sonu desenleri, komut çözücü ve koruma testi PLA yapısı kademeli olarak ortaya çıktı
  • 80386'da tüm komutlara karşılık gelen mikrokod bulunuyor; birçok rutin algoritmadan çok çarpma-bölme donanımı ve barrel shifter ayarlarını üstleniyor
  • Korumalı moddaki IO izin bitmap'i işlenirken 4 baytlık port erişiminde yalnızca ilk 3 adresin denetleniyor gibi görünen potansiyel bir kusur bulundu, ancak henüz kesinleşmiş değil

80386 mikrokodunun çıkarılması ve tersine disassemble edilmesi

  • 8086 mikrokodu tersine disassemble edildi sonrasında Ken Shirriff, 80386'nın mikrokod ROM'u için yüksek çözünürlüklü görüntüler sağladı; ancak 80386 ROM'u 8086'nın 10.752 bitine karşılık 94.720 bit olduğundan dönüştürme ve doğrulama çok daha zordu
  • 8086 için genel yapıyı ve bazı kod parçalarını içeren patentler bulunduğundan arama ipuçları vardı; buna karşılık 80386, tam bir kara kutuya çok daha yakındı ve büyük bir ikili yığının içinden yapı çıkarmak zordu
  • Discord'da GloriousCow ve Smartest Blob gibi isimler, 80386 die'ının yüksek çözünürlüklü görüntülerinden mikrokodu çıkarma işini sürdürdü; görüntü → ikili → anlaşılabilir mikrokoda dönüşüm süreci temel zorluktu
  • Görüntü işleme, sinir ağları ve insan destekli otomasyon birleştirilerek birkaç gün içinde görüntüden ikili blob çıkarıldı ve çapraz doğrulandı

Tersine disassembly sürecinde ortaya çıkan yapı

  • İkili veri çıkarıldıktan sonra bile tersine disassembly kolay değildi; çeşitli desenler eşleştirilerek bir eksende μ-op, diğer eksende ise μ-op bitleri olacak şekilde yeniden düzenleme yöntemi anlaşıldı
  • Kullanılmayan μ-op bloklarının bir uçta yer alması, μ-op'ların okunma sırasını anlamak için ipucu oldu
  • μ-op bitlerini birden çok alana ayırma sürecinde, 8086 mikrokodu çalışmasından gelen deneyimle kaynak yazmaç ve hedef yazmaç alanları belirlendi
  • 80386, ALU işlemlerini 2 çevrimde gerçekleştirebildiğinden, ilk çevrimde iki işleneni ALU'ya yükleyip ikinci çevrimde sonucu hedefe gönderebilmek için ALU'nun ikinci girdisini belirleyen bir alana ihtiyaç vardı
  • Tekrarlayan desenlerin komut sonunu gösterdiği tahmin edildi ve daha sonra bunun gerçekten doğru olduğu doğrulandı
  • Ken, 80386 die'ındaki çeşitli hatları ve mantık bitlerini izleyerek iç bağlantı biçimini anlamaya katkı sağladı; yeni ortaya çıkarılan yapı, aynı bileşenleri kullanan diğer mikrokod parçalarını yorumlamak için ipucu verdi
  • Mikrokodla birlikte birden çok küçük PLA'dan oluşan komut çözücü ve koruma testi PLA'sı da çözüldü; böylece 386 komutları mikrokod parçalarıyla eşleştirilebildi

8086'dan farklı olarak 80386'nın yürütme biçimi

  • 80386, çoğu komutta 8086'dan çevrim başına çok daha hızlıdır ve bunun için daha fazla transistör kullanır
  • 8086'da mikrokodla gerçekleştirilen birçok algoritma, 80386'da fiilen donanım hızlandırıcıları tarafından üstlenilir
  • 80386 mikrokodunun önemli bir bölümü, algoritmanın kendisinden çok çarpma-bölme donanımı, barrel shifter ve koruma testi birimi gibi hızlandırıcıları ayarlama görevini üstlenir
  • Tersine disassembly çalışmasının büyük kısmı, bu hızlandırıcı arayüzleri ile mikrokod arasındaki bağlantı biçimini anlamaya odaklandı

Mikrokod girişleri ve komut işleme

  • Decoding ROM'dan girilen mikrokod giriş noktası sayısı 215'tir; bu sayı 8086'daki 60'a göre büyük artış gösterir
  • Bu artış yalnızca yeni komutlardan kaynaklanmaz; operandın yazmaç mı bellek mi olduğu, CPU'nun gerçek modda mı korumalı modda mı çalıştığı ve REP önekinin kullanılıp kullanılmadığına göre aynı komut farklı rutinlerle işlenir
  • Tüm giriş noktalarının listesi fields.txt dosyasında yer alır; alt programlar ve paylaşılan kod da buna dahildir
  • Birçok üst düzey mikrokod rutini çok az iş yaptıktan sonra diğer giriş noktalarıyla ortak kullanılan rutinlere atladığından, yalnızca üst düzey rutinin boyutuna bakarak anlam çıkarmak zordur
  • Komut çözücü kullanılacak rutini belirlerken yalnızca opcode kullanmadığından, her giriş noktasının işlediği opcode sayısı da yapıyı açıklamak için tek başına yeterli değildir

Tüm komutlar mikrokodla işleniyor

  • 80386, 8086'nın ya da modern CPU'ların aksine her zaman μ-op yürütür ve tüm komutlar için karşılık gelen mikrokod vardır
  • Mikrokodla işlenmeyen hiçbir komut olmadığı doğrulandı

Kullanılmayan kod ve istisna işleme izleri

  • 0x849 ile 0x856 arasındaki rutinler, mikrokod tersine disassembly'sinde unused? olarak işaretlenmiştir ve bunlara bağlı bir giriş noktası görünmemektedir
  • Bu rutinin tam işlevi bütünüyle kesin değildir, ancak 0x8e9 ile 0x8f5 arasındaki #PF(PAGE_FAULT) rutiniyle birçok ortak yanı vardır
  • Her iki rutin de paging unit'in son hata kodunu ayarladıktan sonra interrupt 0x0e'ye devam eder
  • Fark, bu rutinin fault linear address yerine paging unit'ten gelen bilinmeyen bir değeri CR2'ye yazıyor olmasıdır
  • Geri kalan mikrokod, CPU'nun belgelenmiş davranışını uygulayacak şekilde tasarlanmış görünür; düşük seviyeli hata ayıklama için kullanılan ICE(In-Circuit Emulator) donanımıyla etkileşen rutinler ise belgelenmemiş davranış kapsamına girer

Gizli özellikler ve olası IO izin bitmap'i kusuru

  • Henüz gerçek bir 386 makinede test edilemediği için kesin söylenemese de, bazı korumalı mod işletim sistemlerinin kullanıcı modu süreçlerine sınırlı IO port erişimi vermek için kullandığı IO izin bitmap'i işleyişinde bir kusur olabileceği düşünülüyor
  • 4 baytlık port erişimi olduğunda mikrokod, yalnızca ilk 3 adresin izin bitlerini denetliyor gibi görünüyor
  • Bir süreç bunu yetkili olduğu IO port alanının sınırında yaparsa, son bayt erişimi hatalı biçimde başarılı olabilir ve işletim sistemi, kullanıcı erişimine açık olmasını istemediği bir donanım yazmacına temas edilmesine yol açabilir
  • Bu hata son derece sıra dışı bir durumda ortaya çıkacağından, mikrokod tersine disassembly'si olmadan gözden kaçmış olabilir; ancak 40 yılı aşkın süredir yaygın biçimde kullanılan bir donanımda güvenlik açığının fark edilmemiş olması yine de sıra dışıdır
  • Söz konusu davranış yalnızca bazı CPU sürümlerinde bulunmuş olabilir ya da rutin yorumu hatalı olduğundan gerçekte doğru çalışıyor olabilir
  • Bu mikrokodun 80386'nın ilk sürümüne ait olmadığı düşünülüyor; XBTS ve IBTS komutlarının izine, çözücü dışında rastlanmıyor

Öğrenme kaynakları ve indirme konumu

1 yorum

 
GN⁺ 2 시간 전
Hacker News yorumları
  • Yüksek çözünürlüklü die görüntülerinden mikro kodun nasıl geri çıkarılabildiğini merak ediyorum
    Sürecin her transistörü tanıyıp devreyi modellemek olup olmadığını, ortaya çıkan sonucun Verilog benzeri bir biçimde mi olduğunu da öğrenmek isterdim

    • Çıkarma sürecine biraz katıldım; önce mikro kod dizisinin satır ve sütunlarının kesiştiği konumlara göre tüm bitlerin x,y koordinatlarını işaretliyorsunuz
      Ardından 0 ve 1 sınıflandırılıyor; 1, transistör varlığı ve polisilikondaki boşluk sayesinde görsel olarak ayırt ediliyor
      Intel mikro kodunun doğası gereği 0'ların çok daha fazla olduğunu varsayabildiğimiz için, transistör varsa bunu 1 saydık
      Renk eşiğiyle otomatik işleyen araçlar da var ama mozaiğin bazı kısımları bulanık olduğu ve toz karıştığı için çok sayıda sahte 1 bit oluştu, bu yüzden pek uymadı
      Bunun yerine, çıkarılan bit bölgelerini 0/1 olarak sınıflandırması için bir evrişimli sinir ağını eğittik ve sonucu, özgün mozaiğin üzerine %50 opaklıkta beyaz/siyah dikdörtgenler bindirerek kontrol ettik
      Sonrasında birkaç gün boyunca sıkıcı biçimde hataları gözden geçirdik; sonunda ham 2 boyutlu bit dizisini elde ettik ve bir sonraki adım bu diziden mikro kod sözcüklerini çıkarmak
    • Nintendo 64 lockout mekanizması çipinin katman katman soyulmasını gösteren bir video var ve bu tür işleri çeşitli açılardan epey derin işliyor
      https://youtu.be/HwEdqAb2l50?si=VFLed64PZvpCHfy1
    • Görüntünün kendisine bakmanız yeterli
      “Yukarıdaki fotoğraf mikro kod ROM'unun bir bölümünü gösteriyor. Mikroskop altında mikro kod ROM'unun içeriği görülebiliyor ve her konumda transistör olup olmamasına göre bitler okunabiliyor”
      https://www.righto.com/2020/06/a-look-at-die-of-8086-process...
    • Mikro kod bir ROM içinde bulunuyor ve 1 ile 0'ın farklı göründüğü düzenli bir yapıya sahip
  • İlgili devam eden başlık: z386: An Open-Source 80386 Built Around Original Microcode - https://news.ycombinator.com/item?id=48248014 - Mayıs 2026, 22 yorum

  • Birkaç gün önce reenigne bloguna baktığımda “hmm, 2020'den beri yazı yokmuş” diye düşünmüştüm; geri dönmesine sevindim
    Blogun 33 yıl öncesine kadar uzanması da ayrıca çok ilginç

    • Görüntülenme sayacının artması yazı yazmak için tetikleyici olmuş olabilir
  • Mikroprogramlamayı en temelden anlatan iyi bir kitap: https://www.amazon.com/Computation-Structures-Optical-Electr...
    Ücretsiz PDF'ini bulmak da kolay

  • Bu mikro kodu tersine mühendislikle çözmek için gereken emek etkileyici ve 386 mimarisine derinlemesine inen harika bir yazı

  • Gerçek mikro kod uygulamasını görünce, eski işlemcilerin karmaşık işlemleri nasıl ele aldığı biraz daha az gizemli geliyor

  • 386, 22 yıllık üretim ömrü boyunca çok sayıda küçük değişiklik geçirdiği için, bu kodun hangi 386 revizyonundan çıktığını bilmek önemli

    • Bir ipucu, reset sırasında EDX'e yüklenen değer
      9B5 BIST1 -> TMPD 0x0303 PASS2
      9B6 SIGMA -> EDX
      9B7 BIST2 -> TMPE TMPD XOR
      9B8 SIGMA 0x3ddc0c2c XOR
      9B9 SIGMA -> EAX BOOTUP_JUMP JFPUOK
      0x303, aile 3, model 0 ve stepping ID 3 anlamına geliyor
  • Bunu çözmek için gereken kara kutu analizi inanılmaz derecede zor, ama başarıldığında çok eğlenceli ve çok tatmin edici olmalı

  • Böyle yazıları anlayabilmek için üniversitede zor dersler almış olmaktan memnunum; 2015 civarında HN'in bu tür düşünmeyi teşvik etmesi de hoşuma gitmişti
    Şimdi düşük seviye programlama bilgisini çok sık kullanmasam da, böyle yazılar okuduğumda bilincimin zenginleştiğini hissetmek güzel
    Üniversiteye erişimi zor olanlara nand2tetris.org'u tavsiye ederim

    • Kapılardan başlayıp doğrudan bir mikroişlemci yapmak, mikro kod tasarımını ve işlemcinin nasıl çalıştığını anlamanın daha kolay bir yolu
      RISC ya da Transputer gibi basit eski tasarımları incelemek de yardımcı olur; 80386 ise bu yelpazenin öbür ucunda yer alıyor
      Çünkü eski kötü tasarımları ve geriye dönük uyumluluğu korumaya çalışırken gereksiz yere karmaşık hale geldi
      Çip tasarımı öğrenmek için ille de üniversite gerekmez; birkaç Alan Kay konuşması izlemek ya da Bitsavers'daki bilgisayar tasarımı belgelerine göz atmak da iyi bir başlangıç olur
      FPGA'den daha kolay bir yöntemle kapı seviyesinde tasarımı simüle edip 2026 itibarıyla 200 doların altında maliyetle bunu çip üzerindeki transistörlere dönüştüren Morphle Logic'i yaptım
      Bu sonunda daha büyük, daha hızlı ve daha ucuz wafer ölçekli süperbilgisayar entegrasyonuna yol açabilir
      https://github.com/fiberhood/MorphleLogic/blob/main/README_M...
      https://www.youtube.com/watch?v=vbqKClBwFwI
      https://www.youtube.com/watch?v=f1605Zmwek8
      http://bitsavers.informatik.uni-stuttgart.de/pdf/xerox/alto/...
    • nand2tetris'i birkaç kez yaptım ama tüm soyutlama seviyelerinde sadeliği vurguladığı için mikro kod gibi şeyleri atlıyor
      Bu sadeliğin kendisi harika bir ders ve bana çok ilham verdi, ama 1990'lardaki üniversite elektrik mühendisliği derslerim nand2tetris'e benzer şekilde 8086 tarzı CPU'ların nasıl yapıldığını işlerken mikro kodun nasıl çalıştığını da açıklıyordu
      İç program sayacı kontrol sözcüğü tablosunu takip ediyor ve her bit CPU'nun denetlenebilir parçalarını doğrudan düzenliyordu
      Herkes kendi simülatöründe tek bir komut uygulamıştı; ben DEC yani azaltma komutunu almıştım
      Bir bakıma nand2tetris'in komutlarının mikro kod olduğu da söylenebilir
      Çünkü komut bitleri donanımı doğrudan kontrol ediyor ve ilk bit iki komut türünden birini seçiyor; dolayısıyla komut başına yalnızca 1 kod adımı var
      Mikro kodda ise bir komut keyfi sayıda mikro kod adımına sahip olabilir
      Ben Eater'ın breadboard 8 bit CPU videolarında, komutun 4 bitlik opcode'u ile adım sayacı ROM'u indeksleyip kontrol sözcüğünü belirliyor
      Bu ROM, yeterince karmaşık mantık kapılarıyla da yapılabilecek bir bölümün yerini alıyor; elektronikle doğrudan uğraşıp sorun çözmek gerektiği için donanım tarafında bir sonraki adım olarak iyi
      Yalnız RAM'in sadece 16 bayt olması, nand2tetris'teki gibi daha yüksek soyutlama katmanları kurmayı zorlaştırdığı için biraz yazık
      O noktada ya daha iyi bir tasarımla baştan yapmak ya PCB'ye taşımak ya da zamanlayıcı, CPU, ROM, RAM, G/Ç, UART gibi şeyleri bir arada düşünmek için 6502 projelerine geçmek; ardından bunların zaten birleşik geldiği mikrodenetleyicilere yönelmek mümkün
      Mantık kapılarıyla CPU yapımını okumak isterseniz Charles Petzold'un Code kitabı yavaş anlatımlı ve yakın zamanda gözden geçirilmiş; Danny Hillis'in Pattern on the Stone'u ise daha hızlı ilerliyor
      Code'un 2. baskısı, 4 bitlik bir çevrim sayacı ve her çevrimin ne yapacağını belirleyen hardwired mantık kapıları kullanıyor; ayrıca bazı mantıklar için diyot dizileri kullanıyor, bunun da mikro kod sayılıp sayılmayacağını merak ediyorum
    • nand2tetris'in mikro kodu ele alıp almadığını ya da kullanıp kullanmadığını merak ediyorum