kexec_load(2)

الاسم
kexec_load, kexec_file_load - تحميل نواة جديدة للتنفيذ لاحقًا

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <linux/kexec.h>      /* Definition of KEXEC_* constants */
#include <sys/syscall.h>      /* Definition of SYS_* constants */
#include <unistd.h>

long syscall(SYS_kexec_load, unsigned long entry,
             unsigned long nr_segments,
             struct kexec_segment segments[nr_segments],
             unsigned long flags);
long syscall(SYS_kexec_file_load, int kernel_fd, int initrd_fd,
             unsigned long cmdline_len, const char cmdline[cmdline_len],
             unsigned long flags);

ملاحظة: لا توفر glibc أغلفة لنداءات النظام هذه، مما يستلزم استخدام syscall(2).

الوصف
استدعاء النظام kexec_load() يحمل نواة جديدة يمكن تنفيذها لاحقًا بواسطة reboot(2).

الوسيطة flags هي قناع بت يتحكم في عملية الاستدعاء. يمكن تحديد القيم التالية في flags:

KEXEC_ON_CRASH (منذ Linux 2.6.13)
    تنفيذ النواة الجديدة آليًا عند تعطل النظام. تُحمّل هذه "نواة التعطل" في منطقة من الذاكرة المحجوزة تُحدد عند الإقلاع باستخدام معلمة سطر أوامر النواة crashkernel. يتم تصدير موقع هذه الذاكرة المحجوزة إلى مساحة المستخدم عبر ملف /proc/iomem، في إدخال بعنوان "Crash kernel". يمكن لتطبيق في مساحة المستخدم تحليل هذا الملف وإعداد قائمة من المقاطع (انظر أدناه) تحدد هذه الذاكرة المحجوزة كوجهة. إذا تم تحديد هذه العلامة، تتحقق النواة من أن المقاطع الهدف المحددة في segments تقع ضمن المنطقة المحجوزة.

KEXEC_PRESERVE_CONTEXT (منذ Linux 2.6.27)
    الحفاظ على حالات العتاد والبرمجيات للنظام قبل تنفيذ النواة الجديدة. يمكن استخدام هذا لتعليق النظام. هذه العلامة متاحة فقط إذا تم تكوين النواة مع CONFIG_KEXEC_JUMP، وتكون فعالة فقط إذا كان nr_segments أكبر من 0.

البتات العليا (المقابلة للقناع 0xffff0000) من flags تحتوي على بنية النواة المراد تنفيذها. حدد (أو) الثابت KEXEC_ARCH_DEFAULT لاستخدام البنية الحالية، أو أحد ثوابت البنية التالية KEXEC_ARCH_386، KEXEC_ARCH_68K، KEXEC_ARCH_X86_64، KEXEC_ARCH_PPC، KEXEC_ARCH_PPC64، KEXEC_ARCH_IA_64، KEXEC_ARCH_ARM، KEXEC_ARCH_S390، KEXEC_ARCH_SH، KEXEC_ARCH_MIPS، و KEXEC_ARCH_MIPS_LE. يجب أن تكون البنية قابلة للتنفيذ على وحدة المعالجة المركزية للنظام.

الوسيطة entry هي عنوان الدخول الفعلي في صورة النواة. الوسيطة nr_segments هي عدد المقاطع المشار إليها بواسطة المؤشر segments؛ تفرض النواة حدًا (اعتباطيًا) قدره 16 على عدد المقاطع. الوسيطة segments هي مصفوفة من بنى kexec_segment التي تحدد تخطيط النواة:

    struct kexec_segment {
        void   *buf;        /* Buffer in user space */
        size_t  bufsz;      /* Buffer length in user space */
        void   *mem;        /* Physical address of kernel */
        size_t  memsz;      /* Physical address length */
    };

تُنسخ صورة النواة المحددة بواسطة segments من العملية المستدعية إلى النواة إما في الذاكرة العادية أو في الذاكرة المحجوزة (إذا تم تعيين KEXEC_ON_CRASH). تقوم النواة أولاً بإجراء فحوصات سلامة متنوعة على المعلومات الممررة في segments. إذا نجحت هذه الفحوصات، تنسخ النواة بيانات المقطع إلى ذاكرة النواة. يُنسخ كل مقطع محدد في segments كما يلي:

•   buf و bufsz يحددان منطقة ذاكرة في مساحة العنوان الافتراضية للمستدعي التي هي مصدر النسخ. قد لا تتجاوز القيمة في bufsz القيمة في الحقل memsz.

•   mem و memsz يحددان نطاق عنوان فعلي هو هدف النسخ. يجب أن تكون القيم المحددة في كلا الحقلين مضاعفات لحجم صفحة النظام.

•   تُنسخ bufsz بايت من المخزن المؤقت المصدر إلى المخزن المؤقت الهدف للنواة. إذا كان bufsz أقل من memsz، فتُصفّر البايتات الزائدة في المخزن المؤقت للنواة.

في حالة kexec عادي (أي، عدم تعيين علامة KEXEC_ON_CRASH)، تُحمل بيانات المقطع في أي ذاكرة متاحة وتُنقل إلى الوجهة النهائية عند وقت إعادة تشغيل kexec (مثلًا، عند تنفيذ أمر kexec(8) مع الخيار -e).

في حالة kexec عند الذعر (أي، تعيين علامة KEXEC_ON_CRASH)، تُحمل بيانات المقطع إلى الذاكرة المحجوزة في وقت الاستدعاء، وبعد تعطل، تمرر آلية kexec التحكم ببساطة إلى تلك النواة.

استدعاء النظام kexec_load() متاح فقط إذا تم تكوين النواة مع CONFIG_KEXEC.

  kexec_file_load()
استدعاء النظام kexec_file_load() مشابه لـ kexec_load()، لكنه يأخذ مجموعة مختلفة من الوسائط. يقرأ النواة المراد تحميلها من الملف المشار إليه بواسطة واصف الملف kernel_fd، و initrd (قرص RAM الأولي) المراد تحميله من الملف المشار إليه بواسطة واصف الملف initrd_fd. الوسيطة cmdline هي مؤشر إلى مخزن مؤقت يحتوي على سطر أوامر النواة الجديدة. الوسيطة cmdline_len تحدد حجم المخزن المؤقت. يجب أن تكون آخر بايت في المخزن المؤقت بايت فارغ ('\0').

الوسيطة flags هي قناع بت يعدل سلوك الاستدعاء. يمكن تحديد القيم التالية في flags:

KEXEC_FILE_UNLOAD
    تفريغ النواة المحملة حاليًا.

KEXEC_FILE_ON_CRASH
    تحميل النواة الجديدة في منطقة الذاكرة المحجوزة لنواة التعطل (كما في KEXEC_ON_CRASH). تُقلع هذه النواة إذا تعطلت النواة الجاري تشغيلها حاليًا.

KEXEC_FILE_NO_INITRAMFS
    تحميل initrd/initramfs اختياري. حدد هذه العلامة إذا لم يتم تحميل أي initramfs. إذا تم تعيين هذه العلامة، يُتجاهل القيمة الممررة في initrd_fd.

أُضيف استدعاء النظام kexec_file_load() لتوفير دعم للأنظمة حيث يجب تقييد تحميل "kexec" فقط للنوى الموقعة. استدعاء النظام هذا متاح فقط إذا تم تكوين النواة مع CONFIG_KEXEC_FILE.

قيمة الإرجاع
عند النجاح، تُرجع استدعاءات النظام هذه 0. عند الخطأ، يُرجع -1 ويُضبط errno للإشارة إلى الخطأ.

الأخطاء

EADDRNOTAVAIL
    تم تحديد علامة KEXEC_ON_CRASH، لكن المنطقة المحددة بواسطة حقلي mem وmemsz لأحد إدخالات segments تقع خارج نطاق الذاكرة المحجوزة لنواة التعطل.

EADDRNOTAVAIL
    القيمة في حقل mem أو memsz في أحد إدخالات segments ليست مضاعفًا لحجم صفحة النظام.

EBADF
    kernel_fd أو initrd_fd ليس واصف ملف صالحًا.

EBUSY
    نواة تعطل أخرى قيد التحميل بالفعل أو نواة تعطل قيد الاستخدام بالفعل.

EINVAL
    flags غير صالحة.

EINVAL
    قيمة حقل bufsz في أحد إدخالات segments تتجاوز القيمة في حقل memsz المقابل.

EINVAL
    nr_segments يتجاوز KEXEC_SEGMENT_MAX (16).

EINVAL
    تتداخل مخازن الهدف النووية اثنان أو أكثر.

EINVAL
    القيمة في cmdline[cmdline_len-1] ليست '\0'.

EINVAL
    الملف المشار إليه بواسطة kernel_fd أو initrd_fd فارغ (طوله صفر).

ENOEXEC
    kernel_fd لا يشير إلى ملف مفتوح، أو لا تستطيع النواة تحميل هذا الملف. حاليًا، يجب أن يكون الملف bzImage ويحتوي على نواة x86 قابلة للتحميل فوق 4 جيبي بايت في الذاكرة (انظر ملف مصدر النواة Documentation/arch/x86/boot.rst).

ENOMEM
    تعذر تخصيص الذاكرة.

EPERM
    لا يمتلك المتصل إمكانية CAP_SYS_BOOT.

المعايير
لينكس.

التاريخ

kexec_load()
    لينكس 2.6.13.

kexec_file_load()
    لينكس 3.17.

انظر أيضًا
reboot(2), syscall(2), kexec(8)

ملفات مصدر النواة Documentation/kdump/kdump.rst وDocumentation/admin-guide/kernel-parameters.txt

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.