مسح ذاكرة التخزين المؤقت على نظام التشغيل Mac OS X

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

  •  19-08-2019
  •  | 
  •  

سؤال

هل هناك طريقة برمجيا مسح ذاكرة التخزين المؤقت على ماك, ويفضل في C ؟

أساسا أنا أبحث عن ما يعادل مصدر 10.5 (أكبر)'s purge الأوامر. تحرير: أرى الآن هذا هو جزء من CHUD الأدوات التي يبدو مصدر غير متوفرة مباشرة.ومع ذلك أنا لا تزال تبحث عن بعض التعليمات البرمجية أن تفعل الشيء نفسه.

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

المحلول

لقد تفكيكها وظيفة في السؤال (_utilPurgeDiskBuffers) من CHUD الإطار.وظيفة لا يبدو أن تكون معقدة جدا, ولكن منذ أنا لا ماك مبرمج, الواردات يسمى sys واجهات برمجة التطبيقات لا معنى كبير بالنسبة لي.

أول شيء API هل هو استدعاء وظيفة أخرى ، وهي _miscUtilsUserClientConnect_internal.هذه الوظيفة ويبدو أن تأسيس اتصال إلى CHUD نواة التمديد.
للقيام بذلك, ويدعو _getCHUDUtilsKextService الذي يحاول تحديد موقع CHUD نواة امتداد طريق تعداد كل kext باستخدام IORegistryCreateIterator المستوردة من I/O عدة.بعد kext وقد وجد ، يتم فتح طريق _IOServiceOpen.

عند هذه النقطة لدينا اتصال CHUD kext (على الأقل هذا ما فهمته من التفكيك القائمة).

وأخيرا دعوة إلى IOConnectMethodStructureIStructureO هو الذي اعتقد ينفذ السحر الحقيقي.
دون معرفة بعض التفاصيل الداخلية أو توقيع هذه الوظيفة المعلمات لا معنى له بالنسبة لي.

هنا هو التفكيك ، على الرغم من:

__text:4B0157A7 lea     eax, [ebp+var_1C]
__text:4B0157AA mov     dword ptr [esp+14h], 0
__text:4B0157B2 mov     [esp+10h], eax
__text:4B0157B6 mov     [esp+0Ch], eax
__text:4B0157BA mov     dword ptr [esp+8], 0
__text:4B0157C2 mov     dword ptr [esp+4], 0Eh
__text:4B0157CA mov     [esp], edx
__text:4B0157CD call    _IOConnectMethodStructureIStr

علما بأن var_1C وقد ركزت من قبل.

ونأمل أن بعض من كنت يمكن أن تجعل أكثر منطقية من تلك syscalls.إذا كنت تريد المزيد من المعلومات, اسمحوا لي أن أعرف.

تحديث:
للحصول على انك بدأته ، خذ AppleSamplePCIClient.c على سبيل المثال من IO عدة SDK.هذا لا أساسا ما التطهير التطبيق من CHUD أدوات لا.
الشيء الوحيد الذي يجب أن يتم تغيير المعلمات إلى النهائي _IOConnectMethodStructureIStr المكالمة.خذ من التفكيك القائمة أعلاه.أنا لا يمكن اختبار كل هذه الأشياء منذ ليس لدي ماك.

نصائح أخرى

يبدو أن:

يمكنك استخدام usr/bin/purge (نوع تطهير في المحطة) مسح القرص ذاكرة التخزين المؤقت (الذاكرة الخاملة), أو يمكنك أن تفعل العديد من عشوائية يقرأ من القرص الصلب أن تفعل الشيء نفسه.

مأخوذة من التعليق من المستخدم البنادق.

هل يمكن استخدام sync(2) عدة مرات (كما في المعروف لغة sync; sync; sync).أنا لا يمكن أن يبدو للعثور على purge شفرة المصدر ولكن قد يكون مجرد جزء من الرجل الحزم المتوفرة في 10.5.6 رمز

أنك لن تكون مهتمة في إيقاف ذاكرة التخزين المؤقت إلى ملف بدلا من ذلك ؟ اعتمادا على ما كنت تحاول تحقيق ، يمكن أن تكون بديلا. ملخص جيد هنا.

UBC يمكن إزالتها عن طريق تشغيل 'تطهير' الذي يخصص الكثير من الذاكرة قوة ذاكرة التخزين المؤقت واضحة.

fcntl(fd, F_GLOBAL_NOCACHE, 1)  

يمكن أن تستخدم في تشغيل التخزين المؤقت لفترة معينة الملف.هذا يمكن القيام به في أي عملية الملف يمكن أن تكون مغلقة بعد.

عندما لا يكون لديك التعليمات البرمجية المصدر أداة كنت ترغب في محاكاة (كما هو الحال هنا) ، وهناك عدد من الطرق للذهاب نحو ذلك.

1/ من التعليمات البرمجية C, ببساطة الاتصال أداة system() استدعاء دالة.هذا يعمل بشكل جيد طالما لا يوجد أثر واضح (مثل فتح نافذة رسومية).هل يمكن استخدام system("/path/to/purge -purgargs >/dev/null 2>&1");, على سبيل المثال.

2/ مهندس عكسي رمز لنرى كيف يفعل ذلك فعلا.هذا هو إلى حد ما أصعب لأنه يتطلب معرفة لغة المجمع, نظام المكالمات و العديد من الأشياء الأخرى.

3/ الاتصال المطورين للحصول على نصائح حول كيف تم القيام به.هذا لا يجب أن يكون "أرسل لي رمز لذلك أنا يمكن أن مزق قبالة وكسب المال" السؤال.هل يمكن أن العبارة أنه "ليس لدي مصلحة في استخدام تطهير للتنمية ولكن أنا غير متأكد بالضبط ما هو معنى" أو "لقد القضايا الأمنية مع تشغيل التعليمات البرمجية القوى لن اسمحوا لي أن تشغيل هذا ما لم نعرف بالضبط ماذا يفعل".ثم رمز لك أن تفعل الشيء نفسه.

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

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