有没有一种方法可以编程清除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电脑。

10-05 20:49