2 คะแนน โดย GN⁺ 2024-05-13 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

แนะนำ 6o6 ที่จำลองเสมือน CPU 6502 ด้วย CPU 6502 (และการออก The Incredible KIMplement 1.0)

  • ผู้เขียนได้ออกเวอร์ชัน 1.0 อย่างเป็นทางการของ "The Incredible KIMplement" ซึ่งเป็นหนึ่งในโปรเจ็กต์ในฝันที่ทำแบบเป็นระยะมาตลอด 20 ปี
  • The Incredible KIMplement เป็นโปรแกรมที่อีมูเลตคอมพิวเตอร์ซิงเกิลบอร์ด MOS/Commodore KIM-1 ที่ใช้ 6502 ทำงานที่ 1MHz และมีหน่วยความจำ 1KB
    • ทำงานบน Commodore 64 และมีฟังก์ชันรองรับ TTY ของ KIM-1 พร้อม RAM ขยาย 16KB
  • ที่สำคัญกว่านั้นคือได้สร้าง 6o6 (6502-on-6502) ซึ่งเป็น CPU NMOS 6502 แบบจำลองเสมือนเต็มรูปแบบบน CPU 6502
    • ควบคุมการรันโค้ดของ guest ได้อย่างสมบูรณ์ และทำให้นามธรรมของการเข้าถึงหน่วยความจำ จึงสามารถรันบนหน่วยความจำเสมือนได้
    • ไม่เพียงผ่านการทดสอบฟังก์ชันเท่านั้น แต่ยังสามารถจำลองเสมือนตัวเองซ้ำหลายชั้นได้ด้วย

แรงจูงใจและการออกแบบของการจำลองเสมือน 6502

  • ตอนเด็กเคยอยากสร้าง "ระบบปฏิบัติการขั้นสุดยอด" แต่ส่วนใหญ่จบลงแค่ในระดับเดโมพื้นฐาน
  • เมื่อได้รู้จักระบบหลายผู้ใช้ ก็ได้ตระหนักว่าผู้ใช้สามารถรันโค้ดที่มีปัญหาได้
    • ระบบที่มีประสิทธิภาพต้องสามารถป้องกันหรือรับมือกับปัญหาที่เกิดจากโค้ดได้
  • ด้วยข้อจำกัดของ CPU 6502 จึงยากที่จะแก้ปัญหานี้ได้อย่างสมบูรณ์ด้วยฮาร์ดแวร์เพียงอย่างเดียว
    • จึงเลือกแก้ด้วยซอฟต์แวร์
  • เครื่องเสมือน 6o6 (VM) รันโค้ด guest และทำให้นามธรรมของการเข้าถึงหน่วยความจำทั้งหมด
    • Harness ทำหน้าที่เป็นอินเทอร์เฟซของ VM กับหน่วยความจำและฮาร์ดแวร์ของ guest
    • เคอร์เนลทำหน้าที่รัน VM และจัดการสถานการณ์ยกเว้น
  • ทำให้การทำงานของ ALU ดำเนินการโดยตรงบน CPU 6502 ฝั่ง host เพื่อให้ได้ทั้งความถูกต้องและประสิทธิภาพ
  • ปรับแต่งประสิทธิภาพด้วยการเข้าถึงหน่วยความจำแบบอินไลน์, Instruction Fusion เป็นต้น

การตรวจสอบและทดสอบ 6o6

  • ใช้ชุดทดสอบฟังก์ชันของ Klaus Dormann เพื่อตรวจสอบความถูกต้อง
  • ใช้อีมูเลเตอร์ lib6502 เพื่อวัดประสิทธิภาพ
    • ด้วยการใช้การเข้าถึงหน่วยความจำแบบอินไลน์และ Instruction Fusion ทำให้ลดจำนวนการรันคำสั่งลงได้ 36.5%
  • มีเดโม 4 โปรแกรมที่ทำงานบน Commodore 64 และ Apple IIe
    • Hello World
    • จำลองเสมือนตัวเองซ้ำหลายชั้น
    • สลับระหว่าง 2 task ที่เป็นอิสระต่อกัน
    • อีมูเลตพื้นที่แอดเดรส 64KB โดยใช้คาร์ทริดจ์ geoRAM

แนวทางการใช้งานที่เป็นไปได้ของ 6o6 และไอเดียสำหรับการปรับปรุงเพิ่มเติม

  • การพัฒนาระบบปฏิบัติการแบบกำหนดเอง
  • สภาพแวดล้อมสำหรับรันโค้ดที่ดาวน์โหลดมาอย่างปลอดภัย
    • เช่น การรันโค้ดแบบไดนามิกใน Gopher client
  • รองรับการจำลองเสมือนบนระบบ NMOS 6502 ด้วยฮาร์ดแวร์ขั้นต่ำ
  • รีแฟกเตอร์เพื่อให้ทำงานจาก ROM ได้
  • อีมูเลตคำสั่งของ CMOS 65C02
  • การปรับแต่งโค้ดเพิ่มเติม

ความเห็นของ GN⁺

  • 6o6 ดูเป็นโซลูชันการจำลองเสมือนด้วยซอฟต์แวร์ที่ยอดเยี่ยม โดยเฉพาะน่าจะมีประโยชน์มากกับระบบ 6502 ที่มีทรัพยากรฮาร์ดแวร์จำกัด

  • โครงสร้างแบบแยกส่วนของ Harness และเคอร์เนลน่าประทับใจ น่าจะช่วยให้รองรับฮาร์ดแวร์ที่หลากหลายและเพิ่มความยืดหยุ่นได้

  • เทคนิคที่นำมาใช้เพื่อปรับแต่งประสิทธิภาพของอีมูเลเตอร์ (การเข้าถึงหน่วยความจำแบบอินไลน์, Instruction Fusion เป็นต้น) น่าสนใจ และน่าจะเป็นไอเดียที่นำไปใช้กับโปรเจ็กต์อีมูเลเตอร์อื่นได้เช่นกัน

  • การสาธิตการทำงานบนฮาร์ดแวร์จริง (Commodore 64, Apple II) และบนคาร์ทริดจ์ขยายอย่าง geoRAM ก็น่าประทับใจ แสดงให้เห็นทั้งความเข้ากันได้ของซอฟต์แวร์และความสามารถในการนำไปใช้จริงได้ดี

  • เนื่องจากเป็นโปรเจ็กต์ที่มีความสมบูรณ์สูง จึงดูเหมือนว่าน่าจะสร้างประโยชน์ให้ชุมชนที่เกี่ยวข้องได้ผ่านการเปิดเผยซอร์สโค้ด และน่าติดตามการปรับปรุงกับกรณีการใช้งานในอนาคต

1 ความคิดเห็น

 
GN⁺ 2024-05-13
ความคิดเห็นบน Hacker News

สรุป:

  • ผู้เขียนเปิดเผยผลงานชิ้นแรกที่ทำเสร็จจากโปรเจกต์ในรายการสิ่งที่อยากทำก่อนตาย ซึ่งลงมือทำเป็นพัก ๆ มาตลอด 20 ปี ดูเป็นรายการที่น่าทึ่งมาก
  • การผลักดันสถาปัตยกรรม 6502 ที่เรียบง่ายและมีข้อจำกัดจากเมื่อ 50 ปีก่อนไปสู่ขีดจำกัดใหม่ ๆ เป็นเรื่องที่น่าสนใจเสมอ แกน 6502 ยังพบได้ใน SoC บางรุ่นที่มุ่งตลาดแมสต้นทุนต่ำมาก
  • ทำให้นึกถึงความทรงจำตอนที่ผู้แสดงความคิดเห็นเริ่มเรียน 6502 assembly ครั้งแรก ตอนนั้นมีหนังสือชื่อ "The Visual Computer" ที่มาพร้อมอีมูเลเตอร์บนฟลอปปีดิสก์และให้ความกระจ่างอย่างมาก พบ PDF ของหนังสือแล้ว แต่ไม่แน่ใจว่าซอฟต์แวร์ในฟลอปปียังหลงเหลืออยู่หรือไม่
  • ประเด็นสำคัญจริง ๆ ในเนื้อหาโพสต์คือวิธีที่ Commodore 64 จำลองระบบที่ใช้ 6502 ซึ่งแตกต่างกันมาก โดยเรียกสิ่งนี้ว่า "6o6" หรือ "6502-on-6502" เป็นซอฟต์แวร์ CPU NMOS 6502 แบบ virtualized เต็มรูปแบบที่รันอยู่บน CPU 6502 และเปิดซอร์สไว้
  • สามารถควบคุมการรันโค้ดของ guest ได้ทั้งหมด ดักจับ opcodes ที่ไม่มีเอกสารและ jam opcodes ได้ และทำ abstraction การเข้าถึงหน่วยความจำทั้งหมดอย่างสมบูรณ์ ทำให้รีแมปที่อยู่ บล็อกการอ่าน/เขียนที่ไม่ถูกต้อง และรัน virtual memory แบบเต็มรูปแบบได้
  • ไม่เพียงผ่านการทดสอบฟังก์ชันเท่านั้น แต่ยังสมบูรณ์พอที่จะ virtualize ตัวมันเองที่กำลัง virtualize ตัวมันเองได้อีกด้วย
  • เป็นงานที่น่าทึ่ง ไม่ใช่แค่ในมุมมองของ 6502 แต่ในทุกมุมมอง
  • ยังทำให้นึกถึงวิดีโอ "The Zilog Z80 has a Protected Mode" ด้วย แต่ตอนที่วิดีโอนั้นถูกโพสต์บน HN กลับไม่มีการสนทนาเกิดขึ้น
  • ระหว่างอ่านบทความ ผู้แสดงความคิดเห็นรู้สึกขนลุกเพราะประทับใจมาก น่าจะต้องกลับมาอ่านซ้ำอีกหลายรอบ