arch_prctl(2)

الاسم
arch_prctl - ضبط حالة الخيط الخاصة بالمعمارية

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

موجز
#include <asm/prctl.h>        /* تعريف ثوابت ARCH_* */
#include <sys/syscall.h>      /* تعريف ثوابت SYS_* */
#include <unistd.h>

int syscall(SYS_arch_prctl, int op, unsigned long addr);
int syscall(SYS_arch_prctl, int op, unsigned long *addr);

ملاحظة: لا توفر glibc غلافًا لـ arch_prctl()، مما يستلزم استخدام syscall(2).

الوصف
تضبط arch_prctl() حالة العملية أو الخيط الخاصة بالمعمارية. يختار op عملية ويمرر الوسيطة addr إليها؛ تُفسر addr إما كـ unsigned long لعمليات "الضبط"، أو كـ unsigned long * لعمليات "الجلب".

الدوال الفرعية لكل من x86 و x86-64 هي:

ARCH_SET_CPUID (منذ لينكس 4.12)
    تفعيل (addr != 0) أو تعطيل (addr == 0) تعليمة cpuid للخيط المستدعي. التعليمة مفعلة مبدئيًا. إذا عُطلت، أي تنفيذ لتعليمة cpuid سيولد بدلاً من ذلك إشارة SIGSEGV. يمكن استخدام هذه الميزة لمحاكاة نتائج cpuid تختلف عما كانت ستنتجه العتاد الأساسي (مثلًا، في إعداد شبه افتراضي).

    يُحفظ إعداد ARCH_SET_CPUID عبر fork(2) و clone(2) لكن يُعاد ضبطه إلى المبدئي (أي cpuid مفعل) عند execve(2).

ARCH_GET_CPUID (منذ لينكس 4.12)
    إرجاع إعداد العلم الذي يُعالج بواسطة ARCH_SET_CPUID كنتيجة لاستدعاء النظام (1 للمفعل، 0 للمعطل). يُتجاهل addr.

الدوال الفرعية لـ x86-64 فقط هي:

ARCH_SET_FS
    ضبط القاعدة 64-بت لمسجل FS إلى addr.

ARCH_GET_FS
    إرجاع قيمة القاعدة 64-بت لمسجل FS للخيط المستدعي في unsigned long المشار إليه بواسطة addr.

ARCH_SET_GS
    ضبط القاعدة 64-بت لمسجل GS إلى addr.

ARCH_GET_GS
    إرجاع قيمة القاعدة 64-بت لمسجل GS للخيط المستدعي في unsigned long المشار إليه بواسطة addr.

قيمة الإرجاع
عند النجاح، تُرجع arch_prctl() 0؛ عند الخطأ، تُرجع -1، ويُضبط errno للإشارة إلى الخطأ.

الأخطاء

EFAULT
    يشير addr إلى عنوان غير معين أو خارج مساحة عنوان العملية.

EINVAL
    op ليس عملية صالحة.

ENODEV
    طُلب ARCH_SET_CPUID، لكن العتاد الأساسي لا يدعم خطأ CPUID.

EPERM
    addr خارج مساحة عنوان العملية.

المعايير
لينكس/x86-64.

ملاحظات
arch_prctl() مدعومة فقط على لينكس/x86-64 للبرامج 64-بت حاليًا.

تتغير القاعدة 64-بت عند تحميل محدد مقطع 32-بت جديد.

ARCH_SET_GS معطل في بعض الأنوية.

تبديلات السياق لقواعد المقاطع 64-بت مكلفة جدًا. كتحسين، إذا تم استخدام عنوان قاعدة TLS 32-بت، فقد يستخدم arch_prctl() إدخال TLS حقيقي كما لو تم استدعاء set_thread_area(2)، بدلاً من معالجة سجل قاعدة المقطع مباشرة. يمكن تخصيص ذاكرة في أول 2 جيجابايت من مساحة العنوان باستخدام mmap(2) مع العلم MAP_32BIT.

بسبب التحسين المذكور أعلاه، فإن استخدام arch_prctl() و set_thread_area(2) في نفس الخيط خطير، حيث قد يكتبان فوق إدخالات TLS الخاصة ببعضهما البعض.

قد يكون FS مستخدمًا بالفعل من قبل مكتبة الخيوط. البرامج التي تستخدم ARCH_SET_FS مباشرة معرضة جدًا للانهيار.

انظر أيضًا
mmap(2)، modify_ldt(2)، prctl(2)، set_thread_area(2)

دليل مبرمج AMD X86-64

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

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

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