
إطار عمل لنظام لينكس يُمكِّن من تعريف "شيم" (Shims) افتراضية لبطاقات PCIe من مساحة المستخدم، بهدف تمكين تطوير برامج تشغيل بطاقات PCIe داخل المضيف.
PCIem هو إطار عمل ينشئ أجهزة PCIe افتراضية داخل نواة لينكس عبر توظيف بضع تقنيات مبتكرة لعرض بطاقات اصطناعية كأجهزة PCI شرعية على نظام التشغيل المضيف.
باختصار: PCIem هو إطار عمل لتطوير واختبار برامج تشغيل أجهزة PCIe (وإن لم يقتصر على ذلك) دون الحاجة إلى عتاد فعلي على المضيف.
PCIem وlibfvio-user حلّان مختلفان يلبيان احتياجات مختلفة، وقد يحدث بعض الالتباس عند المقارنة بينهما، لذا نورد هنا الفروق (انظر الشكل 1 لمزيد من التفاصيل).
الفارق الرئيسي هو أن libvfio-user يعتمد عادةً على عميل (يطبّق بروتوكول vfio-user)، وغالبًا ما يكون QEMU (عبر KVM، باستخدام VM exits) لكشف الجهاز PCIe المُحاكى أمام الضيف. أنت تكتب خادم vfio خاصًا بك (عادةً بآلية استدعاء callback) يتفاعل بعد ذلك مع العميل.
أما ما يفعله 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، riscvملاحظة aarch64: تم الاختبار مع Raspberry Pi 4b، عبر device-tree (بدون ACPI)
ملاحظة riscv: تم الاختبار مع VisionFive 2 (عبر device-tree) وMuse Pi Pro (عبر device-tree و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. يدعم إعادة توجيه الاتصالات من وإلى بطاقة الشبكة الحقيقية لديك. يمكن أيضًا استخدام Wi-Fi لكنه أقل استقرارًا.
https://github.com/user-attachments/assets/b6b9862c-349c-49da-8a79-4769dfa31915
تُبرمج البطاقة بالكامل داخل QEMU (وهي في الأساس آلة حالات للبطاقة)، والتي تتولى كل تهيئة مساحة المستخدم ومعالجة الأوامر الصادرة من برنامج التشغيل الحقيقي العامل على المضيف.
يمكنها تشغيل DOOM المُصيَّر برمجيًا (حيث تُرسل الإطارات المكتملة عبر DMA إلى البطاقة ليعرضها QEMU)، وكذلك ألعاب OpenGL 1.X البسيطة (في لقطات الشاشة: tyr-glquake وxash3d؛ وذلك بفضل آلة حالات OpenGL مخصصة مُنفذة بالكامل داخل QEMU تُصيّر قوائم الأوامر برمجيًا وتحدّث الحالة الداخلية وفقًا لذلك).
| الميزة | PCIem | libfvio-user |
|---|
| الاتصال | ملف جهاز (/dev/pciem) | مقابس UNIX (بروتوكول vfio-user) |
| بيئة تشغيل برنامج التشغيل المستهدف | المضيف | نظام تشغيل الضيف |
| بيئة تشغيل الجهاز المُحاكى | مساحة المستخدم | مساحة المستخدم |
| وصولات الجهاز | مباشرة (داخل المضيف) | افتراضية (من الضيف إلى المضيف) |
الشكل 1: مقارنة بين الأطر
| التوزيعة |
|---|
| Ubuntu Latest | - | - | |
| Ubuntu 24.04 LTS | |||
| Debian Stable | - | - | |
| Fedora Latest | - | - | |
| openSUSE Tumbleweed | - | - |