Question

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

En gros, je cherche l’équivalent de la commande source de la commande purge de 10.5 (et plus). MODIFIER : je vois maintenant que cela fait partie des outils de CHUD, dont il semble que la source ne soit pas directement disponible. Cependant, je cherche encore du code pour faire de même.

Était-ce utile?

La solution

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 consiste à appeler une autre fonction, à savoir _miscUtilsUserClientConnect_internal . Cette fonction semble établir une connexion avec l'extension du noyau CHUD.
Pour ce faire, il appelle _getCHUDUtilsKextService qui tente de localiser l'extension du noyau CHUD en énumérant tous les kexts à l'aide du IORegistryCreateIterator importé à partir du kit d'E / S. Une fois que kext a été trouvé, il est ouvert via _IOServiceOpen .

À ce stade, nous sommes connectés au kext CHUD (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 paramètres n'ont aucun sens pour moi.

Voici le désassemblage, 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 été mis à zéro auparavant.

Espérons que certains d’entre vous pourront donner plus de sens à ces appels systèmes. Si vous souhaitez plus d'informations, faites le moi savoir.

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

Autres conseils

Il semble que:

  

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

Tiré d'un commentaire de l'utilisateur armes à feu .

Vous pouvez utiliser sync (2) plusieurs fois (comme dans l'idiome bien connu sync; sync; sync ). Je n'arrive pas à trouver le code source 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. Un bon résumé ici .

  

UBC peut être effacé en exécutant 'purge'   qui alloue beaucoup de mémoire à   force le cache à effacer.

fcntl(fd, F_GLOBAL_NOCACHE, 1)  
     

peut être utilisé, désactiver la mise en cache pour un   fichier. 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 le faire.

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 l’ouverture d’une fenêtre graphique). Vous pouvez utiliser system ("/ path / to / purge -purgargs" / gt; / dev / null 2 ??> & amp; 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 forcément être un "envoyez-moi le code pour que je puisse le déchirer et gagner de l'argent" question. Vous pouvez le définir 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é avec l'exécution du code, les pouvoirs en place ne me permettent pas de le faire fonctionner à moins que nous sachions exactement ce qu'il fait". Ensuite, vous codez le vôtre pour en faire autant.

Moi, je voudrais juste utiliser l'option 1 si possible (je suis fondamentalement paresseux :-). Si vous envisagez d'écrire un outil pour lutter contre la purge (et ce sera difficile étant donné qu'il est gratuit), l'option 2 est probablement le meilleur choix.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top