.\" -*- coding: UTF-8 -*- .\" Copyright 1996, Tom Bjorkholm .\" 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 mremap 2 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم mremap \- إعادة تعيين عنوان ذاكرة افتراضية .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#define _GNU_SOURCE\fP /* انظر feature_test_macros(7) */ \fB#include \fP .P \fBvoid *mremap(\fPsize_t old_size; \fB void \fP\fIold_address\fP\fB[\fP\fIold_size\fP\fB], size_t \fP\fIold_size\fP\fB,\fP \fB size_t \fP\fInew_size\fP\fB, int \fP\fIflags\fP\fB, ... /* void *\fP\fInew_address\fP\fB */);\fP .fi .SH الوصف توسع \fBmremap\fP() (أو تقلص) تعيين ذاكرة موجود، مع إمكانية نقله في نفس الوقت (يُتحكم به بواسطة وسيط \fIflags\fP ومساحة العنوان الافتراضية المتاحة). .P يمكن أيضًا نقل التعيينات ببساطة (بدون أي تغيير في الحجم) عن طريق تحديد \fIold_size\fP و\fInew_size\fP متساويين واستخدام العلم \fBMREMAP_FIXED\fP (انظر أدناه). منذ Linux 6.17، بينما يجب أن يكون \fIold_address\fP معينًا، قد يمتد \fIold_size\fP عبر تعيينات متعددة بما في ذلك المناطق غير المعينة بينها عند إجراء نقل بسيط. يمكن أيضًا تحديد العلم \fBMREMAP_DONTUNMAP\fP. .P بالمثل، إذا كانت العملية تقوم بتقليص، أي إذا كان \fIold_size\fP أكبر من \fInew_size\fP، فقد يمتد \fIold_size\fP أيضًا عبر تعيينات متعددة، والتي لا يجب أن تكون متجاورة مع بعضها البعض. إذا تم هذا التقليص في المكان، أي لم يُحدد \fBMREMAP_FIXED\fP ولا \fBMREMAP_DONTUNMAP\fP، فقد يمتد \fInew_size\fP أيضًا عبر VMAs متعددة. ومع ذلك، إذا نُقل النطاق، فيجب أن يمتد \fInew_size\fP عبر تعيين واحد فقط. .P إذا لم تكن العملية نقلًا باستخدام \fBMREMAP_FIXED\fP ولا تقليصًا، فيجب أن يمتد \fIold_size\fP عبر تعيين واحد فقط. .P \fIold_address\fP هو العنوان القديم لأول كتلة ذاكرة افتراضية تريد توسيعها أو تقليصها و/أو نقلها. لاحظ أن \fIold_address\fP يجب أن يكون محاذيًا للصفحة. \fIold_size\fP هو حجم النطاق الذي يحتوي على كتل الذاكرة الافتراضية المراد معالجتها. \fInew_size\fP هو الحجم المطلوب لكتل الذاكرة الافتراضية بعد تغيير الحجم. يمكن توفير وسيط خامس اختياري، \fInew_address\fP؛ انظر وصف \fBMREMAP_FIXED\fP أدناه. .P إذا كانت قيمة \fIold_size\fP صفرًا، وكان \fIold_address\fP يشير إلى تعيين قابل للمشاركة (انظر وصف \fBMAP_SHARED\fP في \fBmmap\fP(2))، فستقوم \fBmremap\fP() بإنشاء تعيين جديد لنفس الصفحات. سيكون \fInew_size\fP هو حجم التعيين الجديد ويمكن تحديد موقع التعيين الجديد باستخدام \fInew_address\fP؛ انظر وصف \fBMREMAP_FIXED\fP أدناه. إذا طُلب تعيين جديد عبر هذه الطريقة، فيجب أيضًا تحديد العلم \fBMREMAP_MAYMOVE\fP. .P قد يكون وسيط قناع البت \fIflags\fP 0، أو يتضمن الأعلام التالية: .TP \fBMREMAP_MAYMOVE\fP بشكل مبدئي، إذا لم تكن هناك مساحة كافية لتوسيع تعيين في موقعه الحالي، تفشل \fBmremap\fP(). إذا حُدد هذا العلم، يُسمح للنواة بنقل التعيين إلى عنوان افتراضي جديد، إذا لزم الأمر. إذا نُقل التعيين، تصبح المؤشرات المطلقة إلى موقع التعيين القديم غير صالحة (يجب استخدام الإزاحات النسبية لعنوان بداية التعيين). .TP \fBMREMAP_FIXED\fP (منذ Linux 2.3.31) يخدم هذا العلم غرضًا مشابهًا للعلم \fBMAP_FIXED\fP الخاص بـ \fBmmap\fP(2). إذا حُدد هذا العلم، تقبل \fBmremap\fP() وسيطًا خامسًا، \fIvoid\ *new_address\fP، والذي يحدد عنوانًا محاذيًا للصفحة يجب نقل التعيين إليه. يُلغى تعيين أي تعيين سابق في نطاق العنوان المحدد بواسطة \fInew_address\fP و\fInew_size\fP. .IP إذا حُدد \fBMREMAP_FIXED\fP، فيجب أيضًا تحديد \fBMREMAP_MAYMOVE\fP. .IP منذ Linux 6.17، إذا كان \fIold_size\fP مساويًا لـ \fInew_size\fP وحُدد \fBMREMAP_FIXED\fP، فقد يمتد \fIold_size\fP إلى ما وراء التعيين الذي يوجد فيه \fIold_address\fP. في هذه الحالة، يُحافظ على الفجوات بين التعيينات في النطاق الأصلي في النطاق الجديد. تُنفذ العملية بأكملها بشكل ذري ما لم ينشأ خطأ، وفي هذه الحالة قد تكتمل العملية جزئيًا، أي قد تُنقل بعض التعيينات والبعض الآخر لا. .IP لا يُسمح بنقل تعيينات متعددة إذا سُجل أي من تلك التعيينات مع \fBuserfaultfd\fP(2)، أو تعيين برامج تشغيل تحدد منطق تعيين العناوين المخصص الخاص بها. .TP \fBMREMAP_DONTUNMAP\fP (منذ Linux 5.7) .\" commit e346b3813067d4b17383f975f197a9aa28a3b077 يعيد هذا العلم، الذي يجب استخدامه بالتزامن مع \fBMREMAP_MAYMOVE\fP، تعيين التعيينات إلى عنوان جديد ولكنه لا يلغي تعيينها من عنوانها الأصلي. .IP يمكن استخدام العلم \fBMREMAP_DONTUNMAP\fP فقط مع التعيينات التي ليست \fBVM_DONTEXPAND\fP أو \fBVM_PFNMAP\fP. قبل Linux 5.13، كان يمكن استخدام العلم \fBMREMAP_DONTUNMAP\fP فقط مع التعيينات الخاصة المجهولة (انظر وصف \fBMAP_PRIVATE\fP و\fBMAP_ANONYMOUS\fP في \fBmmap\fP(2)). .IP بعد الإكمال، أي وصول إلى النطاق المحدد بواسطة \fIold_address\fP و\fIold_size\fP سيؤدي إلى خطأ صفحة. سيُعالج خطأ الصفحة بواسطة معالج \fBuserfaultfd\fP(2) إذا كان العنوان في نطاق سُجل مسبقًا مع \fBuserfaultfd\fP(2). بخلاف ذلك، تخصص النواة صفحة مملوءة بالأصفار لمعالجة الخطأ. .IP يمكن استخدام العلم \fBMREMAP_DONTUNMAP\fP لنقل تعيين بشكل ذري مع ترك المصدر معينًا. انظر الملاحظات لبعض التطبيقات الممكنة لـ \fBMREMAP_DONTUNMAP\fP. .P إذا كانت مقاطع الذاكرة المحددة بواسطة \fIold_address\fP و\fIold_size\fP مقفلة (باستخدام \fBmlock\fP(2) أو ما شابه)، فسيُحافظ على هذا القفل عند تغيير حجم المقاطع و/أو نقلها. ونتيجة لذلك، قد تتغير كمية الذاكرة المقفلة بواسطة العملية. .SH "قيمة الإرجاع" عند النجاح، تُرجع \fBmremap\fP() مؤشرًا إلى منطقة الذاكرة الافتراضية الجديدة. عند الخطأ، تُرجع القيمة \fBMAP_FAILED\fP (أي \fI(void\ *)\ \-1\fP)، ويُعين \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء .TP \fBEAGAIN\fP حاول المستدعي توسيع مقطع ذاكرة مقفل، لكن هذا لم يكن ممكنًا دون تجاوز حد المورد \fBRLIMIT_MEMLOCK\fP. .TP \fBEFAULT\fP بعض العناوين في النطاق من \fIold_address\fP إلى \fIold_address\fP+\fIold_size\fP هو عنوان ذاكرة افتراضية غير صالح لهذه العملية. يمكنك أيضًا الحصول على \fBEFAULT\fP حتى إذا كانت هناك تعيينات تغطي مساحة العنوان المطلوبة بالكامل، لكن تلك التعيينات من أنواع مختلفة، ولا تدعم عملية \fBmremap\fP() المُنفذة هذا. .TP \fBEINVAL\fP أُعطي وسيط غير صالح. الأسباب المحتملة هي: .RS .IP \[bu] 3 \fIold_address\fP لم يكن محاذيًا للصفحة؛ .IP \[bu] حُدد قيمة غير \fBMREMAP_MAYMOVE\fP أو \fBMREMAP_FIXED\fP أو \fBMREMAP_DONTUNMAP\fP في \fIflags\fP؛ .IP \[bu] \fInew_size\fP كان صفرًا؛ .IP \[bu] \fInew_size\fP أو \fInew_address\fP كان غير صالح؛ .IP \[bu] نطاق العنوان الجديد المحدد بواسطة \fInew_address\fP و \fInew_size\fP تداخل مع نطاق العنوان القديم المحدد بواسطة \fIold_address\fP و \fIold_size\fP؛ .IP \[bu] حُدد \fBMREMAP_FIXED\fP أو \fBMREMAP_DONTUNMAP\fP دون تحديد \fBMREMAP_MAYMOVE\fP أيضًا؛ .IP \[bu] حُدد \fBMREMAP_DONTUNMAP\fP، لكن صفحة واحدة أو أكثر في النطاق المحدد بواسطة \fIold_address\fP و \fIold_size\fP لم تكن خاصة مجهولة؛ .IP \[bu] حُدد \fBMREMAP_DONTUNMAP\fP و \fIold_size\fP لم يكن مساويًا لـ \fInew_size\fP؛ .IP \[bu] \fIold_size\fP كان صفرًا و \fIold_address\fP لا يشير إلى تعيين قابل للمشاركة (لكن انظر الأخطاء)؛ .IP \[bu] \fIold_size\fP كان صفرًا ولم يُحدد العلم \fBMREMAP_MAYMOVE\fP. .RE .TP \fBENOMEM\fP لم تكن ذاكرة كافية متاحة لإكمال العملية. الأسباب المحتملة هي: .RS .IP \[bu] 3 لا يمكن توسيع منطقة الذاكرة في العنوان الافتراضي الحالي، والعلم \fBMREMAP_MAYMOVE\fP غير مضبوط في \fIflags\fP. أو، لا توجد ذاكرة (افتراضية) كافية متاحة. .IP \[bu] اُستخدمت \fBMREMAP_DONTUNMAP\fP مما تسبب في إنشاء تعيين جديد يتجاوز الذاكرة (الافتراضية) المتاحة. أو، سيتجاوز الحد الأقصى لعدد التعيينات المسموح بها. .RE .SH المعايير لينكس. .SH التاريخ .\" 4.2BSD had a (never actually implemented) .\" .BR mremap (2) .\" call with completely different semantics. .\" .P قبل glibc 2.4، لم يكشف glibc عن تعريف \fBMREMAP_FIXED\fP، ولم يسمح النموذج الأولي لـ \fBmremap\fP() بالوسيطة \fInew_address\fP. .SH ملاحظات تغير \fBmremap\fP() التعيين بين العناوين الافتراضية وصفحات الذاكرة. يمكن استخدام هذا لتنفيذ \fBrealloc\fP(3) فعال جدًا. .P في لينكس، تنقسم الذاكرة إلى صفحات. العملية لديها (واحد أو) عدة مقاطع ذاكرة افتراضية خطية. كل مقطع ذاكرة افتراضية لديه تعيين واحد أو أكثر لصفحات ذاكرة حقيقية (في جدول الصفحات). كل مقطع ذاكرة افتراضية لديه حمايته الخاصة (حقوق الوصول)، والتي قد تسبب انتهاكًا للتجزئة (\fBSIGSEGV\fP) إذا وُصل إلى الذاكرة بشكل غير صحيح (مثل، الكتابة إلى مقطع للقراءة فقط). الوصول إلى الذاكرة الافتراضية خارج المقاطع سيسبب أيضًا انتهاكًا للتجزئة. .P .\" إذا اُستخدمت \fBmremap\fP() لنقل أو توسيع منطقة مقفلة بـ \fBmlock\fP(2) أو ما يعادله، فستبذل استدعاء \fBmremap\fP() أقصى جهد لملء المنطقة الجديدة لكنها لن تفشل بـ \fBENOMEM\fP إذا تعذر ملء المنطقة. .SS "حالات استخدام MREMAP_DONTUNMAP" التطبيقات الممكنة لـ \fBMREMAP_DONTUNMAP\fP تشمل: .IP \[bu] 3 \fBuserfaultfd\fP(2) غير التعاوني: يمكن للتطبيق سحب نطاق عنوان افتراضي باستخدام \fBMREMAP_DONTUNMAP\fP ثم استخدام معالج \fBuserfaultfd\fP(2) للتعامل مع أخطاء الصفحة التي تحدث لاحقًا عندما تلمس خيوط أخرى في العملية صفحات في النطاق المسحوب. .IP \[bu] جمع القمامة: يمكن استخدام \fBMREMAP_DONTUNMAP\fP بالتزامن مع \fBuserfaultfd\fP(2) لتنفيذ خوارزميات جمع القمامة (مثل، في آلة جافا الافتراضية). يمكن أن يكون هذا التنفيذ أرخص (وأبسط) من تقنيات جمع القمامة التقليدية التي تتضمن وضع علامات على الصفحات بحماية \fBPROT_NONE\fP بالتزامن مع استخدام معالج \fBSIGSEGV\fP لالتقاط الوصول إلى تلك الصفحات. .SH العلل .\" commit dba58d3b8c5045ad89c1c95d33d01451e3964db7 قبل لينكس 4.14، إذا كان \fIold_size\fP صفرًا وكان التعيين المشار إليه بـ \fIold_address\fP تعيينًا خاصًا (انظر وصف \fBMAP_PRIVATE\fP في \fBmmap\fP(2))، أنشأت \fBmremap\fP() تعيينًا خاصًا جديدًا غير مرتبط بالتعيين الأصلي. كان هذا السلوك غير مقصود وربما غير متوقع في تطبيقات مساحة المستخدم (لأن هدف \fBmremap\fP() هو إنشاء تعيين جديد بناءً على التعيين الأصلي). منذ لينكس 4.14، تفشل \fBmremap\fP() مع الخطأ \fBEINVAL\fP في هذا السيناريو. .SH "انظر أيضًا" \fBbrk\fP(2), \fBgetpagesize\fP(2), \fBgetrlimit\fP(2), \fBmlock\fP(2), \fBmmap\fP(2), \fBsbrk\fP(2), \fBmalloc\fP(3), \fBrealloc\fP(3) .P كتابك المدرسي المفضل عن أنظمة التشغيل لمزيد من المعلومات حول الذاكرة المقسمة إلى صفحات (مثل، \fIModern Operating Systems\fP بقلم Andrew S.\& Tanenbaum، \fIInside Linux\fP بقلم Randolph Bentson، \fIThe Design of the UNIX Operating System\fP بقلم Maurice J.\& Bach) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي و # . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .