
एक लिनक्स फ्रेमवर्क जो उपयोगकर्ता-स्थान द्वारा परिभाषित "वर्चुअल" PCIe कार्ड शिम्स को सक्षम करता है ताकि इन-होस्ट PCIe कार्ड ड्राइवर विकास किया जा सके।
PCIem एक फ्रेमवर्क है जो Linux कर्नेल में वर्चुअल PCIe डिवाइस बनाता है, जिसमें कुछ नवीन तकनीकों का उपयोग करके सिंथेटिक कार्ड को होस्ट OS में वैध PCI डिवाइस के रूप में प्रस्तुत किया जाता है।
संक्षेप में PCIem: यह PCIe डिवाइस ड्राइवरों को विकसित करने और परीक्षण करने के लिए एक फ्रेमवर्क है (इसी तक सीमित नहीं) जिसमें होस्ट पर वास्तविक हार्डवेयर की आवश्यकता नहीं होती।
PCIem और libfvio-user विभिन्न आवश्यकताओं के लिए दो अलग-अलग समाधान हैं; दोनों की तुलना करने पर भ्रम हो सकता है, इसलिए यहाँ अंतर दिए गए हैं (अधिक जानकारी के लिए चित्र 1 देखें)।
मुख्य अंतर यह है कि libvfio-user आमतौर पर एक क्लाइंट पर निर्भर करता है (जो vfio-user प्रोटोकॉल लागू करता है), आमतौर पर QEMU (KVM के माध्यम से, VM निकास का उपयोग करके) जो एमुलेटेड PCIe डिवाइस को गेस्ट को उजागर करता है। आप अपना vfio सर्वर लिखते हैं (आमतौर पर कॉलबैक तंत्र के साथ) जो फिर क्लाइंट के साथ इंटरैक्ट करता है।
इसके विपरीत, PCIem डिवाइस को सीधे होस्ट पर उजागर करता है; कोई KVM, कोई गेस्ट, कोई वर्चुअल मशीन नहीं। डिवाइस होस्ट के PCIe बस पर ऐसे दिखाई देता है जैसे वह भौतिक रूप से जुड़ा हो।
graph LR
subgraph Kernel ["Host Linux Kernel"]
direction TB
RealDriver["Real PCIe Driver"]
subgraph Framework ["PCIem Framework"]
direction TB
Config["PCI Config Space"]
BARs["BARs"]
IRQ["Interrupts"]
DMA["DMA / IOMMU"]
end
end
Interface(("/dev/pciem"))
subgraph User ["Linux Userspace"]
direction TB
Shim["Device Emulation"]
end
Framework <==> Interface
Interface <==> Shim6.6gcc-12amd64/i386, aarch64, riscvaarch64 नोट: Raspberry Pi 4b पर परीक्षण किया गया, डिवाइस-ट्री (कोई ACPI नहीं)
riscv नोट: VisionFive 2 (डिवाइस-ट्री) और Muse Pi Pro (डिवाइस-ट्री और ACPI) पर परीक्षण किया गया
एक Bochs BGA-संगत (bochs-drm) कार्ड जिसे Weston जैसी यूज़रस्पेस उपयोगिताओं द्वारा चलाया जा सकता है; SDL3 का उपयोग करता है।
https://github.com/user-attachments/assets/d2f7abe4-aef4-4d3a-a30b-ab7ec793faed
NVME नियंत्रक जिसमें 1GB स्टोरेज संलग्न है। उपयोगकर्ता मेमोरी से स्वतंत्र रूप से फ़ॉर्मेट, माउंट, फ़ाइलें बना और हटा सकता है।
https://github.com/user-attachments/assets/29ce370a-7317-4fd4-9d1d-c3e868e1083d
ICH6-संगत एमुलेशन मॉडल जो pipewire के साथ सैंपल चला सकता है।
नोट: रिकॉर्डिंग में हल्की ऑडियो क्रैकलिंग सुनाई देती है, अन्यथा ठीक काम करता है
https://github.com/user-attachments/assets/7264a18c-6fcb-46c4-acde-9531b0be7ff6
E1000 कार्ड का एक काफी सरल कार्यान्वयन। आपके वास्तविक NIC से/को संचार पुनर्निर्देशन का समर्थन करता है। Wi-Fi का भी उपयोग कर सकता है लेकिन कम स्थिर है।
https://github.com/user-attachments/assets/b6b9862c-349c-49da-8a79-4769dfa31915
कार्ड पूरी तरह QEMU में प्रोग्राम किया गया है (मूलतः कार्ड के लिए स्टेट मशीन), जो होस्ट पर चलने वाले वास्तविक ड्राइवर से सभी यूज़रस्पेस इनिशियलाइज़ेशन और कमांड हैंडलिंग करता है।
यह सॉफ्टवेयर-रेंडर किया हुआ DOOM चला सकता है (DMA के साथ तैयार फ्रेम कार्ड को सबमिट करता है जिसे QEMU प्रदर्शित करता है) और साथ ही सरल OpenGL 1.X गेम्स (स्क्रीनशॉट पर, tyr-glquake और xash3d; QEMU में पूरी तरह से लागू एक कस्टम OpenGL स्टेट मशीन के लिए धन्यवाद जो कमांड सूचियों को सॉफ्टवेयर-रेंडर करता है और आंतरिक स्थिति को तदनुसार अपडेट करता है)।
| विशेषता | PCIem | libfvio-user |
|---|
| कनेक्शन | डिवाइस फ़ाइल (/dev/pciem) | UNIX सॉकेट्स (vfio-user प्रोटोकॉल) |
| लक्ष्य ड्राइवर कहाँ चलता है | होस्ट | गेस्ट OS |
| एमुलेटेड डिवाइस कहाँ चलता है | यूज़रस्पेस | यूज़रस्पेस |
| डिवाइस एक्सेस | प्रत्यक्ष (होस्ट के भीतर) | वर्चुअलाइज़्ड (गेस्ट से होस्ट) |
चित्र 1: फ्रेमवर्क के बीच तुलना
| वितरण |
|---|
| Ubuntu नवीनतम | - | - | |
| Ubuntu 24.04 LTS | |||
| Debian स्थिर | - | - | |
| Fedora नवीनतम | - | - | |
| openSUSE Tumbleweed | - | - |