.\" -*- coding: UTF-8 -*- .\" Copyright 1996, Thomas Kuhn .\" Copyright 2004, Michael Kerrisk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH mlock 2 "11 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم mlock, mlock2, munlock, mlockall, munlockall \- قفل وفتح الذاكرة .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBint mlock(\fPsize_t size; \fB const void \fP\fIaddr\fP\fB[\fP\fIsize\fP\fB], size_t \fP\fIsize\fP\fB);\fP \fBint mlock2(\fPsize_t size; \fB const void \fP\fIaddr\fP\fB[\fP\fIsize\fP\fB], size_t \fP\fIsize\fP\fB, unsigned int \fP\fIflags\fP\fB);\fP \fBint munlock(\fPsize_t size; \fB const void \fP\fIaddr\fP\fB[\fP\fIsize\fP\fB], size_t \fP\fIsize\fP\fB);\fP .P \fBint mlockall(int \fP\fIflags\fP\fB);\fP \fBint munlockall(void);\fP .fi .SH الوصف \fBmlock\fP() و \fBmlock2\fP() و \fBmlockall\fP() تقفل جزءًا أو كل مساحة العنوان الافتراضية لعملية الاستدعاء في RAM، مما يمنع ترحيل تلك الذاكرة إلى منطقة المبادلة. .P \fBmunlock\fP() و \fBmunlockall\fP() تنفذ العملية المعاكسة، بفتح جزء أو كل مساحة العنوان الافتراضية لعملية الاستدعاء، بحيث يمكن إخراج الصفحات في نطاق العنوان الافتراضي المحدد إلى المبادلة مرة أخرى إذا تطلب مدير ذاكرة النواة ذلك. .P تُقفل الذاكرة وفتحها بوحدات من الصفحات الكاملة. .SS "mlock() و mlock2() و munlock()" \fBmlock\fP() تقفل الصفحات في نطاق العنوان الذي يبدأ من \fIaddr\fP ويستمر لـ \fIsize\fP بايت. جميع الصفحات التي تحتوي على جزء من نطاق العنوان المحدد مضمونة أن تكون مقيمة في RAM عند نجاح الاستدعاء؛ الصفحات مضمونة أن تبقى في RAM حتى تُفتح لاحقًا. .P .\" commit a8ca5d0ecbdde5cc3d7accacbd69968b0c98764e .\" commit de60f5f10c58d4f34b68622442c0e04180367f3f .\" commit b0f205c2a3082dd9081f9a94e50658c5fa906ff1 \fBmlock2\fP() تقفل أيضًا الصفحات في النطاق المحدد الذي يبدأ من \fIaddr\fP ويستمر لـ \fIsize\fP بايت. ومع ذلك، فإن حالة الصفحات الموجودة في ذلك النطاق بعد نجاح الاستدعاء ستعتمد على القيمة في وسيط \fIflags\fP. .P يمكن أن يكون وسيط \fIflags\fP إما 0 أو الثابت التالي: .TP \fBMLOCK_ONFAULT\fP تقفل الصفحات المقيمة حاليًا وتضع علامة على النطاق بأكمله بحيث تُقفل الصفحات غير المقيمة المتبقية عند ملئها بخطأ صفحة. .P إذا كان \fIflags\fP هو 0، فإن \fBmlock2\fP() تتصرف تمامًا مثل \fBmlock\fP(). .P \fBmunlock\fP() تفتح الصفحات في نطاق العنوان الذي يبدأ من \fIaddr\fP ويستمر لـ \fIsize\fP بايت. بعد هذا الاستدعاء، يمكن للنواة نقل جميع الصفحات التي تحتوي على جزء من نطاق الذاكرة المحدد إلى مساحة المبادلة الخارجية مرة أخرى. .SS "mlockall() و munlockall()" \fBmlockall\fP() تقفل جميع الصفحات المعينة في مساحة العنوان لعملية الاستدعاء. يشمل ذلك صفحات مقطع الكود والبيانات والمكدس، بالإضافة إلى المكتبات المشتركة وبيانات النواة في مساحة المستخدم والذاكرة المشتركة والملفات المعينة في الذاكرة. جميع الصفحات المعينة مضمونة أن تكون مقيمة في RAM عند نجاح الاستدعاء؛ الصفحات مضمونة أن تبقى في RAM حتى تُفتح لاحقًا. .P يُبنى وسيط \fIflags\fP كـ OR بتاتي لواحد أو أكثر من الثوابت التالية: .TP \fBMCL_CURRENT\fP تقفل جميع الصفحات المعينة حاليًا في مساحة العنوان للعملية. .TP \fBMCL_FUTURE\fP تقفل جميع الصفحات التي ستصبح معينة في مساحة العنوان للعملية في المستقبل. يمكن أن تكون هذه، على سبيل المثال، صفحات جديدة مطلوبة بواسطة كومة ومكدس متزايدين بالإضافة إلى ملفات جديدة معينة في الذاكرة أو مناطق ذاكرة مشتركة. .TP \fBMCL_ONFAULT\fP (منذ Linux 4.4) يُستخدم مع \fBMCL_CURRENT\fP أو \fBMCL_FUTURE\fP أو كليهما. يضع علامة على جميع التعيينات الحالية (مع \fBMCL_CURRENT\fP) أو المستقبلية (مع \fBMCL_FUTURE\fP) لقفل الصفحات عند إدخالها بخطأ. عند استخدامه مع \fBMCL_CURRENT\fP، تُقفل جميع الصفحات الموجودة، لكن \fBmlockall\fP() لن تسبب خطأ في الصفحات غير الموجودة. عند استخدامه مع \fBMCL_FUTURE\fP، ستُوضع علامة على جميع التعيينات المستقبلية لقفل الصفحات عند إدخالها بخطأ، لكنها لن تُملأ بالقفل عند إنشاء التعيين. يجب استخدام \fBMCL_ONFAULT\fP مع إما \fBMCL_CURRENT\fP أو \fBMCL_FUTURE\fP أو كليهما. .P إذا حُدد \fBMCL_FUTURE\fP، فقد يفشل استدعاء نظام لاحق (مثل \fBmmap\fP(2) أو \fBsbrk\fP(2) أو \fBmalloc\fP(3)) إذا تسبب في تجاوز عدد البايتات المقفلة الحد الأقصى المسموح به (انظر أدناه). في نفس الظروف، قد يفشل نمو المكدس بالمثل: سترفض النواة توسيع المكدس وترسل إشارة \fBSIGSEGV\fP إلى العملية. .P \fBmunlockall\fP() تفتح جميع الصفحات المعينة في مساحة العنوان لعملية الاستدعاء. .SH "قيمة الإرجاع" عند النجاح، تعيد استدعاءات النظام هذه 0. عند الخطأ، يُرجع \-1، ويُعين \fIerrno\fP للإشارة إلى الخطأ، ولا يُجرى أي تغييرات على أي أقفال في مساحة العنوان للعملية. .SH الأخطاء .\"SVr4 documents an additional EAGAIN error code. .TP \fBEAGAIN\fP (\fBmlock\fP() و \fBmlock2\fP() و \fBmunlock\fP()) لا يمكن قفل بعض أو كل نطاق العنوان المحدد. .TP \fBEINVAL\fP (\fBmlock\fP() و \fBmlock2\fP() و \fBmunlock\fP()) كانت نتيجة الجمع \fIaddr\fP+\fIsize\fP أقل من \fIaddr\fP (على سبيل المثال، قد يكون الجمع قد أدى إلى تجاوز). .TP \fBEINVAL\fP (\fBmlock2\fP()) حُدد \fIflags\fP غير معروفة. .TP \fBEINVAL\fP (\fBmlockall\fP()) حُدد \fIflags\fP غير معروفة أو حُدد \fBMCL_ONFAULT\fP دون \fBMCL_FUTURE\fP أو \fBMCL_CURRENT\fP. .TP \fBEINVAL\fP (ليس على لينكس) \fIaddr\fP لم يكن مضاعفًا لحجم الصفحة. .TP \fBENOMEM\fP (\fBmlock\fP(), \fBmlock2\fP(), و \fBmunlock\fP()) بعض نطاق العناوين المحدد لا يتوافق مع صفحات معينة في مساحة عنوان العملية. .TP \fBENOMEM\fP .\" I.e., the number of VMAs would exceed the 64kB maximum (\fBmlock\fP(), \fBmlock2\fP(), و \fBmunlock\fP()) قفل أو فتح منطقة سيؤدي إلى تجاوز العدد الإجمالي للتعيينات ذات السمات المميزة (مثل المقفلة مقابل غير المقفلة) الحد الأقصى المسموح به. (على سبيل المثال، فتح نطاق في منتصف تعيين مقفل حاليًا سيؤدي إلى ثلاثة تعيينات: تعيينان مقفلان في كل طرف وتعيين غير مقفل في المنتصف.) .TP \fBENOMEM\fP (لينكس 2.6.9 وما بعده) كان لدى المتصل حد مورد ناعم \fBRLIMIT_MEMLOCK\fP غير صفري، لكنه حاول قفل ذاكرة أكثر مما يسمح به الحد. لا يُرفض هذا الحد إذا كانت العملية مميزة (\fBCAP_IPC_LOCK\fP). .TP \fBENOMEM\fP .\" In the case of mlock(), this check is somewhat buggy: it doesn't .\" take into account whether the to-be-locked range overlaps with .\" already locked pages. Thus, suppose we allocate .\" (num_physpages / 4 + 1) of memory, and lock those pages once using .\" mlock(), and then lock the *same* page range a second time. .\" In the case, the second mlock() call will fail, since the check .\" calculates that the process is trying to lock (num_physpages / 2 + 2) .\" pages, which of course is not true. (MTK, Nov 04, kernel 2.4.28) (لينكس 2.4 وما قبله) حاولت العملية المتصلة قفل أكثر من نصف ذاكرة الوصول العشوائي. .TP \fBEPERM\fP المتصل ليس مميزًا، لكنه يحتاج إلى امتياز (\fBCAP_IPC_LOCK\fP) لتنفيذ العملية المطلوبة. .TP \fBEPERM\fP (\fBmunlockall\fP()) (لينكس 2.6.8 وما قبله) لم يكن المتصل مميزًا (\fBCAP_IPC_LOCK\fP). .SH الإصدارات .SS لينكس تحت لينكس، \fBmlock\fP()، \fBmlock2\fP()، و \fBmunlock\fP() تقوم آليًا بتقريب \fIaddr\fP لأسفل إلى أقرب حد صفحة. ومع ذلك، تسمح مواصفات POSIX.1 لـ \fBmlock\fP() و \fBmunlock\fP() للتنفيذ بأن يتطلب محاذاة \fIaddr\fP للصفحة، لذا يجب على التطبيقات المحمولة ضمان ذلك. .P حقل \fIVmLck\fP في ملف \fI/proc/\fPpid\fI/status\fP الخاص بلينكس يظهر عدد الكيلوبايتات من الذاكرة التي قامت العملية ذات المعرف \fIPID\fP بقفلها باستخدام \fBmlock\fP()، \fBmlock2\fP()، \fBmlockall\fP()، و \fBmmap\fP(2) \fBMAP_LOCKED\fP. .SH المعايير .TP \fBmlock\fP() .TQ \fBmunlock\fP() .TQ \fBmlockall\fP() .TQ \fBmunlockall\fP() POSIX.1\-2024. .TP \fBmlock2\fP() لينكس. .P على أنظمة POSIX التي تتوفر فيها \fBmlock\fP() و \fBmunlock\fP()، تُعرف \fB_POSIX_MEMLOCK_RANGE\fP في \fI\fP ويمكن تحديد عدد البايتات في الصفحة من الثابت \fBPAGESIZE\fP (إذا تم تعريفه) في \fI\fP أو عن طريق استدعاء \fIsysconf(_SC_PAGESIZE)\fP. .P .\" POSIX.1-2001: It shall be defined to -1 or 0 or 200112L. .\" -1: unavailable, 0: ask using sysconf(). .\" glibc defines it to 1. على أنظمة POSIX التي تتوفر فيها \fBmlockall\fP() و \fBmunlockall\fP()، تُعرف \fB_POSIX_MEMLOCK\fP في \fI\fP بقيمة أكبر من 0. (انظر أيضًا \fBsysconf\fP(3).) .SH التاريخ .TP \fBmlock\fP() .TQ \fBmunlock\fP() .TQ \fBmlockall\fP() .TQ \fBmunlockall\fP() SVr4, POSIX.1\-1996. .TP \fBmlock2\fP() لينكس 4.4، glibc 2.27. .SH ملاحظات لقفل الذاكرة تطبيقان رئيسيان: الخوارزميات في الوقت الفعلي ومعالجة البيانات عالية الأمان. تتطلب التطبيقات في الوقت الفعلي توقيتًا حتميًا، ومثل الجدولة، فإن الترحيل هو أحد الأسباب الرئيسية لتأخيرات تنفيذ البرنامج غير المتوقعة. عادةً ما تتحول التطبيقات في الوقت الفعلي أيضًا إلى جدولة في الوقت الفعلي باستخدام \fBsched_setscheduler\fP(2). غالبًا ما تتعامل برامج الأمان المشفرة مع البايتات الحرجة مثل كلمات السر أو المفاتيح السرية كهياكل بيانات. نتيجة للترحيل، يمكن نقل هذه الأسرار إلى وسيط تخزين مبادلة دائم، حيث قد تكون قابلة للوصول للعدو بعد وقت طويل من قيام برنامج الأمان بمسح الأسرار في ذاكرة الوصول العشوائي وإنهائه. (لكن كن على علم أن وضع الإيقاف المؤقت على أجهزة الكمبيوتر المحمولة وبعض أجهزة الكمبيوتر المكتبية سيحفظ نسخة من ذاكرة الوصول العشوائي للنظام على القرص، بغض النظر عن أقفال الذاكرة.) .P يجب على العمليات في الوقت الفعلي التي تستخدم \fBmlockall\fP() لمنع التأخيرات في أخطاء الصفحات أن تحجز صفحات مكدس مقفلة كافية قبل الدخول إلى القسم الحرج زمنيًا، بحيث لا يمكن أن يحدث أي خطأ صفحة بسبب استدعاءات الدوال. يمكن تحقيق ذلك عن طريق استدعاء دالة تخصص متغيرًا آليًا كبيرًا بما يكفي (مصفوفة) وتكتب إلى الذاكرة التي تشغلها هذه المصفوفة من أجل لمس صفحات المكدس هذه. بهذه الطريقة، ستُتعين صفحات كافية للمكدس ويمكن قفلها في ذاكرة الوصول العشوائي. تضمن عمليات الكتابة الوهمية عدم حدوث حتى أخطاء صفحات النسخ عند الكتابة في القسم الحرج. .P لا تُورث أقفال الذاكرة إلى عملية فرعية تم إنشاؤها عبر \fBfork\fP(2) وتُزال آليًا (فتحها) أثناء \fBexecve\fP(2) أو عند إنهاء العملية. إعدادات \fBmlockall\fP() \fBMCL_FUTURE\fP و \fBMCL_FUTURE | MCL_ONFAULT\fP لا تُورث إلى عملية فرعية مُنشأة عبر \fBfork\fP(2) وتُمسح أثناء \fBexecve\fP(2). .P لاحظ أن \fBfork\fP(2) ستحضر مساحة العنوان لعملية نسخ عند الكتابة. النتيجة هي أن أي وصول للكتابة يليه سيسبب خطأ صفحة والذي بدوره قد يسبب زمن استجابة مرتفعًا لعملية في الوقت الفعلي. لذلك، من الضروري عدم استدعاء \fBfork\fP(2) بعد عملية \fBmlockall\fP() أو \fBmlock\fP()\[em]ولا حتى من خيط يعمل بأولوية منخفضة داخل عملية تحتوي أيضًا على خيط يعمل بأولوية مرتفعة. .P يُزال قفل الذاكرة على نطاق عنوان آليًا إذا أُلغي تعيين نطاق العنوان عبر \fBmunmap\fP(2). .P لا تتراكم أقفال الذاكرة، أي أن الصفحات التي أُقفلت عدة مرات عن طريق استدعاءات \fBmlock\fP()، \fBmlock2\fP()، أو \fBmlockall\fP() ستُفتح باستدعاء واحد لـ \fBmunlock\fP() للنطاق المقابل أو بواسطة \fBmunlockall\fP(). تبقى الصفحات التي عُينت لعدة مواقع أو بواسطة عدة عمليات مقفلة في ذاكرة الوصول العشوائي طالما أنها مقفلة على الأقل في موقع واحد أو بواسطة عملية واحدة على الأقل. .P إذا تبع استدعاء لـ \fBmlockall\fP() يستخدم العلم \fBMCL_FUTURE\fP استدعاء آخر لا يحدد هذا العلم، فستفقد التغييرات التي أجراها استدعاء \fBMCL_FUTURE\fP. .P يسمح علم \fBmlock2\fP() \fBMLOCK_ONFAULT\fP وعلم \fBmlockall\fP() \fBMCL_ONFAULT\fP بقفل ذاكرة فعال للتطبيقات التي تتعامل مع تعيينات كبيرة حيث يُلمس جزء (صغير) فقط من الصفحات في التعيين. في مثل هذه الحالات، سيتسبب قفل جميع الصفحات في تعيين في عقوبة كبيرة لقفل الذاكرة. .SS "الحدود والأذونات" في لينكس 2.6.8 وما قبله، يجب أن تكون العملية مميزة (\fBCAP_IPC_LOCK\fP) من أجل قفل الذاكرة ويحدد حد المورد الناعم \fBRLIMIT_MEMLOCK\fP حدًا على مقدار الذاكرة التي قد تقفلها العملية. .P منذ لينكس 2.6.9، لا تُوضع حدود على مقدار الذاكرة التي يمكن لعملية مميزة قفلها وبدلاً من ذلك يحدد حد المورد الناعم \fBRLIMIT_MEMLOCK\fP حدًا على مقدار الذاكرة التي قد تقفلها عملية غير مميزة. .SH العلل .\" commit 0cf2f6f6dc605e587d2c1120f295934c77e810e8 في لينكس 4.8 وما قبله، تسبب خطأ في محاسبة النواة للذاكرة المقفلة للعمليات غير المميزة (أي، بدون \fBCAP_IPC_LOCK\fP) في أنه إذا تداخلت المنطقة المحددة بواسطة \fIaddr\fP و \fIsize\fP مع قفل موجود، فإن البايتات المقفلة بالفعل في المنطقة المتداخلة كانت تُحسب مرتين عند التحقق من الحد. يمكن أن يؤدي هذا الحساب المزدوج إلى حساب غير صحيح لقيمة "الذاكرة المقفلة الإجمالية" للعملية التي تجاوزت حد \fBRLIMIT_MEMLOCK\fP، مما يؤدي إلى فشل \fBmlock\fP() و \fBmlock2\fP() في الطلبات التي كان يجب أن تنجح. أُصلح هذا الخطأ في لينكس 4.9. .P في سلسلة نواة لينكس 2.4 حتى لينكس 2.4.17، تسبب خطأ في توريث علامة \fBmlockall\fP() \fBMCL_FUTURE\fP عبر \fBfork\fP(2). صُحح هذا في لينكس 2.4.18. .P .\" See the following LKML thread: .\" http://marc.theaimsgroup.com/?l=linux-kernel&m=113801392825023&w=2 .\" "Rationale for RLIMIT_MEMLOCK" .\" 23 Jan 2006 منذ لينكس 2.6.9، إذا استدعت عملية مميزة \fImlockall(MCL_FUTURE)\fP ثم تخلت عن الامتيازات (فقدت قدرة \fBCAP_IPC_LOCK\fP عن طريق، على سبيل المثال، تعيين UID الفعال إلى قيمة غير صفرية)، فإن تخصيصات الذاكرة اللاحقة (مثل \fBmmap\fP(2)، \fBbrk\fP(2)) ستفشل إذا واجهت حد مورد \fBRLIMIT_MEMLOCK\fP. .SH "انظر أيضًا" \fBmincore\fP(2)، \fBmmap\fP(2)، \fBsetrlimit\fP(2)، \fBshmctl\fP(2)، \fBsysconf\fP(3)، \fBproc\fP(5)، \fBcapabilities\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 .