remap_file_pages(2)

الاسم
remap_file_pages - إنشاء تعيين ملف غير خطي

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

موجز
#define _GNU_SOURCE         /* انظر feature_test_macros(7) */
#include <sys/mman.h>

[[مهمل]] int remap_file_pages(size_t size;
                                    void addr[size], size_t size,
                                    int prot, size_t pgoff, int flags);

الوصف
ملاحظة: وُسِمَت استدعاء النظام هذا كمهمل بدءًا من لينكس 3.16. في لينكس 4.0، استُبدِل التنفيذ بمحاكاة أبطأ داخل النواة. يجب على تلك التطبيقات القليلة التي تستخدم استدعاء النظام هذا التفكير في الانتقال إلى بدائل. أُجري هذا التغيير لأن كود النواة لاستدعاء النظام هذا كان معقدًا، ويُعتقد أنه قليل الاستخدام أو ربما غير مستخدم تمامًا. بينما كانت له بعض حالات الاستخدام في تطبيقات قواعد البيانات على أنظمة 32 بت، فإن حالات الاستخدام هذه غير موجودة على أنظمة 64 بت.

يُستخدم استدعاء النظام remap_file_pages() لإنشاء تعيين غير خطي، أي تعيين تُعيّن فيه صفحات الملف بترتيب غير تسلسلي في الذاكرة. ميزة استخدام remap_file_pages() بدلاً من الاستخدام المتكرر لـ mmap(2) هي أن النهج الأول لا يتطلب من النواة إنشاء هياكل بيانات VMA (منطقة الذاكرة الافتراضية) إضافية.

لإنشاء تعيين غير خطي، ننفذ الخطوات التالية:

1.  استخدم mmap(2) لإنشاء تعيين (وهو خطي في البداية). يجب إنشاء هذا التعيين بالعلامة MAP_SHARED.

2.  استخدم استدعاءً واحدًا أو أكثر لـ remap_file_pages() لإعادة ترتيب التطابق بين صفحات التعيين وصفحات الملف. من الممكن تعيين نفس الصفحة من ملف إلى مواقع متعددة داخل المنطقة المعينة.

تحدد الوسيطتان pgoff و size منطقة الملف التي سيتم نقلها داخل التعيين: pgoff هو إزاحة ملف بوحدات حجم صفحة النظام؛ size هو طول المنطقة بالبايت.

تخدم الوسيطة addr غرضين. أولاً، تحدد التعيين الذي نريد إعادة ترتيب صفحاته. وبالتالي، يجب أن يكون addr عنوانًا يقع ضمن منطقة سبق تعيينها بواسطة استدعاء لـ mmap(2). ثانيًا، يحدد addr العنوان الذي ستوضع فيه صفحات الملف المحددة بواسطة pgoff و size.

يجب أن تكون القيم المحددة في addr و size مضاعفات لحجم صفحة النظام. إذا لم تكن كذلك، فإن النواة تُقرّب كِلتا القيمتين إلى الأسفل لأقرب مضاعف لحجم الصفحة.

يجب تحديد الوسيطة prot كـ 0.

الوسيطة flags لها نفس المعنى كما في mmap(2)، ولكن جميع العلامات بخلاف MAP_NONBLOCK تُتجاهل.

قيمة الإرجاع
عند النجاح، تُرجع remap_file_pages() 0. عند الخطأ، تُرجع -1، ويُضبط errno للإشارة إلى الخطأ.

الأخطاء

EINVAL
    addr لا يشير إلى تعيين صالح تم إنشاؤه بالعلامة MAP_SHARED.

EINVAL
    addr أو size أو prot أو pgoff غير صالح.

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

التاريخ
لينكس 2.5.46، glibc 2.3.3.

ملاحظات
منذ لينكس 2.6.23، يُنشئ remap_file_pages() تعيينات غير خطية فقط على أنظمة الملفات في الذاكرة مثل tmpfs(5) أو hugetlbfs أو ramfs. على أنظمة الملفات ذات التخزين الداعم، فإن remap_file_pages() ليس أكثر كفاءة بكثير من استخدام mmap(2) لضبط أي أجزاء من الملف تُعيّن إلى أي عناوين.

انظر أيضًا
getpagesize(2), mmap(2), mmap2(2), mprotect(2), mremap(2), msync(2)

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

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

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