- 80386 माइक्रोकोड ROM 94,720 बिट का है, जो 8086 के 10,752 बिट से कहीं बड़ा है, इसलिए इमेज कन्वर्ज़न और वेरिफिकेशन काफ़ी कठिन था
- हाई-रिज़ॉल्यूशन die images से image processing, neural networks, और human-assisted automation को मिलाकर कुछ ही दिनों में binary blob निकाला गया और cross-validation किया गया
- रिवर्स डिसअसेंबली के दौरान μ-op array, bit fields, instruction end patterns, instruction decoder, और protection test PLA की संरचना धीरे-धीरे सामने आई
- 80386 में हर instruction के लिए microcode मौजूद है, और कई routines algorithm की बजाय multiplication·division hardware और barrel shifter settings को नियंत्रित करती हैं
- protected mode के IO permission bitmap handling में एक संभावित flaw मिला, जहाँ 4-byte port access पर लगता है कि सिर्फ़ शुरुआती 3 addresses की जाँच होती है, लेकिन यह अभी पुष्टि नहीं हुई है
80386 माइक्रोकोड निष्कर्षण और रिवर्स डिसअसेंबली
- 8086 माइक्रोकोड रिवर्स डिसअसेंबली के बाद Ken Shirriff ने 80386 के microcode ROM की high-resolution images उपलब्ध कराईं, लेकिन 80386 ROM 94,720 बिट का होने के कारण, जो 8086 के 10,752 बिट से बहुत बड़ा है, उसका conversion और verification काफ़ी ज़्यादा कठिन था
- 8086 के लिए ऐसे patents थे जिनमें पूरी संरचना और कुछ code fragments शामिल थे, इसलिए खोज के संकेत मिल जाते थे, लेकिन 80386 लगभग एक complete black box जैसा था, जिससे बड़े binary blob के भीतर संरचना ढूँढना मुश्किल था
- Discord पर GloriousCow, Smartest Blob और अन्य लोगों ने 80386 die की high-resolution images से microcode निकालने का काम जारी रखा, और image → binary → समझ में आने वाले microcode में बदलने की प्रक्रिया सबसे बड़ी चुनौती थी
- image processing, neural networks, और human-assisted automation को मिलाकर कुछ ही दिनों में image से binary blob निकाला गया और cross-validation किया गया
रिवर्स डिसअसेंबली के दौरान सामने आई संरचना
- binary extraction के बाद भी रिवर्स डिसअसेंबली आसान नहीं थी, और कई patterns मिलाकर यह समझा गया कि पुनर्व्यवस्था ऐसी है जिसमें एक axis पर μ-op और दूसरी axis पर μ-op bits आते हैं
- एक किनारे पर unused μ-op blocks मिले, जिससे μ-op पढ़ने के क्रम का पता लगाने में मदद मिली
- μ-op bits को कई fields में बाँटने की प्रक्रिया में 8086 microcode पर काम के अनुभव के आधार पर source register और destination register fields पहचाने गए
- 80386, ALU operations को 2 cycles में कर सकता है, इसलिए पहले cycle में दो operands को ALU में लोड करने और दूसरे cycle में result को destination तक भेजने के लिए ALU के दूसरे input को निर्दिष्ट करने वाला field ज़रूरी था
- बार-बार दिखने वाले patterns को instruction के अंत का संकेत माना गया, और बाद में यह सही साबित हुआ
- Ken ने 80386 die की कई wires और logic bits को trace करके internal connections को समझने में योगदान दिया, और नई पहचानी गई संरचना ने उन्हीं components का उपयोग करने वाले दूसरे microcode fragments की व्याख्या करने में मदद की
- microcode के साथ-साथ कई छोटे PLA से बने instruction decoder और protection test PLA को भी decode किया गया, जिससे 386 instructions को microcode fragments से जोड़ा जा सका
8086 से अलग 80386 का execution मॉडल
- 80386 ज़्यादातर instructions में 8086 की तुलना में प्रति cycle बहुत तेज़ है, और इसके लिए अधिक transistors का उपयोग किया गया
- 8086 में जिन कई algorithms को microcode में लागू किया जाता था, 80386 में उन्हें व्यवहारतः hardware accelerators संभालते हैं
- 80386 microcode का बड़ा हिस्सा algorithm खुद चलाने की बजाय multiplication·division hardware, barrel shifter, और protection test unit जैसे accelerators को configure करने का काम करता है
- रिवर्स डिसअसेंबली के काम का बड़ा हिस्सा इन accelerator interfaces और microcode के बीच संबंध समझने में लगा
माइक्रोकोड entry और instruction processing
- decoding ROM से आने वाले microcode entry points की संख्या 215 है, जो 8086 के 60 से काफ़ी अधिक है
- entries की यह बढ़ोतरी सिर्फ़ नए instructions की वजह से नहीं है, बल्कि इसलिए भी है कि वही instruction अलग-अलग routines से संभाला जाता है, इस आधार पर कि operand register है या memory, CPU real mode में है या protected mode में, और REP prefix इस्तेमाल हो रहा है या नहीं
- सभी entries की सूची
fields.txt फ़ाइल में है, जिसमें subroutines और shared code भी शामिल हैं
- कई high-level microcode routines बहुत कम काम करने के बाद उन routines पर jump कर जाती हैं जो दूसरे entry points के साथ shared होती हैं, इसलिए सिर्फ़ ऊपर की routine के आकार से उसका अर्थ समझना मुश्किल है
- instruction decoder routine चुनने में सिर्फ़ opcode का उपयोग नहीं करता, इसलिए हर entry point किन opcodes को संभालता है, सिर्फ़ इससे भी पूरी संरचना समझाना कठिन है
सभी instructions microcode से संभाले जाते हैं
- 80386, 8086 या आधुनिक CPUs के विपरीत, हमेशा μ-op execute करता है, और हर instruction के लिए उसके अनुरूप microcode मौजूद है
- ऐसा कोई instruction नहीं मिला जो microcode के बिना संभाला जाता हो
unused code और exception handling के संकेत
0x849 से 0x856 तक की routines को microcode रिवर्स डिसअसेंबली में unused? के रूप में चिह्नित किया गया है, और इनके लिए कोई linked entry point नहीं दिखता
- इन routines का सटीक काम पूरी तरह निश्चित नहीं है, लेकिन इनमें
0x8e9 से 0x8f5 तक की #PF(PAGE_FAULT) routines से कई समानताएँ हैं
- दोनों routines paging unit का आख़िरी error code सेट करने के बाद interrupt 0x0e पर जाती हैं
- अंतर यह है कि यह routine fault linear address की बजाय paging unit से आए किसी अज्ञात मान को
CR2 में सेट करती दिखती है
- बाकी microcode CPU के documented behavior को लागू करने के लिए बना लगता है, जबकि low-level debugging के लिए ICE(In-Circuit Emulator) hardware से interaction करने वाली routines undocumented behavior से संबंधित हैं
छिपी हुई functionality और संभावित IO permission bitmap flaw
- अभी इसे वास्तविक 386 machine पर test नहीं किया गया है, इसलिए पुष्टि नहीं की जा सकती, लेकिन protected mode OS के कुछ हिस्सों में user mode process को सीमित IO port access देने के लिए उपयोग होने वाले IO permission bitmap handling में flaw की संभावना दिखती है
- 4-byte port access होने पर microcode ऐसा लगता है जैसे वह सिर्फ़ शुरुआती 3 addresses के permission bits की जाँच करता है
- अगर कोई process उन IO port ranges की सीमा पर ऐसा access करे जिनके लिए उसके पास permission है, तो आख़िरी byte access ग़लती से सफल हो सकता है और OS की मंशा के बिना user access किसी hardware register तक पहुँच सकता है
- यह bug बहुत असामान्य स्थिति में ही सामने आता, इसलिए microcode रिवर्स डिसअसेंबली के बिना शायद छूट जाता, लेकिन 40 साल से अधिक समय से व्यापक रूप से इस्तेमाल हुए hardware में ऐसा security bug पहले न मिलना असामान्य है
- यह behavior शायद सिर्फ़ कुछ CPU versions में रहा हो सकता है, या routine की व्याख्या ग़लत हो और वास्तविक व्यवहार सही हो सकता है
- यह microcode 80386 के शुरुआती versions का नहीं लगता, और
XBTS तथा IBTS instructions के traces decoder को छोड़कर कहीं नहीं मिलते
सीखने की सामग्री और डाउनलोड स्थान
1 टिप्पणियां
Hacker News टिप्पणियाँ
जिज्ञासा है कि हाई-रेज़ोल्यूशन die image से माइक्रोकोड को कैसे पुनर्स्थापित किया जा सकता है
यह प्रक्रिया क्या हर transistor की पहचान करके circuit को model करती है, और क्या इसका परिणाम Verilog जैसे किसी रूप में आता है, यह भी जानना चाहूँगा
उसके बाद 0 और 1 को वर्गीकृत किया गया; 1 को transistor की मौजूदगी और polysilicon के gap से दृश्य रूप से पहचाना जा सकता था
Intel microcode की प्रकृति के कारण यह मानना संभव था कि 0 बहुत अधिक होंगे, इसलिए जहाँ transistor था उसे 1 माना गया
color threshold से automatic processing करने वाले tools भी हैं, लेकिन mosaic के कुछ हिस्से धुंधले थे और उनमें धूल आ गई थी, जिससे fake 1-bit बहुत बन रहे थे और तरीका ठीक नहीं बैठा
इसकी जगह convolutional neural network को इस तरह train किया गया कि वह निकाले गए bit क्षेत्रों को 0/1 में classify करे, और नतीजों को मूल mosaic पर 50% opacity वाले सफेद/काले rectangles से ढककर verify किया गया
उसके बाद कई दिनों तक उबाऊ तरीके से errors की जाँच की गई, और अंत में raw 2D bit array मिला; अगला कदम उस array से microcode words निकालना है
https://youtu.be/HwEdqAb2l50?si=VFLed64PZvpCHfy1
“ऊपर की तस्वीर microcode ROM के एक हिस्से को दिखाती है। microscope से देखने पर microcode ROM की सामग्री दिखाई देती है, और हर स्थान पर transistor है या नहीं, इसके आधार पर bit पढ़े जा सकते हैं”
https://www.righto.com/2020/06/a-look-at-die-of-8086-process...
संबंधित प्रगति पर चल रही thread: z386: An Open-Source 80386 Built Around Original Microcode - https://news.ycombinator.com/item?id=48248014 - मई 2026, 22 टिप्पणियाँ
कुछ दिन पहले जब reenigne का blog देखा था, तो लगा था, “हूँ, 2020 के बाद कोई पोस्ट नहीं है,” इसलिए इसका फिर से सक्रिय होना अच्छा लगा
यह भी खास तौर पर दिलचस्प है कि blog 33 साल पहले तक पीछे जाता है
microprogramming को बुनियाद से समझाने वाली एक अच्छी किताब: https://www.amazon.com/Computation-Structures-Optical-Electr...
इसका free PDF भी आसानी से मिल जाता है
इस microcode को reverse engineering करने में लगी मेहनत प्रभावशाली है, और यह 386 architecture में गहराई तक उतरने वाला शानदार लेख है
वास्तविक microcode implementation देखने पर यह कम रहस्यमय लगता है कि पुराने processors जटिल operations को कैसे संभालते थे
386 के 22 साल के production काल में कई छोटे बदलाव हुए थे, इसलिए यह जानना महत्वपूर्ण है कि यह code किस 386 revision से आया है
9B5 BIST1 -> TMPD 0x0303 PASS29B6 SIGMA -> EDX9B7 BIST2 -> TMPE TMPD XOR9B8 SIGMA 0x3ddc0c2c XOR9B9 SIGMA -> EAX BOOTUP_JUMP JFPUOK0x303का मतलब family 3, model 0, stepping ID 3 हैइसे decode करने के लिए ज़रूरी black-box analysis बेहद कठिन है, लेकिन सफल होने पर यह बहुत मज़ेदार और संतोषजनक होगा
ऐसे लेखों को समझने की कोशिश के लिए कॉलेज में कठिन विषय पढ़े थे, यह सोचकर संतोष होता है, और 2015 के समय HN ने ऐसी सोच को उकसाया था, यह भी अच्छा लगता है
अब भले low-level programming का ज्ञान ज़्यादा इस्तेमाल न करता हूँ, फिर भी ऐसे लेख पढ़ते समय लगता है कि चेतना समृद्ध हो रही है
जिन लोगों के लिए विश्वविद्यालय तक पहुँचना आसान नहीं है, उनके लिए nand2tetris.org की सिफारिश है
RISC या Transputer जैसे पुराने, सरल designs का अध्ययन भी मददगार है, और 80386 इस spectrum के बिलकुल दूसरी तरफ है
ऐसा इसलिए क्योंकि पुराने खराब designs और backward compatibility को बनाए रखने की कोशिश में यह अनावश्यक रूप से जटिल हो गया
chip design सीखने के लिए विश्वविद्यालय अनिवार्य नहीं है; Alan Kay के कुछ lectures देखना या Bitsavers पर computer design सामग्री खंगालना भी अच्छी शुरुआत हो सकती है
मैंने Morphle Logic बनाया है, जो FPGA की तुलना में आसान तरीके से gate-level designs का simulation करता है और 2026 के हिसाब से 200 डॉलर से कम में उन्हें chip पर transistors में बदल देता है
अंततः यह बड़े, तेज़ और सस्ते wafer-scale supercomputer integration तक जा सकता है
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/...
वह सादगी अपने-आप में शानदार सीख है और बहुत प्रेरणादायक भी, लेकिन 1990 के दशक में कॉलेज में पढ़ी electrical engineering classes nand2tetris जैसी ही थीं; वे 8086-प्रकार के CPU कैसे बनते हैं यह भी दिखाती थीं और microcode के काम करने का तरीका भी समझाती थीं
आंतरिक program counter control word table का पीछा करता था, और हर bit सीधे CPU के नियंत्रित हिस्सों को समन्वित करता था
हर छात्र ने अपने simulator में एक instruction implement किया था; मैंने DEC, यानी decrement instruction, लिया था
एक अर्थ में nand2tetris की instructions को भी microcode कहा जा सकता है
instruction bits सीधे hardware को control करते हैं और पहला bit दो तरह की instructions में से चुनता है, इसलिए हर instruction के लिए code step सिर्फ 1 होता है
इसके विपरीत microcode में एक instruction के लिए microcode steps की संख्या मनमानी हो सकती है
Ben Eater के breadboard 8-bit CPU वीडियो में instruction के 4-bit opcode और step counter से ROM को index करके control word तय किया जाता है
यह ROM उस हिस्से की जगह लेता है जिसे पर्याप्त जटिल logic gates से भी बनाया जा सकता है, और क्योंकि इसमें electronic circuits को हाथ से छूना और समस्याएँ सुलझाना पड़ता है, यह hardware की दिशा में अगला अच्छा कदम है
हालाँकि, RAM सिर्फ 16 bytes होने से nand2tetris की तरह ऊँचे abstraction layers बनाना मुश्किल हो जाता है, यह थोड़ी कमी है
उस बिंदु पर या तो इसे बेहतर design के साथ फिर से बनाया जा सकता है, या PCB पर ले जाया जा सकता है, या 6502 project पर बढ़ा जा सकता है जहाँ timer, CPU, ROM, RAM, I/O, UART आदि को एक साथ सोचने का मौका मिलता है, और फिर ऐसे microcontroller की ओर बढ़ा जा सकता है जिनमें ये सब पहले से एकीकृत होते हैं
अगर logic gates से CPU बनाने के बारे में पढ़ना हो, तो Charles Petzold की Code धीमी रफ़्तार से समझाती है और हाल ही में संशोधित हुई है, जबकि Danny Hillis की Pattern on the Stone तेज़ी से आगे बढ़ती है
Code के दूसरे edition में 4-bit cycle counter और hardwired logic gates से हर cycle की क्रिया तय होती है, और कुछ logic में diode arrays का उपयोग होता है; यह भी microcode माना जाए या नहीं, यह जिज्ञासा है