Pregunta

¿Hay alguna manera de borrar mediante programación el caché del búfer en la Mac, preferiblemente en C?

Básicamente, estoy buscando el equivalente de la fuente del comando purge de 10.5 (y superior). EDITAR: ahora veo que esto es parte de las herramientas de CHUD, por lo que parece que la fuente no está directamente disponible. Sin embargo, todavía estoy buscando algún código para hacer lo mismo.

¿Fue útil?

Solución

He desmontado la función en cuestión ( _utilPurgeDiskBuffers ) del marco CHUD. La función no parece ser muy compleja, pero como no soy un programador de MacOS, las importaciones y las llamadas API sys no tienen mucho sentido para mí.

Lo primero que hace la API es llamar a otra función, a saber, _miscUtilsUserClientConnect_internal . Esta función parece establecer una conexión con la extensión del núcleo CHUD.
Para hacer esto, llama a _getCHUDUtilsKextService que intenta localizar la extensión del núcleo CHUD enumerando todos los kexts utilizando el IORegistryCreateIterator importado del kit de E / S. Una vez que se ha encontrado el kext, se abre a través de _IOServiceOpen .

En este punto tenemos una conexión con el kext CHUD (al menos eso entiendo por la lista de desensamblaje).

Finalmente se realiza una llamada a IOConnectMethodStructureIStructureO , que supongo que lleva a cabo la verdadera magia.
Sin conocer algunos detalles internos o la firma de esta función, los parámetros no tienen sentido para mí.

Aquí está el desmontaje, sin embargo:

__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

Tenga en cuenta que var_1C se ha puesto a cero antes.

Espero que algunos de ustedes tengan más sentido con esas llamadas al sistema. Si desea más información, hágamelo saber.

Actualización:
Para comenzar, solo tome el ejemplo AppleSamplePCIClient.c del SDK del kit IO. Esto hace básicamente lo que hace la aplicación de purga de las herramientas CHUD.
Lo único que tendría que cambiar son los parámetros de la llamada final _IOConnectMethodStructureIStr . Tómelos de la lista de desmontaje anterior. No puedo probar todo esto porque no tengo una Mac.

Otros consejos

Parece que:

  

Puede usar usr / bin / purge (escriba purge   en el terminal) para vaciar el disco   caché (memoria inactiva), o puede hacer   muchas lecturas aleatorias del disco duro   hacer lo mismo .

Tomado de un comentario del usuario pistolas .

Puede usar sync (2) varias veces (como en el conocido idioma sync; sync; sync ). Parece que no puedo encontrar el código fuente purge pero puede ser parte de los paquetes man disponibles en el código 10.5.6

¿No le interesaría desactivar el caché de un archivo? Dependiendo de lo que intente lograr, podría ser una alternativa. Buen resumen aquí .

  

UBC se puede borrar ejecutando 'purge'   que asigna mucha memoria a   forzar el caché para borrar.

fcntl(fd, F_GLOBAL_NOCACHE, 1)  
     

se puede usar para desactivar el almacenamiento en caché de un determinado   expediente. Esto se puede hacer en cualquier proceso   y el archivo se puede cerrar después.

Cuando no tiene el código fuente de la herramienta que desea emular (como es el caso aquí), hay varias maneras de hacerlo.

1 / Desde su código C, simplemente llame a la herramienta con una llamada de función system () . Esto funciona bien siempre que no haya un efecto visible (como abrir una ventana gráfica). Puede usar el sistema (" / path / to / purge -purgargs > / dev / null 2 ??> & amp; 1 "); , por ejemplo.

2 / Ingeniería inversa del código para ver cómo lo está haciendo realmente. Esto es algo más complicado ya que requerirá conocimiento del lenguaje ensamblador, llamadas al sistema y muchas otras cosas.

3 / Póngase en contacto con los desarrolladores para obtener consejos sobre cómo se hizo. Esto no tiene que ser un "envíeme el código para que pueda estafarlo y ganar dinero". pregunta. Podría expresarlo como "Tengo interés en utilizar la purga para el desarrollo, pero no estoy seguro de qué es exactamente". o "Tengo problemas de seguridad con la ejecución del código, los poderes existentes no me permitirán ejecutarlo a menos que sepamos exactamente lo que hace". Luego codifica el tuyo para hacer lo mismo.

Yo, usaría la opción 1 si es posible (soy inherentemente vago :-). Si va a escribir una herramienta para competir con la purga (y esto será difícil dado que es gratis), la opción 2 es probablemente la mejor opción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top