1 poin oleh GN⁺ 2024-07-11 | 1 komentar | Bagikan ke WhatsApp

Hal-hal aneh yang dipelajari saat menulis emulator x86

  • Menjelaskan berbagai trivia dan keanehan yang dipelajari saat menulis emulator x86 dan amd64
  • Dalam Time Travel Debugging(TTD), emulator CPU digunakan untuk merekam eksekusi proses pada level instruksi
  • Versi pertama TTD disebut iDNA, ditulis dalam assembly, cepat tetapi sulit dirawat
  • Versi kedua ditulis dalam C++, sehingga kemudahan pemeliharaannya meningkat

Trivia encoding x86 yang tidak berguna

  • Skema encoding x86 memungkinkan instruksi yang sama di-encode dengan berbagai cara
  • Instruksi int 3 dapat di-encode sebagai CD 03 atau CC
  • Register EAX disebut "register akumulator", dan memang memiliki perbedaan dalam encoding
  • Prefiks REX memungkinkan akses ke rentang register yang lebih luas dalam kode 64-bit
  • Panjang instruksi bisa mencapai maksimum 15 byte, dan jika melebihinya akan terjadi exception
  • Prefiks address override memungkinkan referensi alamat 32-bit dalam mode 64-bit

Karakteristik flag yang aneh

  • Instruksi INC tidak memperbarui carry flag, berbeda dengan instruksi ADD
  • Instruksi CMPXCHG8B/CMPXCHG16B hanya memodifikasi zero flag
  • Instruksi shift dan rotate membiarkan overflow flag dalam keadaan tidak terdefinisi bila jumlah shift lebih besar dari 1

Lebih banyak kejutan dari instruksi shift

  • shr ax, 10h menggeser register ax sejauh 16 bit sehingga menjadi 0
  • shr eax, 20h menggeser register eax sejauh 32 bit tetapi nilainya tidak berubah
  • Jumlah shift dimasking dengan 1FH

Segment override

  • Segmen masih digunakan dalam kode 32-bit dan 64-bit, terutama untuk thread-local storage
  • Di Windows, register FS atau GS digunakan untuk mereferensikan TEB(Thread Execution Block)
  • Pada proses 32-bit digunakan FS, dan pada proses 64-bit digunakan GS
  • Dalam mode 64-bit, nilai register segmen tidak penting

Segment override: lebih banyak trivia

  • Dalam mode 32-bit, nilai aktual register segmen mereferensikan segment descriptor
  • Dalam mode 64-bit, base dikendalikan oleh MSR
  • Di WinDbg, nilai segmen proses 64-bit tidak bisa dibaca secara langsung

Kesimpulan

  • Artikel ini memberikan daftar acak trivia x86
  • Menulis emulator membantu memahami secara mendalam bagaimana CPU bekerja
  • Sumber daya yang sangat bagus dapat ditemukan di situs web Agner Fog

Ringkasan GN⁺

  • Menjelaskan berbagai trivia dan keanehan yang dipelajari saat menulis emulator x86 dan amd64
  • Menulis emulator membantu memahami secara mendalam cara kerja CPU
  • Membahas berbagai trivia seperti beragam cara encoding instruksi int 3, prefiks REX, dan segment override
  • Lebih banyak sumber daya tersedia di situs web Agner Fog

1 komentar

 
GN⁺ 2024-07-11
Komentar Hacker News
  • Intel SDM secara eksplisit menyatakan bahwa untuk instruksi BSF/BSR, jika input bernilai 0 maka nilai tujuan tidak terdefinisi. AMD mendokumentasikan bahwa dalam kasus ini tujuan tidak dimodifikasi
    • glibc menggunakan fakta tidak resmi bahwa di Intel tujuan juga tidak dimodifikasi
    • TZCNT/LZCNT adalah bentuk BSF/BSR yang diberi prefiks F3, yang diabaikan pada prosesor lama. Kode yang sama bisa berperilaku berbeda di CPU yang berbeda
  • Ada banyak keluhan tentang prefiks, tetapi itu bukan masalah terbesar. Bit ekstensi REX/VEX/EVEX.RXB diabaikan saat tidak diterapkan
    • APX memiliki prefiks REX2 yang dapat mengenkode register r16-r31, tetapi tidak bisa untuk xmm16-xmm31
    • Prefiks EVEX memiliki layout yang berbeda tergantung opcode
    • Penggunaan bit ekstensi berbeda tergantung jenis register
  • Pendapat dari seseorang yang menikmati coding assembly. Menyukai kualitas estetika yang sederhana dan vertikal
    • Berbagi pengalaman menulis mini VM untuk membantu temannya yang memakai JS memahami stack
    • Menyebut bahwa temannya sibuk dengan pengembangan web sehingga tidak punya waktu untuk belajar secara mendalam
  • Salah ingat bahwa varian Salsa20 dan machine code ada di cryp.to. Situs Dan Berstein adalah cr.yp.to
    • Berbagi pengalaman menguji berbagai implementasi saat mengerjakan enkripsi data di sebuah startup
  • Merekomendasikan Justine Tunney dan emulatornya. Dokumentasinya menjelaskan dengan baik cara kerja CPU
  • Tidak setuju dengan pendapat bahwa menulis emulator CPU adalah cara terbaik untuk memahami CPU
    • Membuat CPU di level gerbang adalah cara yang lebih baik
  • Tidak setuju dengan pendapat bahwa assembly x86 menimbulkan lebih banyak masalah daripada RISC
    • x86 mudah dianalisis, tetapi MIPS sulit
  • Menyampaikan rasa hormat kepada pengembang emulator prosesor x86
    • Saat mengembangkan emulator i386, banyak belajar tentang system call dan ELF
  • Berbagi pengalaman menulis emulator x86
    • Mengenang pengalaman menulis emulator mainan yang menjalankan kode BIOS awal
  • Berbagi pendapat bahwa mereka menyukai gaya dan layout blog