.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 1996, Andries E. Brouwer .\" Copyright 2006-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 mmap 2 "19 مارس 2026" "صفحات دليل لينكس 6.18" .SH الاسم mmap، munmap \- يخطط أو يفصل الملفات أو الأجهزة في الذاكرة .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBvoid *mmap(\fPsize_t length; \fB void \fP\fIaddr\fP\fB[\fP\fIlength\fP\fB], size_t \fP\fIlength\fP\fB, int \fP\fIprot\fP\fB, int \fP\fIflags\fP\fB,\fP \fB int \fP\fIfd\fP\fB, off_t \fP\fIoffset\fP\fB);\fP \fBint munmap(\fPsize_t length; \fB void \fP\fIaddr\fP\fB[\fP\fIlength\fP\fB], size_t \fP\fIlength\fP\fB);\fP .fi .P انظر VERSIONS للحصول على معلومات حول متطلبات ماكرو اختبار الميزات. .SH الوصف تُنشئ \fBmmap\fP() تخطيطًا جديدًا في مساحة العناوين الافتراضية للعملية المستدعِية. يُحدد العنوان الابتدائي للتخطيط الجديد في \fIaddr\fP. يُحدد المعامل \fIlength\fP طول التخطيط (الذي يجب أن يكون أكبر من 0). .P .\" Before Linux 2.6.24, the address was rounded up to the next page .\" boundary; since Linux 2.6.24, it is rounded down! إذا كان \fIaddr\fP هو NULL، فإن النواة تختار العنوان (المحاذي للصفحة) الذي ستُنشئ التخطيط عنده؛ وهذه هي الطريقة الأكثر قابلية للنقل لإنشاء تخطيط جديد. أما إذا لم يكن \fIaddr\fP هو NULL، فإن النواة تعتبره تلميحًا حول مكان وضع التخطيط؛ وفي لينكس، ستختار النواة حدود صفحة قريبة (ولكن دائمًا أعلى من أو تساوي القيمة المحددة في \fI/proc/sys/vm/mmap_min_addr\fP) وتحاول إنشاء التخطيط هناك. وإذا وجد تخطيط آخر هناك بالفعل، تختار النواة عنوانًا جديدًا قد يعتمد أو لا يعتمد على التلميح. ويُعاد عنوان التخطيط الجديد كناتج للاستدعاء. .P تُهيأ محتويات تخطيط الملف (على عكس التخطيط المجهول؛ انظر \fBMAP_ANONYMOUS\fP أدناه)، باستخدام بايتات بطول \fIlength\fP بدءًا من الإزاحة \fIoffset\fP في الملف (أو أي كائن آخر) المشار إليه بواسطة واصف الملف \fIfd\fP. يجب أن تكون \fIoffset\fP مضاعفًا لحجم الصفحة كما يعيده \fIsysconf(_SC_PAGE_SIZE)\fP. .P بعد عودة استدعاء \fBmmap\fP()، يمكن إغلاق واصف الملف، \fIfd\fP، فورًا دون إبطال التخطيط. .P يصف المعامل \fIprot\fP حماية الذاكرة المطلوبة للتخطيط (ويجب ألا يتعارض مع وضع فتح الملف). وهو إما \fBPROT_NONE\fP أو ناتج عملية OR الثنائية لعلامة أو أكثر من العلامات التالية: .TP 1.1i \fBPROT_EXEC\fP يمكن تنفيذ الصفحات. .TP \fBPROT_READ\fP يمكن قراءة الصفحات. .TP \fBPROT_WRITE\fP يمكن الكتابة في الصفحات. .TP \fBPROT_NONE\fP .\" لا يمكن الوصول إلى الصفحات. .SS "معامل العلامات (flags)" يحدد المعامل \fIflags\fP ما إذا كانت التحديثات على التخطيط مرئية للعمليات الأخرى التي تخطط نفس المنطقة، وما إذا كانت التحديثات تُنقل إلى الملف الأساسي. ويُحدد هذا السلوك بتضمين قيمة واحدة فقط من القيم التالية في \fIflags\fP: .TP \fBMAP_SHARED\fP مشاركة هذا التخطيط. تكون التحديثات على التخطيط مرئية للعمليات الأخرى التي تخطط نفس المنطقة، و(في حالة التخطيطات المدعومة بملفات) تُنقل إلى الملف الأساسي. (يتطلب التحكم الدقيق في وقت نقل التحديثات إلى الملف الأساسي استخدام \fBmsync\fP(2)). .TP \fBMAP_SHARED_VALIDATE\fP (منذ لينكس 4.15) توفر هذه العلامة نفس سلوك \fBMAP_SHARED\fP باستثناء أن تخطيطات \fBMAP_SHARED\fP تتجاهل العلامات غير المعروفة في \fIflags\fP. وبالمقابل، عند إنشاء تخطيط باستخدام \fBMAP_SHARED_VALIDATE\fP، تتحقق النواة من أن جميع العلامات الممرة معروفة وتُفشل التخطيط بالخطأ \fBEOPNOTSUPP\fP للعلامات غير المعروفة. كما أن هذا النوع من التخطيط مطلوب للتمكن من استخدام بعض علامات التخطيط (مثل \fBMAP_SYNC\fP). .TP \fBMAP_PRIVATE\fP إنشاء تخطيط خاص بنظام النسخ عند الكتابة (copy\-on\-write). لا تكون التحديثات على التخطيط مرئية للعمليات الأخرى التي تخطط نفس الملف، ولا تُنقل إلى الملف الأساسي. وغير محدد ما إذا كانت التغييرات التي أُجريت على الملف بعد استدعاء \fBmmap\fP() ستكون مرئية في المنطقة المخططة. .P كلا العلامتين \fBMAP_SHARED\fP و \fBMAP_PRIVATE\fP موصوفتان في POSIX.1\-2001 و POSIX.1\-2008. أما \fBMAP_SHARED_VALIDATE\fP فهي امتداد للينكس. .P بالإضافة إلى ذلك، يمكن إجراء عملية OR لصفر أو أكثر من القيم التالية في \fIflags\fP: .TP \fBMAP_32BIT\fP (منذ لينكس 2.4.20، 2.6) .\" See http://lwn.net/Articles/294642 "Tangled up in threads", 19 Aug 08 وضع التخطيط في أول 2 جيجابايت من مساحة عناوين العملية. تدعم هذه العلامة فقط على معمارية x86\-64، للبرامج ذات 64 بت. أُضيفت للسماح بتخصيص كدسات الخيوط في مكان ما ضمن أول 2 جيجابايت من الذاكرة، لتحسين أداء تبديل السياق في بعض معالجات 64 بت المبكرة. لم تعد معالجات x86\-64 الحديثة تعاني من مشكلة الأداء هذه، لذا لا يشترط استخدام هذه العلامة في تلك الأنظمة. تُتجاهل العلامة \fBMAP_32BIT\fP عند ضبط \fBMAP_FIXED\fP. .TP \fBMAP_ANON\fP مرادف لـ \fBMAP_ANONYMOUS\fP؛ توفر للتوافق مع التنفيذات الأخرى. .TP \fBMAP_ANONYMOUS\fP .\" See the pgoff overflow check in do_mmap(). .\" See the offset check in sys_mmap in arch/x86/kernel/sys_x86_64.c. التخطيط غير مدعوم بأي ملف؛ وتُهيأ محتوياته إلى الصفر. يُتجاهل المعامل \fIfd\fP؛ ومع ذلك، تتطلب بعض التنفيذات أن يكون \fIfd\fP مساويًا لـ \-1 إذا حُددت \fBMAP_ANONYMOUS\fP (أو \fBMAP_ANON\fP)، ويجب أن تضمن التطبيقات القابلة للنقل ذلك. يجب أن يكون المعامل \fIoffset\fP صفرًا. أُضيفت دعم \fBMAP_ANONYMOUS\fP مع \fBMAP_SHARED\fP في لينكس 2.4. .TP \fBMAP_DENYWRITE\fP .\" Introduced in 1.1.36, removed in 1.3.24. تُتجاهل هذه العلامة. (منذ زمن بعيد \-لينكس 2.0 وما قبله\- كانت تشير إلى أن محاولات الكتابة إلى الملف الأساسي يجب أن تفشل بالخطأ \fBETXTBSY\fP. ولكن هذا كان مصدرًا لهجمات حجب الخدمة). .TP \fBMAP_EXECUTABLE\fP .\" Introduced in 1.1.38, removed in 1.3.24. Flag tested in proc_follow_link. .\" (Long ago, it signaled that the underlying file is an executable. .\" However, that information was not really used anywhere.) .\" Linus talked about DOS related to MAP_EXECUTABLE, but he was thinking of .\" MAP_DENYWRITE? تُتجاهل هذه العلامة. .TP \fBMAP_FILE\fP .\" On some systems, this was required as the opposite of .\" MAP_ANONYMOUS -- mtk, 1 May 2007 علامة توافقية. تُتجاهل. .TP \fBMAP_FIXED\fP لا تفسر \fIaddr\fP كتلميح: ضع التخطيط عند هذا العنوان تمامًا. يجب محاذاة \fIaddr\fP بشكل مناسب: في معظم المعماريات يكفي أن يكون مضاعفًا لحجم الصفحة؛ ومع ذلك، قد تفرض بعض المعماريات قيودًا إضافية. إذا كانت منطقة الذاكرة المحددة بواسطة \fIaddr\fP و \fIlength\fP تتداخل مع صفحات أي تخطيط (أو تخطيطات) موجودة، فسيُهمل الجزء المتداخل من التخطيط (التخطيطات) الموجودة. إذا تعذر استخدام العنوان المحدد، فستفشل \fBmmap\fP(). .IP يجب على البرمجيات التي تطمح لأن تكون قابلة للنقل استخدام العلامة \fBMAP_FIXED\fP بحذر، مع الأخذ في الاعتبار أنه يُسمح بتغيير المخطط الدقيق لتخطيطات ذاكرة العملية بشكل كبير بين إصدارات لينكس، وإصدارات مكتبة سي، وإصدارات أنظمة التشغيل. \fIاقرأ بعناية مناقشة هذه العلامة في قسم الملاحظات (NOTES)!\fP .TP \fBMAP_FIXED_NOREPLACE\fP (منذ لينكس 4.17) .\" commit a4ff8e8620d3f4f50ac4b41e8067b7d395056843 توفر هذه العلامة سلوكًا مشابهًا لـ \fBMAP_FIXED\fP فيما يتعلق بفرض العنوان \fIaddr\fP، ولكنها تختلف في أن \fBMAP_FIXED_NOREPLACE\fP لا تمسح أبدًا أي نطاق مخطط مسبقًا. إذا اصطدم النطاق المطلوب مع تخطيط موجود، فإن هذا الاستدعاء يفشل بالخطأ \fBEEXIST\fP. لذا يمكن استخدام هذه العلامة كوسيلة لمحاولة تخطيط نطاق عناوين بشكل ذري (فيما يتعلق بالخيوط الأخرى): سينجح خيط واحد؛ وستبلغ جميع الخيوط الأخرى عن الفشل. .IP لاحظ أن النوى القديمة التي لا تتعرف على العلامة \fBMAP_FIXED_NOREPLACE\fP ستتراجع عادةً (عند اكتشاف تصادم مع تخطيط موجود مسبقًا) إلى سلوك من نوع "غير \fBMAP_FIXED\fP": حيث ستعيد عنوانًا يختلف عن العنوان المطلوب. لذا، يجب على البرمجيات المتوافقة مع الإصدارات السابقة التحقق من العنوان المعاد ومقارنته بالعنوان المطلوب. .TP \fBMAP_GROWSDOWN\fP يُستخدم هذا العلامة في المكدسات. وهي تشير إلى نظام الذاكرة الافتراضية في النواة بأن التعيين يجب أن يمتد لأسفل في الذاكرة. وسيؤدي الوصول إلى عنوان في صفحة ”الحماية“ الموجودة أسفل التعيين إلى توسيع التعيين بمقدار صفحة واحدة. ويمكن تكرار هذا التوسيع حتى يصل التعيين إلى مسافة صفحة واحدة من الطرف الأعلى للتعيين الأدنى التالي، وعند هذه النقطة سيؤدي الوصول إلى صفحة ”الحماية“ إلى إصدار إشارة \fBSIGSEGV\fP. .TP \fBMAP_HUGETLB\fP (منذ لينكس 2.6.32) تخصيص التخطيط باستخدام الصفحات "الضخمة". انظر ملف مصدر نواة لينكس \fIDocumentation/admin\-guide/mm/hugetlbpage.rst\fP لمزيد من المعلومات، بالإضافة إلى قسم الملاحظات (NOTES) أدناه. .TP \fBMAP_HUGE_2MB\fP .TQ \fBMAP_HUGE_1GB\fP (منذ لينكس 3.8) .\" See https://lwn.net/Articles/533499/ تُستخدم مع \fBMAP_HUGETLB\fP لاختيار أحجام بديلة لصفحات hugetlb (على التوالي، 2 ميجابايت و 1 جيجابايت) في الأنظمة التي تدعم أحجامًا متعددة لصفحات hugetlb. .IP بشكل عام، يمكن ضبط حجم الصفحة الضخمة المطلوب بترميز اللوغاريتم للأساس 2 لحجم الصفحة المطلوب في البتات الستة عند الإزاحة \fBMAP_HUGE_SHIFT\fP. (قيمة الصفر في حقل البتات هذا توفر حجم الصفحة الضخمة المبدئي؛ يمكن اكتشاف حجم الصفحة الضخمة المبدئي عبر حقل \fIHugepagesize\fP المعروض في \fI/proc/meminfo\fP). وبذلك، يُعرف الثابتان المذكوران أعلاه كالتالي: .IP .in +4n .EX #define MAP_HUGE_2MB (21 << MAP_HUGE_SHIFT) #define MAP_HUGE_1GB (30 << MAP_HUGE_SHIFT) .EE .in .IP يمكن اكتشاف نطاق أحجام الصفحات الضخمة التي يدعمها النظام بسرد الأدلة الفرعية في \fI/sys/kernel/mm/hugepages\fP. .TP \fBMAP_LOCKED\fP (منذ لينكس 2.5.37) .\" If set, the mapped pages will not be swapped out. تعليم المنطقة المخططة لتُقفل بنفس طريقة \fBmlock\fP(2). سيحاول هذا التنفيذ ملء النطاق بالكامل مسبقًا ولكن لا يفشل استدعاء \fBmmap\fP() بالخطأ \fBENOMEM\fP إذا فشل ذلك. لذا قد تحدث أخطاء جسيمة (major faults) لاحقًا. وبذلك فإن الدلالة ليست بقوة \fBmlock\fP(2). يجب استخدام \fBmmap\fP() بالإضافة لـ \fBmlock\fP(2) عندما لا تكون الأخطاء الجسيمة مقبولة بعد تهيئة التخطيط. تُتجاهل العلامة \fBMAP_LOCKED\fP في النوى القديمة. .TP \fBMAP_NONBLOCK\fP (منذ لينكس 2.5.46) .\" commit 54cb8821de07f2ffcd28c380ce9b93d5784b40d7 هذه العلامة ذات معنى فقط عند استخدامها مع \fBMAP_POPULATE\fP. لا تقم بالقراءة المسبقة: أنشئ مدخلات جداول الصفحات فقط للصفحات الموجودة بالفعل في RAM. منذ لينكس 2.6.23، تجعل هذه العلامة \fBMAP_POPULATE\fP لا تفعل شيئًا. قد يُعاد تنفيذ الجمع بين \fBMAP_POPULATE\fP و \fBMAP_NONBLOCK\fP يومًا ما. .TP \fBMAP_NORESERVE\fP عدم حجز مساحة تبديل (swap) لهذا التخطيط. عند حجز مساحة التبديل، يكون هناك ضمان بإمكانية تعديل التخطيط. وعندما لا تُحجز مساحة التبديل، قد تحصل على إشارة \fBSIGSEGV\fP عند الكتابة إذا لم تتوفر ذاكرة فيزيائية. انظر أيضًا مناقشة الملف \fI/proc/sys/vm/overcommit_memory\fP في \fBproc_sys_vm\fP(5). قبل لينكس 2.6، كان لهذه العلامة تأثير فقط على التخطيطات الخاصة القابلة للكتابة. .TP \fBMAP_POPULATE\fP (منذ لينكس 2.5.46) ملء (خطأ مسبق) جداول الصفحات للتخطيط. بالنسبة لتخطيط الملفات، يؤدي هذا للقراءة المسبقة للملف. سيساعد هذا في تقليل الحجب بسبب أخطاء الصفحات لاحقًا. لا يفشل استدعاء \fBmmap\fP() إذا تعذر ملء التخطيط (على سبيل المثال، بسبب قيود على عدد الصفحات الضخمة المخططة عند استخدام \fBMAP_HUGETLB\fP). أُضيفت دعم \fBMAP_POPULATE\fP مع التخطيطات الخاصة في لينكس 2.6.23. .TP \fBMAP_STACK\fP (منذ لينكس 2.6.27) تخصيص التخطيط عند عنوان مناسب لكدسة عملية أو خيط. .IP .\" See http://lwn.net/Articles/294642 "Tangled up in threads", 19 Aug 08 .\" commit cd98a04a59e2f94fa64d5bf1e26498d27427d5e7 .\" http://thread.gmane.org/gmane.linux.kernel/720412 .\" "pthread_create() slow for many threads; also time to revisit 64b .\" context switch optimization?" هذه العلامة حاليًا لا تفعل شيئًا في لينكس. ومع ذلك، باستخدام هذه العلامة، يمكن للتطبيقات ضمان حصولها بشكل شفاف على الدعم إذا نُفذت العلامة في المستقبل. وبذلك، تُستخدم في تنفيذ الخيوط في glibc لمراعاة حقيقة أن بعض المعماريات قد تتطلب (لاحقًا) معاملة خاصة لتخصيصات الكدسة. سبب آخر لاستخدام هذه العلامة هو قابلية النقل: فالعلامة \fBMAP_STACK\fP موجودة (ولها تأثير) في بعض الأنظمة الأخرى (مثل بعض أنظمة BSD). .TP \fBMAP_SYNC\fP (منذ لينكس 4.15) تتوفر هذه العلامة فقط مع نوع التخطيط \fBMAP_SHARED_VALIDATE\fP؛ وستتجاهل التخطيطات من نوع \fBMAP_SHARED\fP هذه العلامة بصمت. تُدعم هذه العلامة فقط للملفات التي تدعم DAX (التخطيط المباشر للذاكرة المستديمة). أما للملفات الأخرى، فإن إنشاء تخطيط بهذه العلامة يؤدي لخطأ \fBEOPNOTSUPP\fP. .IP توفر تخطيطات الملفات المشتركة بهذه العلامة ضمانًا بأنه بينما تكون بعض الذاكرة مخططة كقابلة للكتابة في مساحة عناوين العملية، فإنها ستكون مرئية في نفس الملف عند نفس الإزاحة حتى بعد تعطل النظام أو إعادة تشغيله. وبالتزامن مع استخدام تعليمات CPU المناسبة، يوفر هذا لمستخدمي هذه التخطيطات طريقة أكثر كفاءة لجعل تعديلات البيانات مستديمة. .TP \fBMAP_UNINITIALIZED\fP (منذ لينكس 2.6.33) عدم مسح الصفحات المجهولة. تهدف هذه العلامة لتحسين الأداء في الأجهزة المدمجة. لا تُحترم هذه العلامة إلا إذا ضُبطت النواة بخيار \fBCONFIG_MMAP_ALLOW_UNINITIALIZED\fP. وبسبب الآثار الأمنية، لا يُفعل هذا الخيار عادةً إلا في الأجهزة المدمجة (أي الأجهزة التي يمتلك فيها الشخص تحكمًا كاملاً في محتويات ذاكرة المستخدم). .P .\" FIXME . for later review when Issue 8 is one day released... .\" POSIX may add MAP_ANON in the future .\" http://austingroupbugs.net/tag_view_page.php?tag_id=8 .\" http://austingroupbugs.net/view.php?id=850 من بين العلامات المذكورة أعلاه، حُددت \fBMAP_FIXED\fP فقط في POSIX.1\-2001 و POSIX.1\-2008. ومع ذلك، تدعم معظم الأنظمة أيضًا \fBMAP_ANONYMOUS\fP (أو مرادفها \fBMAP_ANON\fP). .SS munmap() يحذف استدعاء النظام \fBmunmap\fP() التخطيطات لنطاق العناوين المحدد، ويؤدي إلى أن تولد المراجع اللاحقة للعناوين داخل النطاق مراجع ذاكرة غير صالحة. كما يُفصل النطاق آليًا عند إنهاء العملية. ومن ناحية أخرى، فإن إغلاق واصف الملف لا يفصل النطاق. .P يجب أن يكون العنوان \fIaddr\fP مضاعفًا لحجم الصفحة (ولكن \fIlength\fP لا يشترط ذلك). تُفصل جميع الصفحات التي تحتوي على جزء من النطاق المشار إليه، وستولد المراجع اللاحقة لهذه الصفحات إشارة \fBSIGSEGV\fP. ولا يعتبر خطأً إذا لم يحتوي النطاق المشار إليه على أي صفحات مخططة. .SH "قيمة الإرجاع" عند النجاح، تعيد \fBmmap\fP() مؤشرًا إلى المنطقة المخططة. وعند حدوث خطأ، تُعاد القيمة \fBMAP_FAILED\fP (أي \fI(void\ *)\ \-1\fP)، وتُضبط \fIerrno\fP للإشارة إلى الخطأ. .P عند النجاح، تعيد الدالة \fBmunmap\fP() القيمة 0. وعند الفشل، تعيد \-1، وتُضبط قيمة \fIerrno\fP لتبين الخطأ (غالبًا إلى \fBEINVAL\fP). .SH الأخطاء .TP \fBEACCES\fP واصف الملف يشير إلى ملف غير منتظم. أو طُلب تخطيط ملف، ولكن \fIfd\fP ليس مفتوحًا للقراءة. أو طُلب \fBMAP_SHARED\fP وضُبطت \fBPROT_WRITE\fP، ولكن \fIfd\fP ليس مفتوحًا في وضع القراءة/الكتابة (\fBO_RDWR\fP). أو ضُبطت \fBPROT_WRITE\fP، ولكن الملف مخصص للإلحاق فقط. .TP \fBEAGAIN\fP قُفل الملف، أو قُفلت مساحة كبيرة جدًا من الذاكرة (انظر \fBsetrlimit\fP(2)). .TP \fBEBADF\fP \fIfd\fP ليس واصف ملف صالحًا (ولم تُضبط \fBMAP_ANONYMOUS\fP). .TP \fBEEXIST\fP حُددت الراية \fBMAP_FIXED_NOREPLACE\fP في \fIflags\fP، ويتعارض النطاق الذي يغطيه \fIaddr\fP و \fIlength\fP مع تخطيط موجود. .TP \fBEINVAL\fP قيم \fIaddr\fP أو \fIlength\fP أو \fIoffset\fP غير مقبولة (على سبيل المثال، هي كبيرة جدًا، أو غير محاذية لحدود الصفحة). .TP \fBEINVAL\fP (منذ لينكس 2.6.12) كانت قيمة \fIlength\fP هي 0. .TP \fBEINVAL\fP لم تتضمن \fIflags\fP أيًا من \fBMAP_PRIVATE\fP أو \fBMAP_SHARED\fP أو \fBMAP_SHARED_VALIDATE\fP. .TP \fBENFILE\fP .\" This is for shared anonymous segments .\" [2.6.7] shmem_zero_setup()-->shmem_file_setup()-->get_empty_filp() .\" .TP .\" .B ENOEXEC .\" A file could not be mapped for reading. وُصل إلى الحد الأقصى لإجمالي عدد الملفات المفتوحة على مستوى النظام. .TP \fBENODEV\fP نظام ملفات الملف المحدد لا يدعم تخطيط الذاكرة. .TP \fBENOMEM\fP لا توجد ذاكرة متاحة. .TP \fBENOMEM\fP تجاوز العملية للعدد الأقصى من التخطيطات. يمكن أن يحدث هذا الخطأ أيضًا مع \fBmunmap\fP() عند إلغاء تخطيط منطقة في منتصف تخطيط موجود، لأن هذا ينتج عنه تخطيطان أصغر على جانبي المنطقة التي أُلغي تخطيطها. .TP \fBENOMEM\fP (منذ لينكس 4.7) سيتم تجاوز حد \fBRLIMIT_DATA\fP للعملية، الموصوف في \fBgetrlimit\fP(2). .TP \fBENOMEM\fP رُفض العنوان \fIaddr\fP لأنه يتجاوز فضاء العناوين الافتراضية للمعالج. .TP \fBEOVERFLOW\fP في معمارية 32 بت مع امتداد الملفات الكبيرة (أي باستخدام \fIoff_t\fP ذي 64 بت): عدد الصفحات المستخدمة لـ \fIlength\fP بالإضافة لعدد الصفحات المستخدمة لـ \fIoffset\fP سيؤدي لفيض في \fIunsigned long\fP (32 بت). .TP \fBEPERM\fP .\" (Since Linux 2.4.25 / Linux 2.6.0.) تطلب المعطاة \fIprot\fP الصلاحية \fBPROT_EXEC\fP لكن المنطقة المخططة تنتمي إلى ملف في نظام ملفات وُصل بخيار منع التنفيذ no\-exec. .TP \fBEPERM\fP مُنعت العملية بواسطة ختم ملف؛ انظر \fBfcntl\fP(2). .TP \fBEPERM\fP حُددت الراية \fBMAP_HUGETLB\fP، لكن المستدعِي \fBcaller\fP ليس لديه امتيازات (لا يملك القدرة \fBCAP_IPC_LOCK\fP) وليس عضوًا في المجموعة \fIhugetlb_shm_group\fP؛ انظر وصف \fI/proc/sys/vm/hugetlb_shm_group\fP في \fBproc_sys_vm\fP(5). .TP \fBETXTBSY\fP ضُبطت \fBMAP_DENYWRITE\fP ولكن الكائن المحدد بواسطة \fIfd\fP مفتوح للكتابة. .P يمكن أن يؤدي استخدام منطقة مخططة إلى هذه الإشارات: .TP \fBSIGSEGV\fP محاولة الكتابة في منطقة خُططت للقراءة فقط. .TP \fBSIGBUS\fP محاولة الوصول إلى صفحة في المخزن المؤقت تقع خارج نهاية الملف المخطط. للاطلاع على شرح لمعاملة البايتات في الصفحة التي تقابل نهاية ملف مخطط لا يمثل طوله مضاعفًا لحجم الصفحة، انظر قسم ملاحظات NOTES. .SH السمات للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. الواجهة السمة القيمة T{ .na .nh \fBmmap\fP(), \fBmunmap\fP() T} سلامة الخيوط MT\-Safe .TE .SH الإصدارات في بعض معماريات العتاد (مثل i386)، تتضمن الصلاحية \fBPROT_WRITE\fP ضمنيًا \fBPROT_READ\fP. ويعتمد الأمر على المعمارية فيما إذا كانت \fBPROT_READ\fP تتضمن \fBPROT_EXEC\fP أم لا. يجب على البرامج المنقولة تعيين \fBPROT_EXEC\fP دائمًا إذا كانت تنوي تنفيذ كود في التخطيط الجديد. .P الطريقة المنقولة لإنشاء تخطيط هي تحديد \fIaddr\fP بقيمة 0 (NULL)، وحذف \fBMAP_FIXED\fP من \fIflags\fP. في هذه الحالة، يختار النظام عنوان التخطيط؛ ويُختار العنوان بحيث لا يتعارض مع أي تخطيط موجود، ولن يكون 0. إذا حُددت الراية \fBMAP_FIXED\fP وكان \fIaddr\fP هو 0 (NULL)، فسيكون العنوان المخطط 0 (NULL). .P تُعرف ثوابت معينة في \fIflags\fP فقط إذا عُرفت وحدات ماكرو لاختبار الميزات المناسبة (ربما بشكل مبدئي آلي): \fB_DEFAULT_SOURCE\fP مع glibc 2.19 أو أحدث؛ أو \fB_BSD_SOURCE\fP أو \fB_SVID_SOURCE\fP في glibc 2.19 وما قبله. (استخدام \fB_GNU_SOURCE\fP يكفي أيضًا، وكان طلب هذا الماكرو تحديدًا أكثر منطقية، لأن هذه الرايات كلها خاصة بلينكس). الرايات ذات الصلة هي: \fBMAP_32BIT\fP، و \fBMAP_ANONYMOUS\fP (ومرادفها \fBMAP_ANON\fP)، و \fBMAP_DENYWRITE\fP، و \fBMAP_EXECUTABLE\fP، و \fBMAP_FILE\fP، و \fBMAP_GROWSDOWN\fP، و \fBMAP_HUGETLB\fP، و \fBMAP_LOCKED\fP، و \fBMAP_NONBLOCK\fP، و \fBMAP_NORESERVE\fP، و \fBMAP_POPULATE\fP، و \fBMAP_STACK\fP. .SS "الاختلافات بين مكتبة C والنواة" .\" Since around glibc 2.1/2.2, depending on the platform. تصف هذه الصفحة الواجهة التي توفرها دالة الغلاف \fBmmap\fP() في glibc. في الأصل، كانت هذه الدالة تستدعي نداء نظام بنفس الاسم. ومنذ لينكس 2.4، حل نداء النظام \fBmmap2\fP(2) محل هذا النداء، وحاليًا تستدعي دالة غلاف \fBmmap\fP() في glibc نداء \fBmmap2\fP(2) مع قيمة معدلة لـ \fIoffset\fP. .SH المعايير POSIX.1\-2024. .SH التاريخ .\" SVr4 documents additional error codes ENXIO and ENODEV. .\" SUSv2 documents additional error codes EMFILE and EOVERFLOW. SVr4, 4.4BSD, SUSv1, POSIX.1\-1996. .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 التي تتوفر فيها \fBmmap\fP() و \fBmsync\fP(2) و \fBmunmap\fP()، يُعرَّف \fB_POSIX_MAPPED_FILES\fP في \fI\fP بقيمة أكبر من 0. (انظر أيضًا \fBsysconf\fP(3)). .SH ملاحظات تُحفظ الذاكرة المخططة بواسطة \fBmmap\fP() عبر \fBfork\fP(2)، بنفس السمات. .P يُخطط الملف بمضاعفات حجم الصفحة. بالنسبة للملف الذي لا يمثل طوله مضاعفًا لحجم الصفحة، تُصفّر البايتات المتبقية في الصفحة الجزئية في نهاية التخطيط عند التخطيط، ولا تُكتب التعديلات على تلك المنطقة في الملف. إن تأثير تغيير حجم الملف الأساسي للتخطيط على الصفحات التي تقابل المناطق المضافة أو المزالة من الملف غير محدد. .P .\" يمكن للتطبيق تحديد الصفحات من التخطيط الموجودة حاليًا في خبيئة Cache الصفحة/المخزن المؤقت باستخدام \fBmincore\fP(2). .SS "استخدام MAP_FIXED بأمان" الاستخدام الآمن الوحيد لـ \fBMAP_FIXED\fP هو عندما يكون نطاق العناوين المحدد بواسطة \fIaddr\fP و \fIlength\fP قد حُجز مسبقًا باستخدام تخطيط آخر؛ وبخلاف ذلك، فإن استخدام \fBMAP_FIXED\fP يعد خطرًا لأنه يزيل التخطيطات الموجودة مسبقًا قسرًا، مما يسهل على العملية متعددة الخيوط إفساد فضاء عناوينها الخاص. .P على سبيل المثال، افترض أن الخيط A يبحث في \fI/proc/\fPpid\fI/maps\fP لتحديد موقع نطاق عناوين غير مستخدم يمكنه تخطيطه باستخدام \fBMAP_FIXED\fP، بينما يحصل الخيط B في الوقت نفسه على جزء من نفس نطاق العناوين هذا أو كله. عندما يستخدم الخيط A لاحقًا \fBmmap(MAP_FIXED)\fP، فإنه سيمحو فعليًا التخطيط الذي أنشأه الخيط B. في هذا السيناريو، لا يحتاج الخيط B لإنشاء تخطيط مباشرة؛ إذ يكفي مجرد إجراء نداء لمكتبة تستخدم داخليًا \fBdlopen\fP(3) لتحميل مكتبة مشتركة أخرى. سيقوم نداء \fBdlopen\fP(3) بتخطيط المكتبة في فضاء عناوين العملية. علاوة على ذلك، يمكن تنفيذ أي نداء مكتبة تقريبًا بطريقة تضيف تخطيطات ذاكرة إلى فضاء العناوين، إما بهذه التقنية أو بمجرد تخصيص الذاكرة. تشمل الأمثلة \fBbrk\fP(2)، و \fBmalloc\fP(3)، و \fBpthread_create\fP(3)، ومكتبات PAM .UR http:\://www.linux\-pam.org .UE . .P .\" منذ لينكس 4.17، يمكن لبرنامج متعدد الخيوط استخدام الراية \fBMAP_FIXED_NOREPLACE\fP لتجنب الخطر الموصوف أعلاه عند محاولة إنشاء تخطيط في عنوان ثابت لم يُحجز بواسطة تخطيط موجود مسبقًا. .SS "تغييرات الطوابع الزمنية للتخطيطات المدعومة بملفات" بالنسبة للتخطيطات المدعومة بملفات، قد يُحدث الحقل \fIst_atime\fP للملف المخطط في أي وقت بين \fBmmap\fP() وإلغاء التخطيط المقابل؛ وسيقوم أول وصول لصفحة مخططة بتحديث الحقل إذا لم يكن قد حُدث بالفعل. .P .\" سيُحدث الحقلان \fIst_ctime\fP و \fIst_mtime\fP لملف مخطط بـ \fBPROT_WRITE\fP و \fBMAP_SHARED\fP بعد الكتابة إلى المنطقة المخططة، وقبل نداء \fBmsync\fP(2) لاحق باستخدام الراية \fBMS_SYNC\fP أو \fBMS_ASYNC\fP، إن وجد. .SS "تخطيطات الصفحات الضخمة (Huge TLB)" بالنسبة للتخطيطات التي تستخدم صفحات ضخمة، تختلف متطلبات معطيات \fBmmap\fP() و \fBmunmap\fP() نوعًا ما عن متطلبات التخطيطات التي تستخدم حجم صفحة النظام الأصلي. .P بالنسبة لـ \fBmmap\fP()، يجب أن يكون \fIoffset\fP مضاعفًا لحجم الصفحة الضخمة الأساسي. يضبط النظام آليًا \fIlength\fP ليكون مضاعفًا لحجم الصفحة الضخمة الأساسي. .P .\" بالنسبة لـ \fBmunmap\fP()، يجب أن يكون كل من \fIaddr\fP و \fIlength\fP مضاعفًا لحجم الصفحة الضخمة الأساسي. .SH تحذيرات .\" على عكس تطبيقات \fBmalloc\fP(3) النموذجية، لا يمنع \fBmmap\fP() إنشاء كائنات أكبر من \fBPTRDIFF_MAX\fP. الكائنات الأكبر من \fBPTRDIFF_MAX\fP تعمل بطرق محدودة فقط في لغة C (على وجه الخصوص، يؤدي طرح المؤشرات إلى سلوك غير محدد إذا كانت النتيجة أكبر من \fBPTRDIFF_MAX\fP). علاوة على ذلك، يفترض GCC أيضًا أنه لا يوجد كائن أكبر من \fBPTRDIFF_MAX\fP. عادة ما يكون \fBPTRDIFF_MAX\fP نصف حجم فضاء العناوين؛ لذا بالنسبة للعمليات ذات 32 بت، يكون عادةً \fB0x7fffffff\fP (حوالي 2 جيجابايت). .SH العلل في لينكس، لا توجد ضمانات مثل تلك المقترحة أعلاه تحت \fBMAP_NORESERVE\fP. مبدئيًا، يمكن قتل أي عملية في أي لحظة عندما تنفد ذاكرة النظام. .P قبل لينكس 2.6.7، لم يكن للراية \fBMAP_POPULATE\fP تأثير إلا إذا حُددت \fIprot\fP بأنها \fBPROT_NONE\fP. .P يحدد SUSv3 أن \fBmmap\fP() يجب أن يفشل إذا كانت \fIlength\fP هي 0. ومع ذلك، قبل لينكس 2.6.12، كان \fBmmap\fP() ينجح في هذه الحالة: لم يُنشأ أي تخطيط وأعاد النداء القيمة \fIaddr\fP. ومنذ لينكس 2.6.12، يفشل \fBmmap\fP() مع الخطأ \fBEINVAL\fP في هذه الحالة. .P يحدد POSIX أن النظام سيقوم دائمًا بملء أي صفحة جزئية في نهاية الكائن بالأصفار وأن النظام لن يكتب أبدًا أي تعديل للكائن خارج نهايته. في لينكس، عند كتابة بيانات إلى مثل هذه الصفحة الجزئية بعد نهاية الكائن، تظل البيانات في خبيئة Cache الصفحة حتى بعد إغلاق الملف وإلغاء تخطيطه وبالرغم من أن البيانات لا تُكتب أبدًا في الملف نفسه، إلا أن التخطيطات اللاحقة قد ترى المحتوى المعدل. في بعض الحالات، يمكن إصلاح ذلك باستدعاء \fBmsync\fP(2) قبل إلغاء التخطيط؛ ومع ذلك، لا يعمل هذا في \fBtmpfs\fP(5) (على سبيل المثال، عند استخدام واجهة ذاكرة POSIX المشتركة الموثقة في \fBshm_overview\fP(7)). .SH أمثلة .\" FIXME . Add an example here that uses an anonymous shared region for .\" IPC between parent and child. يطبع البرنامج التالي جزءًا من الملف المحدد في معامل سطر الأوامر الأول الخاص به إلى المخرج المعياري. يُحدد نطاق البايتات المراد طباعتها عبر قيم الإزاحة والطول في معاملي سطر الأوامر الثاني والثالث. يُنشئ البرنامج تخطيط ذاكرة للصفحات المطلوبة من الملف ثم يستخدم \fBwrite\fP(2) لإخراج البايتات المطلوبة. .SS "مصدر البرنامج" .\" SRC BEGIN (mmap.c) .EX #include #include #include #include #include #include #include #include \& int main(int argc, char *argv[]) { int fd; char *addr; off_t offset, pa_offset; size_t length; ssize_t s; struct stat sb; \& if (argc < 3 || argc > 4) { fprintf(stderr, "%s file offset [length]\[rs]n", argv[0]); exit(EXIT_FAILURE); } \& fd = open(argv[1], O_RDONLY); if (fd == \-1) err(EXIT_FAILURE, "open"); \& if (fstat(fd, &sb) == \-1) /* To obtain file size */ err(EXIT_FAILURE, "fstat"); \& offset = atoi(argv[2]); pa_offset = offset & \[ti](sysconf(_SC_PAGE_SIZE) \- 1); /* offset for mmap() must be page aligned */ \& if (offset >= sb.st_size) { fprintf(stderr, "offset is past end of file\[rs]n"); exit(EXIT_FAILURE); } \& if (argc == 4) { length = atoi(argv[3]); if (offset + length > sb.st_size) length = sb.st_size \- offset; /* Can\[aq]t display bytes past end of file */ \& } else { /* No length arg ==> display to end of file */ length = sb.st_size \- offset; } \& addr = mmap(NULL, length + offset \- pa_offset, PROT_READ, MAP_PRIVATE, fd, pa_offset); if (addr == MAP_FAILED) err(EXIT_FAILURE, "mmap"); \& s = write(STDOUT_FILENO, addr + offset \- pa_offset, length); if (s != length) { if (s == \-1) err(EXIT_FAILURE, "write"); \& fprintf(stderr, "partial write"); exit(EXIT_FAILURE); } \& munmap(addr, length + offset \- pa_offset); close(fd); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" \fBftruncate\fP(2), \fBgetpagesize\fP(2), \fBmemfd_create\fP(2), \fBmincore\fP(2), \fBmlock\fP(2), \fBmmap2\fP(2), \fBmprotect\fP(2), \fBmremap\fP(2), \fBmsync\fP(2), \fBremap_file_pages\fP(2), \fBsetrlimit\fP(2), \fBshmat\fP(2), \fBuserfaultfd\fP(2), \fBshm_open\fP(3), \fBshm_overview\fP(7) .P أوصاف الملفات التالية في \fBproc\fP(5): \fI/proc/\fPpid\fI/maps\fP، و \fI/proc/\fPpid\fI/map_files\fP، و \fI/proc/\fPpid\fI/smaps\fP. .P ب. أ.\& جالميستر، POSIX.4، دار أورايلي، ص.\& 128\[en]129 و 389\[en]391. .\" .\" Repeat after me: private read-only mappings are 100% equivalent to .\" shared read-only mappings. No ifs, buts, or maybes. -- Linus .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .