.\" -*- coding: UTF-8 -*- .\" Copyright 1995, Michael Shields .\" Copyright 2007, Michael Kerrisk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH mprotect 2 "11 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم mprotect, pkey_mprotect \- ضبط الحماية على منطقة من الذاكرة .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBint mprotect(\fPsize_t size; \fB void \fP\fIaddr\fP\fB[\fP\fIsize\fP\fB], size_t \fP\fIsize\fP\fB, int \fP\fIprot\fP\fB);\fP .P \fB#define _GNU_SOURCE\fP /* انظر feature_test_macros(7) */ \fB#include \fP .P \fBint pkey_mprotect(\fPsize_t size; \fB void \fP\fIaddr\fP\fB[\fP\fIsize\fP\fB], size_t \fP\fIsize\fP\fB, int \fP\fIprot\fP\fB, int \fP\fIpkey\fP\fB);\fP .fi .SH الوصف تغير \fBmprotect\fP() حماية الوصول لصفحات ذاكرة العملية المستدعية التي تحتوي على أي جزء من نطاق العناوين في الفترة [\fIaddr\fP, \fIaddr\fP+\fIsize\fP\-1]. يجب أن يكون \fIaddr\fP محاذياً لحدود الصفحة. .P إذا حاولت العملية المستدعية الوصول إلى الذاكرة بطريقة تنتهك الحماية، فإن النواة تولد إشارة \fBSIGSEGV\fP للعملية. .P \fIprot\fP هو مزيج من أعلام الوصول التالية: \fBPROT_NONE\fP أو عملية OR بتية للقيم الأخرى في القائمة التالية: .TP \fBPROT_NONE\fP لا يمكن الوصول إلى الذاكرة على الإطلاق. .TP \fBPROT_READ\fP يمكن قراءة الذاكرة. .TP \fBPROT_WRITE\fP يمكن تعديل الذاكرة. .TP \fBPROT_EXEC\fP يمكن تنفيذ الذاكرة. .TP \fBPROT_SEM\fP (منذ Linux 2.5.7) يمكن استخدام الذاكرة للعمليات الذرية. تم تقديم هذا العلم كجزء من تنفيذ \fBfutex\fP(2) (لضمان القدرة على أداء العمليات الذرية المطلوبة بأوامر مثل \fBFUTEX_WAIT\fP)، لكنه لا يُستخدم حالياً على أي بنية. .TP \fBPROT_SAO\fP (منذ Linux 2.6.26) .\" commit aba46c5027cb59d98052231b36efcbbde9c77a1d .\" commit ef3d3246a0d06be622867d21af25f997aeeb105f يجب أن يكون للذاكرة ترتيب وصول قوي. هذه الميزة خاصة ببنية PowerPC (الإصدار 2.06 من مواصفات البنية يضيف ميزة SAO CPU، وهي متاحة على POWER 7 أو PowerPC A2، على سبيل المثال). .P بالإضافة (منذ Linux 2.6.0)، يمكن أن يحتوي \fIprot\fP على أحد الأعلام التالية: .TP .\" mm/mmap.c: .\" vm_flags |= calc_vm_prot_bits(prot, pkey) | calc_vm_flag_bits(flags) | .\" mm->def_flags | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC; .\" And calc_vm_flag_bits converts only GROWSDOWN/DENYWRITE/LOCKED. \fBPROT_GROWSUP\fP .\" The VMA is one that was marked with VM_GROWSUP by the kernel .\" when the stack was created. Note that (unlike VM_GROWSDOWN), .\" there is no mmap() flag (analogous to MAP_GROWSDOWN) for .\" creating a VMA that is marked VM_GROWSUP. طبق نمط الحماية حتى نهاية تعيين ينمو لأعلى. (يتم إنشاء هذه التعيينات لمنطقة المكدس على البنى\[em]على سبيل المثال، HP\-PARISC\[em]التي تحتوي على مكدس ينمو لأعلى.) .TP \fBPROT_GROWSDOWN\fP طبق نمط الحماية نزولاً إلى بداية تعيين ينمو لأسفل (يجب أن يكون مقطع مكدس أو مقطع معين مع تعيين علم \fBMAP_GROWSDOWN\fP). .P مثل \fBmprotect\fP()، تغير \fBpkey_mprotect\fP() الحماية على الصفحات المحددة بواسطة \fIaddr\fP و \fIsize\fP. تحدد الوسيطة \fIpkey\fP مفتاح الحماية (انظر \fBpkeys\fP(7)) لتعيينه للذاكرة. يجب تخصيص مفتاح الحماية باستخدام \fBpkey_alloc\fP(2) قبل تمريره إلى \fBpkey_mprotect\fP(). لمثال على استخدام هذه الاستدعاءات النظامية، انظر \fBpkeys\fP(7). .SH "قيمة الإرجاع" عند النجاح، ترجع \fBmprotect\fP() و \fBpkey_mprotect\fP() صفراً. عند الخطأ، ترجع هذه الاستدعاءات النظامية \-1، ويتم تعيين \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء .TP \fBEACCES\fP لا يمكن إعطاء الذاكرة الوصول المحدد. يمكن أن يحدث هذا، على سبيل المثال، إذا قمت بـ \fBmmap\fP(2) لملف لديك وصول للقراءة فقط إليه، ثم طلبت من \fBmprotect\fP() وضع علامة \fBPROT_WRITE\fP عليه. .TP \fBEINVAL\fP \fIaddr\fP ليس مؤشراً صالحاً، أو ليس مضاعفاً لحجم صفحة النظام. .TP \fBEINVAL\fP (\fBpkey_mprotect\fP()) لم يتم تخصيص \fIpkey\fP باستخدام \fBpkey_alloc\fP(2) .TP \fBEINVAL\fP تم تحديد كل من \fBPROT_GROWSUP\fP و \fBPROT_GROWSDOWN\fP في \fIprot\fP. .TP \fBEINVAL\fP أعلام غير صالحة محددة في \fIprot\fP. .TP \fBEINVAL\fP (بنية PowerPC) تم تحديد \fBPROT_SAO\fP في \fIprot\fP، لكن ميزة الأجهزة SAO غير متاحة. .TP \fBENOMEM\fP لا يمكن تخصيص هياكل النواة الداخلية. .TP \fBENOMEM\fP العناوين في النطاق [\fIaddr\fP, \fIaddr\fP+\fIsize\fP\-1] غير صالحة لمساحة عنوان العملية، أو تحدد صفحة واحدة أو أكثر غير معينة. (قبل Linux 2.4.19، كان الخطأ \fBEFAULT\fP يُنتج بشكل غير صحيح لهذه الحالات.) .TP \fBENOMEM\fP .\" I.e., the number of VMAs would exceed the 64 kB maximum تغيير حماية منطقة ذاكرة سيؤدي إلى تجاوز العدد الإجمالي للتعيينات ذات السمات المميزة (مثل الحماية للقراءة مقابل الحماية للقراءة/الكتابة) الحد الأقصى المسموح به. (على سبيل المثال، جعل حماية نطاق \fBPROT_READ\fP في منتصف منطقة محمية حاليًا كـ \fBPROT_READ|PROT_WRITE\fP سيؤدي إلى ثلاثة تعيينات: تعيينان للقراءة/الكتابة في كل طرف وتعيين للقراءة فقط في المنتصف.) .SH الإصدارات .\" SVr4 defines an additional error .\" code EAGAIN. The SVr4 error conditions don't map neatly onto Linux's. ينص POSIX على أن سلوك \fBmprotect\fP() غير محدد إذا تم تطبيقه على منطقة ذاكرة لم يتم الحصول عليها عبر \fBmmap\fP(2). .P في لينكس، من الجائز دائمًا استدعاء \fBmprotect\fP() على أي عنوان في مساحة عنوان العملية (باستثناء منطقة vsyscall للنواة). على وجه الخصوص، يمكن استخدامه لتغيير تعيينات الكود الحالية لتكون قابلة للكتابة. .P ما إذا كان \fBPROT_EXEC\fP له أي تأثير مختلف عن \fBPROT_READ\fP يعتمد على بنية المعالج، وإصدار النواة، وحالة العملية. إذا تم تعيين \fBREAD_IMPLIES_EXEC\fP في أعلام شخصية العملية (انظر \fBpersonality\fP(2))، فإن تحديد \fBPROT_READ\fP سيضيف ضمنيًا \fBPROT_EXEC\fP. .P في بعض بنيات العتاد (مثل i386)، يستلزم \fBPROT_WRITE\fP \fBPROT_READ\fP. .P ينص POSIX.1 على أن التنفيذ قد يسمح بالوصول بخلاف ما هو محدد في \fIprot\fP، ولكن كحد أدنى يمكنه السماح بالوصول للكتابة فقط إذا تم تعيين \fBPROT_WRITE\fP، ويجب ألا يسمح بأي وصول إذا تم تعيين \fBPROT_NONE\fP. .P يجب على التطبيقات توخي الحذر عند خلط استخدام \fBmprotect\fP() و \fBpkey_mprotect\fP(). في x86، عند استخدام \fBmprotect\fP() مع تعيين \fIprot\fP إلى \fBPROT_EXEC\fP، قد يتم تخصيص مفتاح حماية (pkey) وتعيينه على الذاكرة ضمنيًا بواسطة النواة، ولكن فقط عندما كان المفتاح 0 سابقًا. .P في الأنظمة التي لا تدعم مفاتيح الحماية في العتاد، لا يزال من الممكن استخدام \fBpkey_mprotect\fP() ولكن يجب تعيين \fIpkey\fP إلى \-1. عند الاستدعاء بهذه الطريقة، تكون عملية \fBpkey_mprotect\fP() مكافئة لـ \fBmprotect\fP(). .SH المعايير .TP \fBmprotect\fP() POSIX.1\-2024. .TP \fBpkey_mprotect\fP() لينكس. .SH التاريخ .TP \fBmprotect\fP() SVr4, SUSv1, POSIX.1\-1996. .TP \fBpkey_mprotect\fP() لينكس 4.9، glibc 2.27. .SH ملاحظات .SH أمثلة .\" sigaction.2 refers to this example البرنامج أدناه يوضح استخدام \fBmprotect\fP(). يخصص البرنامج أربع صفحات من الذاكرة، ويجعل الصفحة الثالثة منها للقراءة فقط، ثم ينفذ حلقة تمر تصاعديًا عبر المنطقة المخصصة لتعديل البايتات. .P مثال لما قد نراه عند تشغيل البرنامج هو التالي: .P .in +4n .EX $\fB ./a.out\fP Start of region: 0x804c000 Got SIGSEGV at address: 0x804e000 .EE .in .SS "مصدر البرنامج" .\" SRC BEGIN (mprotect.c) \& .EX #include #include #include #include #include #include #include \& static char *buffer; \& static void handler(int sig, siginfo_t *si, void *unused) { /* Note: calling printf() from a signal handler is not safe (and should not be done in production programs), since printf() is not async\-signal\-safe; see signal\-safety(7). Nevertheless, we use printf() here as a simple way of showing that the handler was called. */ \& printf("Got SIGSEGV at address: %p\[rs]n", si\->si_addr); exit(EXIT_FAILURE); } \& int main(void) { int pagesize; struct sigaction sa; \& sa.sa_flags = SA_SIGINFO; sigemptyset(&sa.sa_mask); sa.sa_sigaction = handler; if (sigaction(SIGSEGV, &sa, NULL) == \-1) err(EXIT_FAILURE, "sigaction"); \& pagesize = sysconf(_SC_PAGE_SIZE); if (pagesize == \-1) err(EXIT_FAILURE, "sysconf"); \& /* Allocate a buffer aligned on a page boundary; initial protection is PROT_READ | PROT_WRITE. */ \& buffer = memalign(pagesize, 4 * pagesize); if (buffer == NULL) err(EXIT_FAILURE, "memalign"); \& printf("Start of region: %p\[rs]n", buffer); \& if (mprotect(buffer + pagesize * 2, pagesize, PROT_READ) == \-1) err(EXIT_FAILURE, "mprotect"); \& for (char *p = buffer ; ; ) *(p++) = \[aq]a\[aq]; \& printf("Loop completed\[rs]n"); /* Should never happen */ exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" \fBmmap\fP(2), \fBsysconf\fP(3), \fBpkeys\fP(7) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .