- ROM mikrokode 80386 berukuran 94.720 bit, jauh lebih besar daripada 10.752 bit milik 8086, sehingga konversi dan verifikasi gambar menjadi jauh lebih rumit
- Dari gambar die beresolusi tinggi, dilakukan ekstraksi dan verifikasi silang atas blob biner hanya dalam beberapa hari dengan menggabungkan pemrosesan citra, jaringan saraf, dan otomasi berbantuan manusia
- Dalam proses disassembly balik, susunan μ-op, field bit, pola akhir instruksi, serta struktur decoder instruksi dan PLA uji proteksi terungkap secara bertahap
- 80386 memiliki mikrokode untuk semua instruksi, dan banyak rutinnya bertugas mengatur perangkat keras perkalian/pembagian serta barrel shifter, bukan mengimplementasikan algoritme itu sendiri
- Ditemukan potensi cacat pada penanganan bitmap izin IO di protected mode, yang tampaknya hanya memeriksa 3 alamat pertama saat akses port 4-byte, meski hal ini belum dipastikan
Ekstraksi dan disassembly balik mikrokode 80386
- Setelah disassembly balik mikrokode 8086, Ken Shirriff menyediakan gambar beresolusi tinggi dari ROM mikrokode 80386, tetapi ROM 80386 berukuran 94.720 bit, jauh lebih besar daripada 10.752 bit milik 8086, sehingga konversi dan verifikasinya jauh lebih sulit
- 8086 memiliki paten yang memuat keseluruhan struktur dan sebagian potongan kode, sehingga ada petunjuk untuk pencarian, tetapi 80386 nyaris merupakan kotak hitam sepenuhnya, sehingga sulit menemukan struktur di dalam gumpalan biner besar
- Di Discord, GloriousCow, Smartest Blob, dan lainnya melanjutkan pekerjaan mengekstrak mikrokode dari gambar beresolusi tinggi die 80386, dan tantangan utamanya adalah mengubah gambar → biner → mikrokode yang dapat dipahami
- Dengan menggabungkan pemrosesan citra, jaringan saraf, dan otomasi berbantuan manusia, mereka mengekstrak blob biner dari gambar dalam beberapa hari dan memverifikasinya secara silang
Struktur yang terungkap selama proses disassembly balik
- Bahkan setelah ekstraksi biner, disassembly balik tetap tidak mudah, dan dengan mencocokkan berbagai pola, akhirnya dipahami metode penyusunan ulang sehingga pada satu sumbu terdapat μ-op, dan pada sumbu lainnya terdapat bit μ-op
- Adanya blok μ-op yang tidak digunakan di salah satu ujung menjadi petunjuk untuk memahami urutan pembacaan μ-op
- Dalam proses membagi bit μ-op ke beberapa field, pengalaman dari pekerjaan mikrokode 8086 digunakan untuk menemukan field register sumber dan register tujuan
- Karena 80386 dapat menjalankan operasi ALU dalam 2 siklus, diperlukan field yang menentukan masukan kedua ALU agar dua operan dimuat ke ALU pada siklus pertama, lalu hasilnya dikirim ke tujuan pada siklus kedua
- Pola yang muncul berulang kali diduga menandakan akhir instruksi, dan kemudian terbukti memang benar
- Ken membantu memahami cara koneksi internal dengan menelusuri berbagai jalur dan bit logika pada die 80386, dan struktur yang baru terungkap menjadi petunjuk untuk menafsirkan potongan mikrokode lain yang memakai komponen yang sama
- Bersama mikrokode, decoder instruksi yang terdiri dari beberapa PLA kecil dan PLA uji proteksi juga berhasil diuraikan, sehingga instruksi 386 dapat dipetakan ke potongan mikrokode
Cara eksekusi 80386 yang berbeda dari 8086
- 80386 jauh lebih cepat per siklus dibanding 8086 untuk sebagian besar instruksi, dan untuk itu menggunakan lebih banyak transistor
- Berbagai algoritme yang diimplementasikan dengan mikrokode pada 8086 pada praktiknya ditangani oleh akselerator perangkat keras di 80386
- Sebagian besar mikrokode 80386 berfungsi mengatur akselerator seperti perangkat keras perkalian/pembagian, barrel shifter, dan unit uji proteksi, alih-alih algoritmenya sendiri
- Porsi besar dari pekerjaan disassembly balik adalah memahami cara antarmuka akselerator ini terhubung dengan mikrokode
Entri mikrokode dan pemrosesan instruksi
- Titik masuk mikrokode dari ROM decoding berjumlah 215, meningkat besar dari 60 pada 8086
- Peningkatan jumlah entri bukan hanya karena instruksi baru, tetapi juga karena instruksi yang sama diproses oleh rutin berbeda tergantung apakah operannya register atau memori, apakah CPU berada di real mode atau protected mode, dan apakah prefiks REP sedang digunakan
- Daftar lengkap semua entri ada di file
fields.txt, bersama subrutin dan kode bersama
- Banyak rutin mikrokode tingkat atas hanya melakukan sedikit pekerjaan lalu melompat ke rutin yang dibagikan dengan titik masuk lain, sehingga maknanya sulit dipahami hanya dari ukuran rutin tingkat atas
- Karena decoder instruksi tidak hanya memakai opcode untuk menentukan rutin yang dipakai, struktur ini juga sulit dijelaskan hanya dari jumlah opcode yang ditangani tiap titik masuk
Semua instruksi diproses oleh mikrokode
- Tidak seperti 8086 atau CPU modern, 80386 selalu mengeksekusi μ-op, dan ada mikrokode yang sesuai untuk setiap instruksi
- Dipastikan tidak ada instruksi yang tidak diproses oleh mikrokode
Jejak kode yang tidak digunakan dan penanganan pengecualian
- Rutin dari
0x849 hingga 0x856 ditandai sebagai unused? dalam disassembly balik mikrokode, dan tampaknya tidak memiliki titik masuk yang terhubung
- Perilaku tepat dari rutin ini belum sepenuhnya pasti, tetapi memiliki banyak kesamaan dengan rutin
#PF(PAGE_FAULT) dari 0x8e9 hingga 0x8f5
- Kedua rutin sama-sama mengatur kode kesalahan terakhir pada paging unit lalu berlanjut ke interrupt 0x0e
- Perbedaannya adalah rutin ini tampaknya menuliskan nilai tak dikenal dari paging unit ke
CR2, alih-alih fault linear address
- Selebihnya, mikrokode tampak dirancang untuk mengimplementasikan perilaku CPU yang terdokumentasi, sementara rutin yang berinteraksi dengan perangkat keras ICE (In-Circuit Emulator) untuk debugging tingkat rendah termasuk perilaku yang tidak terdokumentasi
Fitur tersembunyi dan kemungkinan cacat pada bitmap izin IO
- Meski belum bisa dipastikan karena belum diuji pada mesin 386 nyata, ada kemungkinan cacat pada penanganan bitmap izin IO yang digunakan oleh sebagian OS protected mode untuk mengizinkan akses terbatas ke port IO bagi proses mode pengguna
- Saat terjadi akses port 4-byte, mikrokode tampaknya hanya memeriksa bit izin untuk 3 alamat pertama
- Jika sebuah proses melakukan akses seperti ini di batas ruang port IO yang diizinkan, akses byte terakhir bisa berhasil secara keliru dan memungkinkan OS menyentuh register perangkat keras yang sebenarnya tidak dimaksudkan untuk diakses pengguna
- Bug ini sangat tidak biasa sehingga mungkin terlewat tanpa disassembly balik mikrokode, tetapi tetap luar biasa bahwa bug keamanan pada perangkat keras yang telah digunakan luas lebih dari 40 tahun belum pernah ditemukan
- Perilaku ini mungkin hanya ada pada sebagian versi CPU, atau bisa juga interpretasi terhadap rutin ini keliru sehingga pada kenyataannya ia bekerja dengan benar
- Mikrokode ini tampaknya bukan milik versi awal 80386, dan instruksi
XBTS serta IBTS tidak meninggalkan jejak selain pada decoder
Materi pembelajaran dan lokasi unduhan
1 komentar
Komentar Hacker News
Penasaran bagaimana gambar die beresolusi tinggi bisa dipakai untuk memulihkan microcode
Ingin tahu apakah prosesnya memodelkan rangkaian dengan mengenali setiap transistor, dan apakah hasil akhirnya berbentuk seperti Verilog
Setelah itu 0 dan 1 diklasifikasikan; 1 bisa dibedakan secara visual lewat keberadaan transistor dan celah pada polysilicon
Karena sifat microcode Intel memungkinkan asumsi bahwa jumlah 0 jauh lebih banyak, jika ada transistor maka dianggap sebagai 1
Ada juga alat yang mengotomatisasi ini lewat ambang warna, tetapi sebagian mosaik buram dan ada debu sehingga muncul banyak bit 1 palsu, jadi hasilnya kurang cocok
Sebagai gantinya, sebuah convolutional neural network dilatih untuk mengklasifikasikan area bit yang diekstrak menjadi 0/1, lalu hasilnya dicek dengan menimpa mosaik asli memakai persegi panjang putih/hitam dengan opasitas 50%
Setelah itu beberapa hari dihabiskan secara membosankan untuk meninjau kesalahan, dan akhirnya didapat array bit 2D mentah; langkah berikutnya adalah mengekstrak word microcode dari array tersebut
https://youtu.be/HwEdqAb2l50?si=VFLed64PZvpCHfy1
“Foto di atas menunjukkan sebagian dari ROM microcode. Jika dilihat lewat mikroskop, isi ROM microcode terlihat, dan bit dapat dibaca berdasarkan ada atau tidaknya transistor di tiap lokasi”
https://www.righto.com/2020/06/a-look-at-die-of-8086-process...
Thread terkait yang sedang berjalan: z386: An Open-Source 80386 Built Around Original Microcode - https://news.ycombinator.com/item?id=48248014 - Mei 2026, 22 komentar
Beberapa hari lalu saat memeriksa blog reenigne, kesan saya “hmm, tidak ada tulisan sejak 2020”, jadi senang melihatnya aktif lagi
Sangat menarik juga bahwa blog itu menelusuri kembali sampai 33 tahun lalu
Buku bagus yang menjelaskan microprogramming dari dasar: https://www.amazon.com/Computation-Structures-Optical-Electr...
PDF gratisnya juga mudah ditemukan
Upaya yang dibutuhkan untuk merekayasa balik microcode ini sangat mengesankan, dan ini tulisan hebat yang menggali arsitektur 386 secara mendalam
Saat melihat implementasi microcode yang sebenarnya, cara prosesor lama menangani operasi kompleks terasa jadi tidak terlalu misterius
386 mengalami banyak perubahan kecil selama 22 tahun masa produksinya, jadi penting untuk tahu dari revisi 386 mana kode ini berasal
9B5 BIST1 -> TMPD 0x0303 PASS29B6 SIGMA -> EDX9B7 BIST2 -> TMPE TMPD XOR9B8 SIGMA 0x3ddc0c2c XOR9B9 SIGMA -> EAX BOOTUP_JUMP JFPUOK0x303berarti family 3, model 0, stepping ID 3Analisis black-box yang diperlukan untuk menguraikan ini luar biasa sulit, tetapi jika berhasil rasanya pasti sangat menyenangkan dan memuaskan
Rasanya memuaskan bahwa saya mengambil mata kuliah sulit di universitas untuk bisa memahami tulisan seperti ini, dan bagus juga bahwa HN pada 2015 mendorong cara berpikir seperti itu
Sekarang pun, meski pengetahuan pemrograman level rendah tidak banyak saya pakai, setiap kali membaca tulisan seperti ini rasanya kesadaran saya jadi lebih kaya
Bagi yang sulit mengakses pendidikan universitas, saya merekomendasikan nand2tetris.org
Mempelajari desain lama yang sederhana seperti RISC atau Transputer juga membantu, dan 80386 ada di sisi berlawanan dari spektrum itu
Itu karena ia menjadi rumit secara tidak perlu demi mempertahankan desain lama yang buruk dan kompatibilitas ke belakang
Untuk belajar desain chip, universitas tidak mutlak diperlukan; menonton beberapa kuliah Alan Kay atau menelusuri desain komputer di Bitsavers juga bisa jadi awal yang bagus
Saya membuat Morphle Logic untuk mensimulasikan desain tingkat gerbang dengan cara yang lebih mudah daripada FPGA, dan pada 2026 bisa mengubahnya menjadi transistor di chip dengan biaya di bawah 200 dolar
Pada akhirnya ini bisa mengarah ke integrasi superkomputer skala wafer yang lebih besar, lebih cepat, dan lebih murah
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/...
Kesederhanaan itu sendiri adalah pelajaran yang sangat bagus dan memberi banyak inspirasi, tetapi kuliah teknik elektro yang saya ambil di kampus pada 1990-an, mirip dengan nand2tetris, membahas bagaimana CPU kelas 8086 dibuat sambil tetap menjelaskan cara kerja microcode
Program counter internal mengikuti tabel control word, dan tiap bit secara langsung mengatur bagian CPU yang bisa dikendalikan
Masing-masing dari kami mengimplementasikan satu instruksi di simulator, dan saya mendapat DEC, yaitu instruksi decrement
Dalam arti tertentu, instruksi di nand2tetris juga bisa dianggap sebagai microcode
Bit instruksinya langsung mengendalikan hardware, dan bit pertama memilih di antara dua jenis instruksi, sehingga tiap instruksi hanya punya 1 tahap kode
Sementara itu, pada microcode satu instruksi bisa memiliki jumlah tahap microcode yang sewenang-wenang
Dalam video CPU 8-bit breadboard Ben Eater, ROM diindeks memakai opcode 4-bit instruksi dan penghitung tahap untuk menentukan control word
ROM ini menggantikan bagian yang sebenarnya juga bisa dibuat dengan gerbang logika yang cukup kompleks, dan karena kita harus menyentuh rangkaian elektronik langsung serta memecahkan masalahnya, ini bagus sebagai langkah berikutnya ke sisi hardware
Hanya saja, karena RAM-nya cuma 16 byte, sulit membangun lapisan abstraksi yang lebih tinggi seperti nand2tetris
Pada titik itu Anda bisa membangunnya ulang dengan desain yang lebih baik, memindahkannya ke PCB, atau beralih ke proyek 6502 agar mulai memikirkan timer, CPU, ROM, RAM, I/O, UART, dan sebagainya sebagai satu kesatuan, lalu lanjut ke microcontroller yang memang sudah menggabungkan semuanya
Jika ingin membaca cara membuat CPU dari gerbang logika, Code karya Charles Petzold menjelaskannya dengan lambat dan baru direvisi, sedangkan The Pattern on the Stone karya Danny Hillis bergerak lebih cepat
Edisi kedua Code memakai penghitung siklus 4-bit dan gerbang logika hardwired untuk menentukan operasi tiap siklus, serta menggunakan array diode untuk sebagian logika; saya jadi penasaran apakah itu juga seharusnya dianggap sebagai microcode