Frage

Gibt es eine Möglichkeit, um programmatisch den Puffer-Cache auf dem Mac, vorzugsweise in C zu löschen?

Grundsätzlich suche ich das Äquivalent der Quelle von 10.5 (und höher) 's purge Befehl. EDIT: Ich sehe jetzt, dieser Teil der CHUD Tools ist, für die sie die Quelle scheint nicht direkt verfügbar ist. Aber ich bin noch auf der Suche für einige Codes, um das gleiche zu tun.

War es hilfreich?

Lösung

Ich habe die betreffende Funktion (_utilPurgeDiskBuffers) aus dem CHUD Rahmen zerlegt. Die Funktion scheint nicht sehr komplex zu sein, aber da ich kein MacOS Programmierer bin, die Importe und rief sys APIs nicht viel Sinn für mich.

Das erste, was die API tut, ist eine andere Funktion zu nennen, nämlich _miscUtilsUserClientConnect_internal. Diese Funktion scheint eine Verbindung mit der CHUD Kernel-Erweiterung zu schaffen.
Dazu nennt es _getCHUDUtilsKextService die die CHUD Kernel-Erweiterung zu finden versucht, indem sie alle kexts Aufzählen der IORegistryCreateIterator mit von der I / O Kit importiert. Nachdem der kext gefunden wurde, wird es über _IOServiceOpen geöffnet.

An diesem Punkt haben wir eine Verbindung mit dem CHUD kext (zumindest das ist mein Verständnis von der Disassemblierungsliste).

Endlich ein Aufruf an IOConnectMethodStructureIStructureO gemacht, die ich denke, die wirkliche Magie führt.
Ohne zu wissen, einige interne Details oder die Signatur dieser Funktion nicht Sinn für mich die Parameter.

Hier ist die Demontage, aber:

__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

Beachten Sie, dass var_1C wurde, bevor auf Null gesetzt.

Wir hoffen, einige von Ihnen kann mehr Sinn machen, aus diesen syscalls. Wenn Sie weitere Informationen wünschen, lassen Sie es mich wissen.

Update:
Um Ihnen den Einstieg, nehmen Sie nur das AppleSamplePCIClient.c Beispiel aus dem IO-Kit SDK. Dies gilt im Grunde, was die Reinigungs Anwendung von den CHUD Tools der Fall ist.
Das einzige, was würden Sie ändern müssen, sind die Parameter der endgültigen _IOConnectMethodStructureIStr Anruf. Nehmen Sie sich von der Demontage über die Auflistung. Ich kann nicht alle diese Dinge testen, da ich keinen Mac haben.

Andere Tipps

Es scheint, dass:

  

Sie können mit usr / bin / Löschen (Typ Spülung   im Terminal), um die Scheibe zu spülen   Cache (inaktiv Speicher), oder Sie tun können,   viele zufällig liest von der Festplatte   die gleiche Sache zu tun .

Aus einem Kommentar von user guns .

Sie sync(2) mehrmals (wie in der bekannten Idiom sync; sync; sync) nutzen könnten. Ich kann nicht scheinen, um die purge Quellcode zu finden, aber es kann nur einen Teil der Mann-Pakete zur Verfügung in 10.5.6 Code

Möchten Sie nicht daran interessiert sein, den Cache für eine Datei statt ausschalten? Je nachdem, was Sie versuchen zu erreichen, könnte es eine Alternative sein. gute Zusammenfassung hier .

  

UBC kann durch Ausführen ‚Säuberung‘ gelöscht werden   die ordnet eine Menge Speicher zu   zwingt den Cache zu löschen.

fcntl(fd, F_GLOBAL_NOCACHE, 1)  
     

kann verwendet werden, wiederum Caching off für einen bestimmten   Datei. Dies kann in einem beliebigen Verfahren durchgeführt werden   und die Datei nach geschlossen werden kann.

Wenn Sie nicht über den Quellcode für das Tool haben Sie emulieren möchten (wie es hier der Fall ist), gibt es eine Reihe von Möglichkeiten, um darüber zu gehen.

1 / Von Ihrem C-Code, rufen Sie einfach das Werkzeug mit einem system() Funktionsaufruf. Das funktioniert gut, solange es kein sichtbarer Effekt (wie ein grafisches Fenster zu öffnen). Sie könnten system("/path/to/purge -purgargs >/dev/null 2>&1"); zum Beispiel verwendet werden.

2 / Reverse-Engineering, den Code zu sehen, wie es es tatsächlich tut. Dies ist etwas schwieriger, da sie die Kenntnis der Assemblersprache, Systemaufrufe und viele andere Dinge benötigen.

3 / die Entwickler Kontakt Tipps zu erhalten, wie es gemacht wurde. Dies muss keine „schicken Sie mir den Code, so kann ich es abreißen und Geld machen“ seine Frage. Man könnte es als Phrase „Ich habe ein Interesse an der Verwendung Säuberung für die Entwicklung, aber ich bin nicht sicher genau das, was tut“ oder „Ich habe Probleme mit der Sicherheit des Code ausgeführt wird, dass die Befugnisse werden lassen Sie mich es nicht laufen, wenn wir nicht wissen, genau das, was sie tut“. Dann sind Sie codieren Sie das gleiche zu tun.

Me, würde ich nur die Option 1, wenn möglich (ich von Natur aus faul :-) bin. Wenn Sie ein Werkzeug schreiben wollen mit Spülung zu konkurrieren (und der harten gegeben werde es kostenlos ist), Option 2 ist wahrscheinlich die beste Wahl.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top