80386 mikrokodu tersine disassemble edildi
(reenigne.org)- 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.txtdosyası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
0x849ile0x856arasındaki rutinler, mikrokod tersine disassembly'sindeunused?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
0x8e9ile0x8f5arası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;
XBTSveIBTSkomutlarının izine, çözücü dışında rastlanmıyor
Öğrenme kaynakları ve indirme konumu
- nand2mario'nun 80386 iç yapısına dair yazıları, tersine disassembly'yi anlamak için iyi bir başlangıç noktasıdır
- 80386 Multiplication and Division
- 80386 Barrel shifter
- 80386 Protection
- 80386 Memory Pipeline
- Tersine disassembly sonuçları, GitHub'daki x86 microcode deposundan indirilebilir
parts.txt, diğer dosyaların rolünü açıklar;microcode_10.txtise doğrudan mikrokod tersine disassembly'sinin kendisini içeren dosyadır
1 yorum
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
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
https://youtu.be/HwEdqAb2l50?si=VFLed64PZvpCHfy1
“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...
İ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ç
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
9B5 BIST1 -> TMPD 0x0303 PASS29B6 SIGMA -> EDX9B7 BIST2 -> TMPE TMPD XOR9B8 SIGMA 0x3ddc0c2c XOR9B9 SIGMA -> EAX BOOTUP_JUMP JFPUOK0x303, aile 3, model 0 ve stepping ID 3 anlamına geliyorBunu çö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
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/...
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