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.

È stato utile?

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

Sembra che:

  

Puoi usare usr / bin / purge (digita purge   nel terminale) per svuotare il disco   cache (memoria inattiva), oppure puoi farlo   molte letture casuali dal disco rigido   fare la stessa cosa .

Tratto da un commento dell'utente pistole .

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top