effacer le cache du tampon sous Mac OS X

Existe-t-il un moyen de nettoyer par programmation le cache du tampon sur le Mac, de préférence en C?

Fondamentalement, je recherche l’équivalent de la source de la commande de purge de 10.5 (et plus). EDIT: Je vois maintenant que cela fait partie des outils de CHUD, pour lesquels il semble que la source ne soit pas directement disponible. Cependant, je cherche toujours du code pour faire la même chose.

J’ai désassemblé la fonction en question ( _utilPurgeDiskBuffers ) du framework CHUD. La fonction ne semble pas très complexe, mais comme je ne suis pas un programmeur MacOS, les importations et les API sys appelées n’ont pas beaucoup de sens.

La première chose que fait l’API est d’appeler une autre fonction, à savoir _miscUtilsUserClientConnect_internal . Cette fonction semble établir une connexion avec l’extension du kernel CHUD.
Pour ce faire, il appelle _getCHUDUtilsKextService qui tente de localiser l’extension du kernel CHUD en énumérant tous les kexts à l’aide d’ IORegistryCreateIterator importé du kit d’E / S. Une fois que kext a été trouvé, il est ouvert via _IOServiceOpen .

À ce stade, nous avons une connexion avec le CHUD kext (du moins, ce que je comprends de la liste de désassemblage).

Enfin, un appel à IOConnectMethodStructureIStructureO est effectué, ce qui, je suppose, réalise la vraie magie.
Sans connaître certains détails internes ou la signature de cette fonction, les parameters n’ont aucun sens pour moi.

Voici le déassembly, cependant:

 __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 

Notez que var_1C a déjà été mis à zéro.

Espérons que certains d’entre vous auront plus de sens de ces appels système. Si vous voulez plus d’informations, faites le moi savoir.

Mettre à jour:
Pour vous AppleSamplePCIClient.c démarrer, prenez simplement l’exemple AppleSamplePCIClient.c du kit de développement AppleSamplePCIClient.c IO. Cela correspond essentiellement à l’application de purge des outils CHUD.
Les seuls éléments à modifier sont les parameters de l’appel final _IOConnectMethodStructureIStr . Prenez-les de la liste de déassembly ci-dessus. Je ne peux pas tester tout ça car je n’ai pas de Mac.

Il paraît que:

Vous pouvez utiliser usr / bin / purge (type purge dans le terminal) pour vider le cache disque (mémoire inactive) ou effectuer de nombreuses lectures aléatoires sur le disque dur pour faire la même chose .

Tiré d’un commentaire d’utilisateur guns .

Vous pouvez utiliser sync(2) plusieurs fois (comme dans l’idiome bien connu sync; sync; sync ). Je n’arrive pas à trouver le code source de purge mais il se peut qu’il fasse simplement partie des packages man disponibles dans le code 10.5.6.

Ne seriez-vous pas intéressé par la désactivation du cache pour un fichier? Selon ce que vous essayez d’atteindre, cela pourrait être une alternative. Bon résumé ici .

UBC peut être effacé en exécutant ‘purge’ qui alloue beaucoup de mémoire pour forcer l’effacement du cache.

 fcntl(fd, F_GLOBAL_NOCACHE, 1) 

peut être utilisé désactiver la mise en cache pour un fichier particulier. Cela peut être fait dans n’importe quel processus et le fichier peut être fermé après.

Lorsque vous ne possédez pas le code source de l’outil que vous souhaitez émuler (comme c’est le cas ici), il existe un certain nombre de façons de s’y prendre.

1 / Depuis votre code C, appelez simplement l’outil avec un appel de fonction system() . Cela fonctionne bien tant qu’il n’ya pas d’effet visible (comme ouvrir une fenêtre graphique). Vous pouvez utiliser system("/path/to/purge -purgargs >/dev/null 2>&1"); , par exemple.

2 / Inverser le code pour voir comment il le fait. C’est un peu plus compliqué car il faudra connaître le langage de l’assembleur, les appels système et bien d’autres choses.

3 / Contactez les développeurs pour obtenir des conseils sur la manière de procéder. Cela ne doit pas nécessairement être un “envoyez-moi le code afin que je puisse le déchirer et gagner de l’argent” question. Vous pouvez le formuler comme suit: “je suis intéressé par l’utilisation de purge pour le développement, mais je ne sais pas exactement ce qui se passe” ou “j’ai des problèmes de sécurité liés à l’exécution du code, les pouvoirs en place ne me permettent pas de l’exécuter à moins de savoir exactement ce qu’il fait “. Ensuite, vous codez le vôtre pour faire la même chose.

Moi, je voudrais juste utiliser l’option 1 si possible (je suis fondamentalement paresseux :-). Si vous écrivez un outil pour concurrencer la purge (et ce sera difficile étant donné que c’est gratuit), l’option 2 est probablement le meilleur choix.