set_thread_area(2)

الاسم
get_thread_area, set_thread_area - معالجة معلومات التخزين المحلي للخيط

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

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

#if defined __i386__ || defined __x86_64__
# include <asm/ldt.h>        /* تعريف struct user_desc */

int syscall(SYS_get_thread_area, struct user_desc *u_info);
int syscall(SYS_set_thread_area, struct user_desc *u_info);

#elif defined __m68k__

int syscall(SYS_get_thread_area);
int syscall(SYS_set_thread_area, unsigned long tp);

#elif defined __mips__ || defined __csky__

int syscall(SYS_set_thread_area, unsigned long addr);

#endif

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

الوصف
توفر هذه الاستدعاءات دعماً خاصاً بالمعمارية لتنفيذ تخزين محلي للخيط. حالياً، يتوفر set_thread_area() على m68k وMIPS وC-SKY وx86 (كلا النوعين 32-bit و64-bit)؛ ويتوفر get_thread_area() على m68k وx86.

على m68k وMIPS وC-SKY، يسمح set_thread_area() بتخزين مؤشر عشوائي (مقدم في وسيط tp على m68k وفي وسيط addr على MIPS وC-SKY) في بنية بيانات النواة المرتبطة بالخيط المستدعي؛ يمكن لاحقًا استرداد هذا المؤشر باستخدام get_thread_area() (انظر أيضًا NOTES لمعلومات حول الحصول على مؤشر الخيط على MIPS).

على x86، يخصص Linux ثلاثة مداخل لجدول الواصف العام (GDT) للتخزين المحلي للخيط. لمزيد من المعلومات حول GDT، انظر دليل مطور برامج Intel أو دليل برمجة معمارية AMD.

يأخذ كلا استدعائي النظام وسيطاً هو مؤشر لبنية من النوع التالي:

    struct user_desc {
        unsigned int  entry_number;
        unsigned int  base_addr;
        unsigned int  limit;
        unsigned int  seg_32bit:1;
        unsigned int  contents:2;
        unsigned int  read_exec_only:1;
        unsigned int  limit_in_pages:1;
        unsigned int  seg_not_present:1;
        unsigned int  useable:1;
    #ifdef __x86_64__
        unsigned int  lm:1;
    #endif
    };

يقرأ get_thread_area() مدخل GDT المشار إليه بواسطة u_info->entry_number ويملأ باقي الحقول في u_info.

يضبط set_thread_area() مدخل TLS في GDT.

يتوافق مدخل مصفوفة TLS المضبوط بواسطة set_thread_area() مع قيمة u_info->entry_number التي مررها المستخدم. إذا كانت هذه القيمة ضمن الحدود، يكتب set_thread_area() واصف TLS المشار إليه بواسطة u_info في مصفوفة TLS للخيط.

عند تمرير entry_number بقيمة -1 إلى set_thread_area()، يبحث عن مدخل TLS حر. إذا وجد set_thread_area() مدخل TLS حر، تضبط قيمة u_info->entry_number عند العودة لإظهار أي مدخل تم تغييره.

يعتبر user_desc "فارغاً" إذا ضبط read_exec_only وseg_not_present إلى 1 وكانت جميع الحقول الأخرى 0. إذا مرر واصف "فارغ" إلى set_thread_area()، سيمسح مدخل TLS المقابل. انظر BUGS للتفاصيل الإضافية.

منذ Linux 3.19، لا يمكن استخدام set_thread_area() لكتابة مقاطع غير موجودة أو مقاطع 16-bit أو مقاطع تعليمات برمجية، على الرغم من أن مسح مقطع لا يزال مقبولاً.

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

على C-SKY وMIPS وm68k، يعيد set_thread_area() دائماً 0. على m68k، يعيد get_thread_area() قيمة مؤشر منطقة الخيط (المضبوطة سابقاً عبر set_thread_area()).

الأخطاء

EFAULT
    u_info هو مؤشر غير صالح.

EINVAL
    u_info->entry_number خارج الحدود.

ENOSYS
    تم استدعاء get_thread_area() أو set_thread_area() كاستدعاء نظام 64-bit.

ESRCH
    (set_thread_area()) تعذر تحديد موقع مدخل TLS حر.

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

التاريخ

set_thread_area()
    Linux 2.5.29.

get_thread_area()
    Linux 2.5.32.

ملاحظات
نداءات النظام هذه مخصصة بشكل عام للاستخدام فقط بواسطة مكتبات الخيوط.

يمكن لـ arch_prctl(2) أن يتداخل مع set_thread_area() على x86. راجع arch_prctl(2) لمزيد من التفاصيل. هذه ليست مشكلة عادة، حيث أن arch_prctl(2) يُستخدم عادة فقط بواسطة برامج 64 بت.

على MIPS، يمكن الحصول على القيمة الحالية لمؤشر منطقة الخيط باستخدام التعليمات:

    rdhwr dest, $29

هذه التعليمات تسبب فخًا ويتم معالجتها بواسطة النواة.

العلل
على نوى 64 بت قبل Linux 3.19، إذا تم تعيين أحد بتات الحشو في user_desc، فإنه يمنع اعتبار الواصف فارغًا (انظر modify_ldt(2)). نتيجة لذلك، الطريقة الوحيدة الموثوقة لمسح إدخال TLS هي استخدام memset(3) لتحديد بنية user_desc بأكملها بالأصفار، بما في ذلك بتات الحشو، ثم تعيين بتات read_exec_only و seg_not_present. على Linux 3.19، سيتم أيضًا تفسير user_desc المكون بالكامل من الأصفار باستثناء entry_number كطلب لمسح إدخال TLS، لكن هذا تصرف بشكل مختلف على النوى الأقدم.

قبل Linux 3.19، يجب ألا تشير سجلات المقطع DS و ES إلى إدخالات TLS.

انظر أيضًا
arch_prctl(2)، modify_ldt(2)، ptrace(2) (PTRACE_GET_THREAD_AREA و PTRACE_SET_THREAD_AREA)

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

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

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