
Rust में लिखा RISC-V एमुलेटर जो ARM64/x86_64 और Sv39 वर्चुअल मेमोरी पर JIT के साथ Linux बूट करता है
Rust में एक RISC-V एमुलेटर। यह Linux बूट करता है।
यह मशीन RV64IMAFDC को M/S/U विशेषाधिकार स्तरों और Sv39 वर्चुअल मेमोरी के साथ कार्यान्वित करती है।
यह ARM64 और x86_64 होस्ट पर एक JIT चलाता है, आवश्यकता होने पर इंटरप्रेटर पर फॉलबैक करता है।
पेरिफेरल UART 16550, CLINT, PLIC और SBI 1.0 हैं। एक बाहरी निर्भरता है: zstd।
यह सबसे तेज़ एमुलेटर नहीं है। इंटरप्रेटर मोड में यह QEMU से लगभग तीन गुना धीमा चलता है। JIT मोड में, लगभग उनतीस गुना धीमा। कोड ब्लॉक चेनिंग अभी तक लागू नहीं की गई है; इससे मदद मिलेगी। हम यह स्पष्ट रूप से कहते हैं क्योंकि आपको पता होना चाहिए कि आप क्या प्राप्त कर रहे हैं।
यह अच्छा करता है: यह संचालित करने में सरल है, यह मशीन नियंत्रण के लिए एक HTTP API प्रदान करता है, यह कर्नेल के बिना बेयर-मेटल ELF को निष्पादित कर सकता है, और यह पूर्ण मशीन स्थिति को सहेज और पुनर्स्थापित कर सकता है। ये सिस्टम कार्य और परीक्षण के लिए उपयोगी चीजें हैं।
cargo build --release
बाइनरी target/release/emuko है। एक alias बनाएँ।
alias emuko=target/release/emuko
emuko dow
~/.emuko/ में एक Debian RISC-V नेटबूट कर्नेल और initrd डाउनलोड करता है।
SHA256 सत्यापित किया जाता है। आपके स्वयं के कर्नेल की आवश्यकता नहीं है।
emuko start
एमुलेटर एक डेमॉन के रूप में चलता है। आप इसके कंसोल से जुड़े हैं। आप कर्नेल को बूट होते देखेंगे। आपको एक शेल मिलेगा।
| कुंजी | प्रभाव |
|---|---|
| Ctrl+] | डिटैच (डेमॉन जारी रहता है) |
| Ctrl+C | अतिथि में इंटरप्ट |
| Ctrl+D | अतिथि में EOF |
emuko start # कंसोल को फिर से जोड़ें
emuko dump # CPU स्थिति प्रिंट करें
emuko stop # निष्पादन रोकें
emuko con # जारी रखें
emuko step 1000 # N निर्देशों को सिंगल-स्टेप करें
emuko snap # एक स्नैपशॉट लें
emuko kill # बंद करें
डेमॉन http://127.0.0.1:7788/v1/api/ पर सुनता है और ws://127.0.0.1:7788/v1/ws/uart पर WebSocket कंसोल कनेक्शन स्वीकार करता है। दोनों स्क्रिप्ट से उपयोग करने योग्य हैं।
कभी-कभी आपको एक ऑपरेटिंग सिस्टम की आवश्यकता नहीं होती। आप मशीन चाहते हैं, एक बाइनरी, और उनके बीच कुछ और नहीं।
emuko run ./my_program.elf
डेमॉन मशीन को रीसेट करता है, ELF सेगमेंट को उनके भौतिक पतों पर लोड करता है, और निष्पादन शुरू करता है। आउटपुट UART कंसोल पर आता है। डेमॉन पहले से चल रहा होना चाहिए।
बेयर मेटल से कंसोल पर लिखने के लिए: 0x1000_0000 पर एक बाइट स्टोर करें।
examples/ निर्देशिका में ऐसे प्रोग्राम हैं जो इस प्रकार चलते हैं।
| उदाहरण | यह क्या करता है |
|---|---|
bare_printf | हर 10 मिलियन पुनरावृत्तियों पर एक संदेश प्रिंट करता है। कोई libc नहीं। सीधा UART राइट। |
उन्हें बनाने के लिए एक RISC-V क्रॉस-कंपाइलर आवश्यक है।
macOS पर: brew install riscv64-elf-gcc।
Linux पर: apt install gcc-riscv64-linux-gnu।
emuko start
cd examples/bare_printf
make run
मशीन की स्थिति — रजिस्टर, मेमोरी, सब कुछ — सहेजी और पुनर्स्थापित की जा सकती है।
emuko snap # अभी स्नैपशॉट लें
emuko snap 5000000 # हर 5M चरणों पर ऑटो-स्नैपशॉट
emuko snap stop # ऑटो-स्नैपशॉट बंद करें
emuko ls # स्नैपशॉट सूचीबद्ध करें
emuko restore <snapshot> # पुनर्स्थापित करें
वर्चुअल मशीन QEMU RISC-V virt प्लेटफ़ॉर्म के साथ संगत एक निश्चित MMIO लेआउट का उपयोग करती है।
डिफ़ॉल्ट सेटिंग्स के साथ (load_addr=0x80200000, 1 GiB RAM):
0x8000_0000 ── RAM आधार
(गैप — बेयर-मेटल प्रोग्राम द्वारा उपयोग योग्य)
0x8020_0000 ── कर्नेल इमेज
│ .text / .rodata / .data / .bss
└─ कर्नेल अंत
(मुक्त)
── initrd
── DTB
── EFI क्षेत्र (128 KiB, केवल PE/UEFI कर्नेल)
0xBFFF_FFFF ── RAM अंत
DTB, initrd और EFI RAM के शीर्ष से नीचे की ओर रखे जाते हैं। एमुलेटर बूट पर कर्नेल के साथ ओवरलैप की जाँच करता है और यदि RAM बहुत छोटी है तो स्पष्ट त्रुटि के साथ रुक जाता है।
ELF PT_LOAD सेगमेंट को उनके p_vaddr पतों पर रखा जाता है।
bare_printf 0x8000_0000 पर लिंक होता है:
0x8000_0000 ── .text
── .rodata
── .data
── .bss (start.S द्वारा शून्य किया गया)
── स्टैक (BSS के ऊपर 16 KiB)
कोई कर्नेल नहीं। कोई initrd नहीं। कोई DTB नहीं। रजिस्टर sp को छोड़कर शून्य से शुरू होते हैं,
जिसे एमुलेटर start.S के संभालने से पहले ram_base + 0x100000 पर सेट करता है।
विकल्प कमांड लाइन पर पास किए जा सकते हैं, पर्यावरण चर के रूप में सेट किए जा सकते हैं, या emuko.yml में रखे जा सकते हैं।
सामान्यतः उपयोग किए जाने वाले RISC-V एमुलेटर के साथ सीधी तुलना।
✅ = समर्थित और प्रलेखित. — = अंतर्निर्मित नहीं है.
स्रोत: QEMU virt · Spike · Renode
Apache 2.0. देखें LICENSE।
| क्षेत्र | आधार | आकार | नोट्स |
|---|
| CLINT | 0x0200_0000 | 64 KiB | टाइमर और सॉफ़्टवेयर IRQ |
| PLIC | 0x0C00_0000 | 4 MiB | 32 इंटरप्ट स्रोत |
| UART | 0x1000_0000 | 256 B | NS16550A, IRQ 10 |
| RAM | 0x8000_0000 | 1 GiB | कॉन्फ़िगरेबल |
| विकल्प | Env Var | डिफ़ॉल्ट | नोट्स |
|---|
--ram-size | RAM_SIZE | 1 GB | RAM बाइट्स में |
--backend | EMUKO_BACKEND | adaptive | adaptive, arm64_jit, amd64_jit, arm64, x86_64 |
--bootargs | BOOTARGS | सीरियल कंसोल | कर्नेल कमांड लाइन |
| फीचर | emuko | QEMU | Spike | Renode |
|---|
| JIT / डायनेमिक अनुवाद | ✅ | ✅ | — | — |
| स्नैपशॉट सहेजना और पुनर्स्थापित करना | ✅ | ✅ | — | ✅ |
| आवधिक ऑटो-स्नैपशॉट | ✅ | — | — | ✅ |
| मशीन नियंत्रण के लिए HTTP API | ✅ | — | — | — |
| WebSocket UART कंसोल | ✅ | — | — | — |
| स्क्रिप्टेबल UART होस्ट ब्रिज | ✅ | — | — | ✅ |
| बेयर-मेटल ELF अपलोड (कोई OS नहीं) | ✅ | — | — | — |
| एक-कमांड कर्नेल डाउनलोड + SHA256 | ✅ | — | — | — |
| JIT-बनाम-इंटरप्रेटर अंतर जाँचकर्ता | ✅ | — | — | — |
| GDB डीबगिंग | — | ✅ | ✅ | ✅ |
| बड़ा उपकरण पारिस्थितिकी तंत्र (PCIe, virtio) | — | ✅ | — | — |
| मल्टी-नोड सिमुलेशन | — | — | — | ✅ |
| व्यापक ISA कवरेज (RVV, क्रिप्टो, आदि) | — | — | ✅ | — |