有没有一种方法可以编程清除mac上的缓冲区缓存,尤其是用c语言?
基本上,我在寻找10.5(或更高版本)spurge
命令的等效源。编辑:我现在看到这是chud工具的一部分,它的来源似乎不是直接可用的。然而,我仍然在寻找一些代码来做同样的事情。
最佳答案
我已经从chud框架中反汇编了有问题的函数(_utilPurgeDiskBuffers
)。这个函数看起来并不复杂,但是由于我不是MacOS程序员,所以导入和调用sys API对我来说没有多大意义。
api做的第一件事是调用另一个函数,即_miscUtilsUserClientConnect_internal
。此函数似乎与chud内核扩展建立了连接。
为此,它调用_getCHUDUtilsKextService
,尝试通过使用从i/o工具包导入的IORegistryCreateIterator
枚举所有kex来定位chud内核扩展。找到kext后,通过_IOServiceOpen
打开它。
现在我们已经连接到chud kext(至少这是我从反汇编列表中了解到的)。
最后,我打电话给IOConnectMethodStructureIStructureO
,我想这是真正的魔法。
如果不知道一些内部细节或者这个函数的签名,参数对我来说就没有意义。
不过,下面是拆卸过程:
__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
注意,
var_1C
之前已经调零。希望你们中的一些人能从这些系统调用中得到更多的理解。如果你想要更多的信息,请告诉我。
更新:
要开始,只需从io kit sdk中获取
AppleSamplePCIClient.c
示例。这基本上和chud工具中的清除应用程序一样。唯一需要更改的是最后
_IOConnectMethodStructureIStr
调用的参数。从上面的反汇编列表中获取它们。我不能测试所有这些东西,因为我没有Mac电脑。