mmap تأثير حماية العلم لتبادل المعلومات بين العمليات

StackOverflow https://stackoverflow.com/questions/601806

  •  03-07-2019
  •  | 
  •  

سؤال

هل يؤثر العلم الحماية تبادل بين العمليات؟ إذا كان لدي PROT_READ | منطقة الذاكرة المحمية بواسطة PROT_WRITE mmapped، غير أنه لا يزال يشاطر تماما طالما لم أكتب فيه

int prot = PROT_READ|PROT_EXEC;
image = mmap(NULL, filesize, prot, MAP_PRIVATE, fildes, 0);

ومقابل:

int prot = PROT_READ|PROT_WRITE|PROT_EXEC;
image = mmap(...)

وكنت تريد أن تجعل تعديل صغير على جزء صغير من منطقة الذاكرة بعد لقد تعيينه، ثم إعادة mprotect كل شيء، لأنه أبسط من mprotecting أجزاء صغيرة عندما كنت في حاجة للقيام بذلك.

والسؤال هو ما إذا كان ينتهي إجبار الملف بأكمله نسخ لكل عملية أو مجرد أجزاء I تعديل في العملية؟

هل كانت مفيدة؟

المحلول

ووفقا ل mmap (2) الصفحة رجل على نظام لينكس مؤخرا، MAP_PRIVATE يخصص الذاكرة باستخدام نسخ على -write (البقرة). وهذا يعني، لن يكون لها مثيل الذاكرة الخاصة بك إلا إذا قمت بإجراء تغييرات عليه. كما COW هو وسيلة فعالة لتنفيذ ذلك، وأفترض أنها فعلت ذلك أيضا بهذه الطريقة في النظم NIX * الأخرى.

ويتم تنظيم الذاكرة لmmap في قطع متساوية الحجم، ما يسمى الصفحات. دائما يتم تعيينها الذاكرة في مضاعفات حجم الصفحة، أي صفحات كاملة. كل صفحة يمكن تبديل مستقل. حتى إذا كنت أكتب شيئا لهذا النطاق الذاكرة mmap'ed، واحد على الأقل فقط الصفحة يجب أن يتم نسخها.

وحجم الصفحة يعتمد على النظام الخاص بك، على إلى x86 فإنه عادة ما يكون 4096 بايت. إذا كنت مهتما في حجم الصفحة من النظام الخاص بك، يمكنك استخدام <لأ href = "http://www.kernel.org/doc/man-pages/online/pages/man3/sysconf.3.html" يختلط = "نوفولو noreferrer"> sysconf (3) .

   #include <unistd.h>
   long pagesize = sysconf(_SC_PAGESIZE);

والمؤشر الذي تحصل عليه من mmap () سوف يشير بالفعل إلى مضاعفات حجم الصفحة، ويجب أن تمر mprotect () يتم محاذاة عنوان إلى حد صفحة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top