1 पॉइंट द्वारा GN⁺ 2024-07-11 | 1 टिप्पणियां | WhatsApp पर शेयर करें

x86 emulator लिखते समय सीखी गई अजीब बातें

  • x86 और amd64 emulator लिखते समय सीखी गई तरह-तरह की trivia और अजीब बातों के बारे में बताया गया है
  • Time Travel Debugging(TTD) में CPU emulator का उपयोग करके process के execution को instruction स्तर पर रिकॉर्ड किया जाता है
  • TTD के पहले version को iDNA कहा जाता था, जो assembly code में लिखा गया था, इसलिए तेज़ था लेकिन उसका maintenance कठिन था
  • दूसरा version C++ में लिखा गया, जिससे maintainability बेहतर हुई

बेकार x86 encoding trivia

  • x86 encoding scheme में एक ही instruction को कई तरीकों से encode किया जा सकता है
  • int 3 instruction को CD 03 या CC के रूप में encode किया जा सकता है
  • EAX register को "accumulator register" कहा जाता है, और encoding में सचमुच इसका अलग व्यवहार होता है
  • REX prefix 64-bit code में registers की अधिक विस्तृत range तक पहुँचने देता है
  • instruction की लंबाई अधिकतम 15 bytes तक हो सकती है, और इससे ज़्यादा होने पर exception होता है
  • address override prefix 64-bit mode में 32-bit address को refer करने देता है

flags की अजीब विशेषताएँ

  • INC instruction, ADD instruction के विपरीत, carry flag को update नहीं करता
  • CMPXCHG8B/CMPXCHG16B instructions केवल zero flag को modify करते हैं
  • shift और rotate instructions में, यदि shift amount 1 से बड़ा हो, तो overflow flag undefined रहता है

shift instructions की और भी हैरानियाँ

  • shr ax, 10h ax register को 16-bit shift करके 0 बना देता है
  • shr eax, 20h eax register को 32-bit shift करता है, लेकिन value बदलती नहीं है
  • shift amount को 1FH से mask किया जाता है

segment override

  • segment अब भी 32-bit और 64-bit code में उपयोग होते हैं, मुख्यतः thread-local storage के लिए
  • Windows में FS या GS register का उपयोग करके TEB(Thread Execution Block) को refer किया जाता है
  • 32-bit process में FS का उपयोग होता है, और 64-bit process में GS का
  • 64-bit mode में segment register का value महत्वपूर्ण नहीं होता

segment override: और trivia

  • 32-bit mode में segment register का वास्तविक value segment descriptor को refer करता है
  • 64-bit mode में base को MSR द्वारा नियंत्रित किया जाता है
  • WinDbg में 64-bit process के segment value को सीधे नहीं पढ़ा जा सकता

निष्कर्ष

  • यह लेख x86 trivia की एक बेतरतीब सूची पेश करता है
  • emulator लिखना यह गहराई से समझने में मदद करता है कि CPU कैसे काम करता है
  • Agner Fog की website पर बेहतरीन resources देखे जा सकते हैं

GN⁺ का सार

  • x86 और amd64 emulator लिखते समय सीखी गई तरह-तरह की trivia और अजीब बातों को समझाया गया है
  • emulator लिखना CPU के काम करने के तरीके को गहराई से समझने में मदद करता है
  • int 3 instruction के अलग-अलग encoding तरीकों, REX prefix, segment override जैसी कई trivia को कवर किया गया है
  • Agner Fog की website पर और अधिक resources देखे जा सकते हैं

1 टिप्पणियां

 
GN⁺ 2024-07-11
Hacker News राय
  • Intel SDM में स्पष्ट किया गया है कि BSF/BSR निर्देशों में इनपुट 0 होने पर destination value undefined होती है। AMD ने दस्तावेज़ में बताया है कि इस स्थिति में destination बदला नहीं जाता
    • glibc Intel पर destination नहीं बदलने वाले इस अनौपचारिक तथ्य का उपयोग करता है
    • TZCNT/LZCNT, BSF/BSR पर F3 prefix लगे हुए रूप हैं, जिसे पुराने processors में अनदेखा किया जाता है। वही code अलग-अलग CPU पर अलग तरह से व्यवहार कर सकता है
  • Prefixes को लेकर बहुत शिकायतें हैं, लेकिन यह सबसे बड़ी समस्या नहीं है। REX/VEX/EVEX.RXB extension bits लागू न होने पर अनदेखे कर दिए जाते हैं
    • APX में REX2 prefix r16-r31 registers को encode कर सकता है, लेकिन xmm16-xmm31 को नहीं
    • EVEX prefix कई opcodes के अनुसार अलग layout रखता है
    • Register type के अनुसार extension bits का उपयोग बदलता है
  • Assembly coding का आनंद लेने वाले एक व्यक्ति की राय। वह इसकी सरल और vertical aesthetic quality का आनंद लेता है
    • JS वाले दोस्त को stack समझाने के लिए mini VM लिखने का अनुभव साझा किया
    • यह भी कहा कि दोस्त web development में व्यस्त है, इसलिए गहराई से पढ़ने का समय नहीं है
  • गलती से याद था कि Salsa20 variants और machine code cryp.to पर हैं। Dan Berstein की site असल में cr.yp.to है
    • Startup में data encryption से जुड़े काम के दौरान कई implementations test करने का अनुभव साझा किया
  • Justine Tunney और उनके emulator की सिफारिश की। उसका documentation CPU के काम करने का तरीका अच्छी तरह समझाता है
  • इस राय से असहमति कि CPU emulator लिखना CPU को समझने का सबसे अच्छा तरीका है
    • Gate level पर CPU बनाना इससे बेहतर तरीका है
  • इस राय से असहमति कि x86 assembly, RISC की तुलना में ज्यादा समस्याएँ पैदा करती है
    • x86 का analysis आसान है, लेकिन MIPS कठिन है
  • x86 processor emulator developers के प्रति सम्मान व्यक्त किया
    • i386 emulator बनाते समय system calls और ELF के बारे में बहुत कुछ सीखा
  • x86 emulator लिखने का अनुभव साझा किया
    • शुरुआती BIOS code चलाने वाला एक toy emulator लिखने का अनुभव याद किया
  • Blog style और layout पसंद आने की राय साझा की