Scroll to navigation

arch_prctl(2) System Calls Manual 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 هي:

تفعيل (addr != 0) أو تعطيل (addr == 0) تعليمة cpuid للخيط المستدعي. التعليمة مفعلة مبدئيًا. إذا عُطلت، أي تنفيذ لتعليمة cpuid سيولد بدلاً من ذلك إشارة SIGSEGV. يمكن استخدام هذه الميزة لمحاكاة نتائج cpuid تختلف عما كانت ستنتجه العتاد الأساسي (مثلًا، في إعداد شبه افتراضي).
يُحفظ إعداد ARCH_SET_CPUID عبر fork(2) و clone(2) لكن يُعاد ضبطه إلى المبدئي (أي cpuid مفعل) عند execve(2).
إرجاع إعداد العلم الذي يُعالج بواسطة ARCH_SET_CPUID كنتيجة لاستدعاء النظام (1 للمفعل، 0 للمعطل). يُتجاهل addr.
الدوال الفرعية لـ x86-64 فقط هي:
ضبط القاعدة 64-بت لمسجل FS إلى addr.
إرجاع قيمة القاعدة 64-بت لمسجل FS للخيط المستدعي في unsigned long المشار إليه بواسطة addr.
ضبط القاعدة 64-بت لمسجل GS إلى addr.
إرجاع قيمة القاعدة 64-بت لمسجل GS للخيط المستدعي في unsigned long المشار إليه بواسطة addr.

قيمة الإرجاع

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

الأخطاء

يشير addr إلى عنوان غير معين أو خارج مساحة عنوان العملية.
op ليس عملية صالحة.
طُلب ARCH_SET_CPUID، لكن العتاد الأساسي لا يدعم خطأ CPUID.
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 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

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

8 فبراير 2026 صفحات دليل لينكس (لم تصدر بعد)