svuota la cache del buffer su Mac OS X.
Domanda
Esiste un modo per cancellare programmaticamente la cache buffer sul Mac, preferibilmente in C?
Fondamentalmente, sto cercando l'equivalente della sorgente del comando purge
della 10.5 (e maggiore). EDIT: ora vedo che questo fa parte degli strumenti CHUD, per i quali sembra che la fonte non sia direttamente disponibile. Tuttavia, sto ancora cercando del codice per fare lo stesso.
Soluzione
Ho smontato la funzione in questione ( _utilPurgeDiskBuffers
) dal framework CHUD. La funzione non sembra essere molto complessa, ma poiché non sono un programmatore MacOS, le importazioni e le API chiamate sys non hanno molto senso per me.
La prima cosa che l'API fa è chiamare un'altra funzione, vale a dire _miscUtilsUserClientConnect_internal
. Questa funzione sembra stabilire una connessione con l'estensione del kernel CHUD.
Per fare ciò, chiama _getCHUDUtilsKextService
che cerca di localizzare l'estensione del kernel CHUD enumerando tutti i kexts usando IORegistryCreateIterator
importato dal kit I / O. Dopo che il kext è stato trovato, viene aperto tramite _IOServiceOpen
.
A questo punto abbiamo una connessione al kext CHUD (almeno questa è la mia comprensione dalla lista di smontaggio).
Finalmente viene fatta una chiamata a IOConnectMethodStructureIStructureO
, che immagino realizzi la vera magia.
Senza conoscere alcuni dettagli interni o la firma di questa funzione i parametri non hanno senso per me.
Ecco lo smontaggio, tuttavia:
__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
Nota che var_1C
è stato azzerato prima.
Spero che alcuni di voi possano avere più senso da quelle syscalls. Se vuoi maggiori informazioni, fammi sapere.
Aggiornamento:
Per iniziare, basta prendere l'esempio AppleSamplePCIClient.c
dall'SDK dell'IO kit. Questo fa sostanzialmente ciò che fa l'applicazione di eliminazione dagli strumenti CHUD.
L'unica cosa che dovresti cambiare sono i parametri alla chiamata finale _IOConnectMethodStructureIStr
. Prendili dalla lista di smontaggio sopra. Non posso testare tutte queste cose poiché non ho un Mac.
Altri suggerimenti
Puoi usare sync (2)
diverse volte (come nel noto linguaggio sync; sync; sync
). Non riesco a trovare il codice sorgente purge
ma potrebbe far parte dei pacchetti man disponibili nel codice 10.5.6
Non ti interesserebbe invece disattivare la cache per un file? A seconda di ciò che stai cercando di ottenere, potrebbe essere un'alternativa. Buon riassunto qui .
UBC può essere cancellato eseguendo 'purge' che alloca molta memoria a impone la cancellazione della cache.
fcntl(fd, F_GLOBAL_NOCACHE, 1)
può essere utilizzato per disattivare la memorizzazione nella cache per un particolare file. Questo può essere fatto in qualsiasi processo e il file può essere chiuso dopo.
Quando non si dispone del codice sorgente per lo strumento che si desidera emulare (come nel caso qui), esistono diversi modi per procedere.
1 / Dal tuo codice C, chiama semplicemente lo strumento con una chiamata di funzione system ()
. Funziona bene finché non ci sono effetti visibili (come l'apertura di una finestra grafica). Puoi utilizzare il sistema (" / path / to / purge -purgargs > / dev / null 2 ??> & amp; 1 ");
, ad esempio.
2 / Decodifica il codice per vedere come lo sta effettivamente facendo. Questo è un po 'più complicato poiché richiederà la conoscenza del linguaggio assembler, le chiamate di sistema e molte altre cose.
3 / Contatta gli sviluppatori per ottenere suggerimenti su come è stato fatto. Questo non deve essere un "inviami il codice per poterlo strappare e fare soldi" domanda. Potresti esprimerlo come "Ho un interesse nell'usare lo spurgo per lo sviluppo, ma non sono sicuro di cosa si tratti". o " ho problemi di sicurezza con l'esecuzione del codice, i poteri che sono non mi permetteranno di eseguirlo se non sappiamo esattamente cosa fa " ;. Quindi codifica il tuo per fare lo stesso.
Io, vorrei solo usare l'opzione 1 se possibile (sono intrinsecamente pigro :-). Se hai intenzione di scrivere uno strumento per competere con l'eliminazione (e questo sarà difficile dato che è gratuito), l'opzione 2 è probabilmente la scommessa migliore.