سؤال

لقد كنت أعمل لمدة أسبوعين على JamVM، وهو جهاز جافا افتراضي صغير ولكنه قوي.

الآن أحاول معرفة كيفية تنفيذ الذاكرة وأنا عالق في مشكلتين غبيتين في لغة C:

char *mem = (char*)mmap(0, args->max_heap, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON, -1, 0);

--> تشير المعلمة -1 إلى واصف الملف، ماذا يعني ذلك؟(لقد قرأت بالفعل Mmap man، لكن لم أجده، ربما أسيء فهمه...).

heapbase = (char*)(((uintptr_t)mem+HEADER_SIZE+OBJECT_GRAIN-1&)~(OBJECT_GRAIN-1)) HEADER_SIZE;

--> ما هو 1&؟لا أجده في مواصفات C ...

شكرًا،

يان

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

المحلول

يمكنك استخدام واصف الملف عندما يكون لديك ملف مفتوح تريد تعيينه في الذاكرة.في هذه الحالة، أنت تقوم بإنشاء خريطة مجهولة (خريطة غير مدعومة بملف) لذلك لا تكون هناك حاجة إلى واصف الملف.يتم تجاهل بعض التطبيقات fd للخرائط المجهولة، بعض يتطلب ليكون -1.

السؤال الثاني هو خطأ في بناء الجملة (ربما خطأ مطبعي).ربما يجب أن يكون شيئًا مثل:

heapbase = (char*)(((uintptr_t)mem+HEADER_SIZE+OBJECT_GRAIN-1)
    &~(OBJECT_GRAIN-1)) - HEADER_SIZE;

في هذه الحالة، OBJECT_GRAIN ستكون قوة ذات اثنين وهي طريقة للحصول على التوافق مع تلك القوة.على سبيل المثال، إذا كان 8، ثم ~(OBJECT_GRAIN-1) سيكون ~7 (~00...001112, ، الذي ~11...110002) والتي، عند استخدام AND مع قيمة، يمكن استخدامها لإجبار تلك القيمة على مضاعفات 8 أقل منها أو تساويها.

في الواقع، من المؤكد أنه خطأ في النسخ في مكان ما (وليس أنت بالضرورة) لأنه عندما أقوم بتنزيل JamVM من هنا وانظر في src/alloc.c, ، انا حصلت:

void initialiseAlloc(InitArgs *args) {
    char *mem = (char*)mmap(0, args->max_heap, PROT_READ|PROT_WRITE,
                                               MAP_PRIVATE|MAP_ANON, -1, 0);
    :
    << a couple of irrelevant lines >>
    :    
    /* Align heapbase so that start of heap + HEADER_SIZE is object aligned */
    heapbase = (char*)(((uintptr_t)mem+HEADER_SIZE+OBJECT_GRAIN-1)&
               ~(OBJECT_GRAIN-1))-HEADER_SIZE;

(لاحظ أن الإصدار الخاص بك يفتقد أيضًا ملف - مباشرة قبل HEADER_SIZE, ، شيء آخر يشير إلى مشاكل النسخ).

نصائح أخرى

ردًا على سؤالك الأول.من صفحة الدليل .

يجب أن يكون

fd واصف ملف صالحًا ، ما لم يتم تعيين MAP_ANONYMOUS.إذا تم تعيين MAP_ANONYMOUS ، فسيتم تجاهل fd على نظام Linux.ومع ذلك ، تتطلب بعض عمليات التنفيذ fd لتكون -1 إذا تم تحديد MAP_ANONYMOUS (أو MAP_ANON) ، ويجب أن تضمن التطبيقات المحمولة ذلك.

إذن فهي -1 لأنه يتم استخدام رمز العلامة العامة.

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