شرح متعدد النواة في لينكس: من سائقي الأجهزة إلى البيئات الافتراضية
٢٥ سبتمبر ٢٠٢٥
عندما يتحدث الناس عن "نواة Linux"، غالبًا ما يقصدون نواة Linux kernel: النواة المفتوحة المصدر الضخمة التي تُشغل كل شيء من هواتف Android إلى الحواسيب الفائقة. لكن في الواقع، يتعامل المطورون غالبًا مع مثيلات متعددة للنواة — سواء عبر آلات افتراضية، أو الترجمة المتقاطعة، أو اختبار السائقين عبر إصدارات نواة مختلفة. هنا تسمع غالبًا مصطلح سير عمل متعدد النواة. وبالنسبة لمطوري سائقي الأجهزة تحديدًا، القدرة على تشغيل وتبديل والتجربة مع بيئات نواة متعددة ليست مريحة فحسب – بل هي مهارة ضرورية للبقاء.
في هذا المنشور، سنستكشف ما يعنيه Linux متعدد النواة عمليًا. سنركز على الجانب العملي: كيفية إنشاء ساندبوكسات آمنة لاختراق النواة، وكيف ترتبط سائقي الأجهزة بالنواة، وكيف تجعل أدوات مثل Multipass إدارة النوى المتعددة سهلة. سنغوص أيضًا في العلاقة بين تطبيقات المستخدم ووحدات النواة، وسنمر عبر مشروع صغير يوضح الدورة الكاملة: كتابة وحدة نواة بسيطة، وتجميعها، وحقنها، ثم التفاعل معها من مساحة المست
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#define DEVICE_NAME "simple_dev"
#define CLASS_NAME "simple"
static int majorNumber;
static int counter = 0;
static struct class* simpleClass = NULL;
static struct device* simpleDevice = NULL;
static ssize_t dev_read(struct file *f, char __user *buf, size_t len, loff_t *off);
static struct file_operations fops = {
.read = dev_read,
};
static ssize_t dev_read(struct file *f, char __user *buf, size_t len, loff_t *off) {
char message[64];
int msg_len;
counter++;
msg_len = snprintf(message, sizeof(message), "Driver called %d times\n", counter);
if (*off >= msg_len) return 0;
if (copy_to_user(buf, message, msg_len)) return -EFAULT;
*off += msg_len;
return msg_len;
}
static int __init simple_init(void) {
majorNumber = register_chrdev(0, DEVICE_NAME, &fops);
simpleClass = class_create(THIS_MODULE, CLASS_NAME);
simpleDevice = device_create(simpleClass, NULL, MKDEV(majorNumber, 0), NULL, DEVICE_NAME);
printk(KERN_INFO "simple_driver: loaded with major %d\n", majorNumber);
return 0;
}
static void __exit simple_exit(void) {
device_destroy(simpleClass, MKDEV(majorNumber, 0));
class_unregister(simpleClass);
class_destroy(simpleClass);
unregister_chrdev(majorNumber, DEVICE_NAME);
printk(KERN_INFO "simple_driver: unloaded\n");
}
module_init(simple_init);
module_exit(simple_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("InPajama");
MODULE_DESCRIPTION("A simple Linux multi-kernel demo driver");
الوحدة دي تسجل جهاز حرف. كل ما تقرأ منه، بيزيد العداد ويرجع عدد مرات الوصول.
Makefile
obj-m += simple_driver.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
قم بتجميعه داخل مثيل النواة:
make
أدخل الوحدة:
sudo insmod simple_driver.ko
تحقق من السجلات:
dmesg | tail
أزله:
sudo rmmod simple_driver
التفاعل مع مساحة المستخدم
الآن دعنا نكتب تطبيق Python صغير للتحدث مع سائقنا. يعرض السائق نفسه كملف جهاز تحت /dev/simple_dev.
تطبيق Python (user_app.py)
with open("/dev/simple_dev", "r") as f:
data = f.read()
print("Kernel says:", data.strip())
كل مرة تشغل هذا التطبيق، يزداد العداد في السائق.
python3 user_app.py
python3 user_app.py
الإخراج:
Kernel says: Driver called 1 times
Kernel says: Driver called 2 times
هذه هي الدورة الكلاسيكية: مساحة المستخدم → وحدة النواة → النواة → العودة إلى مساحة المستخدم.
العملية متعددة النوى في الممارسة
هنا حيث تبرز إعدادات متعددة النوى. تخيل أنك قمت بتجميع هذا السائق على نواة Ubuntu 22.04، لكنك تحتاج أيضًا إلى اختباره على 20.04. باستخدام Multipass، يمكنك:
- قم بتشغيل كلا المثيلين.
- انسخ مصدر السائق إلى كل منهما.
- قم بتجميعه باستخدام رؤوس كل نواة.
- أدخل واختبر.
هذا هو تطوير متعدد النوى: التعامل مع كل نواة كمختبر مؤقت لسائقك.
لماذا لا تستخدم Docker؟
سؤال جيد. حاويات Docker تشترك في نواة المضيف. إذا كان هدفك اختبار وحدات النواة، فإن Docker لن يساعد لأنك لا تستطيع تحميل وحدات نواة مخصصة داخل حاوية دون التأثير على نواة المضيف. تحتاج إلى عزل كامل للنواة، مما يعني آلات افتراضية.
حماية نظام المضيف
إحدى أكثر الدروس قيمة من دورة سائق الأجهزة InPajama هي هذه: لا تقم أبدًا بالتعديل المباشر على نواة نظام المضيف. حتى إذا كنت تستخدم Linux كنظام مضيف، قم بإنشاء آلة افتراضية وقم بتجاربك هناك. لماذا؟
- إذا قمت بتهيئة رؤوس النواة بشكل خاطئ، فقد تكسر نظام البناء الخاص بنظام المضيف.
- إذا كان لديك خطأ في الوحدة، يمكنك إحداث بانك في النظام بأكمله.
- إذا قمت بتلف ذاكرة النواة، فأنت تخاطر بفقدان البيانات.
باستخدام مختبرات متعددة النوى، يمكنك:
- الرجوع إلى الوراء فورًا.
- تشغيل إصدارات متعددة جنبًا إلى جنب.
- مشاركة الكود من المضيف عبر دمج SSH + VS Code.
VS Code + SSH: إعداد أحلام
كتابة كود النواة في vim داخل آلة افتراضية جيد، لكن سير العمل الحديثة تسمح لك بالاحتفاظ بمُحررك على المضيف ودفع الكود إلى الآلة الافتراضية. إليك الطريقة:
- قم بتثبيت امتداد Remote - SSH في VS Code.
- اتصل بـ SSH إلى مثيل Multipass.
- افتح ملفات مصدر السائق مباشرة في VS Code.
الآن لديك IntelliSense، دمج Git، وميزات التحرير الحديثة، بينما يحدث التجميع الفعلي داخل مثيل النواة المُعزول.
دروس مستفادة من تطوير متعدد النوى
بعد المرور بهذه السير، تبرز بعض الاستنتاجات:
- العزلة هي الحرية: معرفتك أنك تستطيع دائمًا التخلص من مثيل النواة المعطل يجعلك أكثر смелость للاختبار.
- الرؤوس مهمة: قم دائمًا بتثبيت رؤوس النواة داخل مثيلك (
sudo apt install linux-headers-$(uname -r)). بدونها، لا يمكنك تجميع الوحدات. - الانزياح الإصداري حقيقي: التغييرات الصغيرة بين إصدارات النواة يمكن أن تكسر السائقين. لهذا السبب، اختبار عبر نوى متعددة أمر بالغ الأهمية.
- الأتمتة تُثمر: اكتب سكريبتات لتشغيل المثيلات، وتثبيت الرؤوس، ونسخ المصادر. سير عمل متعدد النوى تصبح فوضوية بدون أتمتة.
الاستنتاج: تبنّي عقلية متعددة النوى
Linux ليس مجرد نواة واحدة—إنها قاعدة كود حية ومتطورة مع آلاف الإصدارات المنتشرة. إذا كنت جادًا في تطوير سائقات الأجهزة، فأنت بحاجة إلى تبني عقلية متعددة النوى. ذلك يعني:
- بناء مختبرات معزولة باستخدام أدوات مثل Multipass.
- ممارسة كتابة، وإدخال، وإزالة وحدات النواة.
- اختبار عبر نوى متعددة لضمان التوافق.
- الحفاظ على نظام المضيف نظيفًا وآمنًا.
بهذه المهارات، أنت لا تكتب كودًا فحسب—أنت تتعلم لغة النواة. وعندما تصبح مرتاحًا في إدارة نوى متعددة، ستجد أن استكشاف الأخطاء، والاختبار، وحتى المساهمة في Linux الأساسي يصبح أقل إرهاقًا.
اذهب الآن: قم بتشغيل ذلك المختبر، واكتب أول سائق لك، وشاهد كودك يرقص داخل النواة. عالم متعدد النوى ينتظرك.
الخلاصة: تطوير النواة المتعددة أقل تركيزًا على النظرية المجردة وأكثر على التدفقات العملية. أنشئ حالات نواة قابلة للتخلص منها، اختبر برامج التشغيل الخاصة بك عبرها، واحتفظ بمضيفك آمنًا. هكذا يتعاملون.
إذا استمتعت بهذا الغوص العميق، فكر في الاشتراك للبقاء على اطلاع على استكشافات مطولة لأنظمة Linux وتطوير النواة التطبيقي.