在Mac OS X上清除缓冲区缓存

时间:2009-01-19 22:58:59

标签: c macos purge

有没有办法以编程方式清除Mac上的缓冲区缓存,最好是在C?

基本上,我正在寻找相当于10.5(及更高版本)purge命令的源代码。 编辑:我现在看到这是CHUD工具的一部分,因为它似乎不能直接获得源。但是,我仍然在寻找一些代码来做同样的事情。

5 个答案:

答案 0 :(得分:11)

我从CHUD框架中反汇编了有问题的函数(_utilPurgeDiskBuffers)。该函数似乎并不复杂,但由于我不是MacOS程序员,因此导入和调用sys API对我来说没有多大意义。

API的第一件事就是调用另一个函数,即_miscUtilsUserClientConnect_internal。此函数似乎建立了与CHUD内核扩展的连接 为此,它调用_getCHUDUtilsKextService,它通过使用从I / O工具包导入的IORegistryCreateIterator枚举所有kexts来尝试找到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工具包SDK中获取AppleSamplePCIClient.c示例。这基本上与CHUD工具的清除应用程序有关 您唯一需要更改的是最终_IOConnectMethodStructureIStr调用的参数。从上面的反汇编列表中获取它们。因为我没有Mac,所以无法测试所有这些东西。

答案 1 :(得分:7)

似乎:

  

您可以使用usr / bin / purge(类型清除   在终端)刷新磁盘   缓存(非活动内存),或者你可以做   许多随机从硬盘读取   做同样的事情

取自用户commentguns

答案 2 :(得分:3)

您可以多次使用sync(2)(如众所周知的成语sync; sync; sync)。我似乎无法找到purge源代码,但它可能只是可用人员包的一部分in 10.5.6 code

答案 3 :(得分:3)

您是否有兴趣关闭文件的缓存?根据您要实现的目标,它可能是一种替代方案。 Good summary here

  

通过运行'清除'可以清除UBC   它分配了大量的内存   强制缓存清除。

fcntl(fd, F_GLOBAL_NOCACHE, 1)  
     

可以用于特定的转为缓存   文件。这可以在任何过程中完成   并且文件可以在之后关闭。

答案 4 :(得分:2)

当你没有想要模拟的工具的源代码时(就像这里的情况一样),有很多方法可以解决它。

1 /从您的C代码中,只需使用system()函数调用来调用该工具。只要没有可见效果(例如打开图形窗口),这就可以正常工作。例如,您可以使用system("/path/to/purge -purgargs >/dev/null 2>&1");

2 /对代码进行反向工程以查看它是如何实际执行的。这有点棘手,因为它需要汇编语言,系统调用和许多其他事情的知识。

3 /联系开发人员以获取有关如何完成的提示。这不一定是“发给我代码所以我可以把它扯掉并赚钱”的问题。您可以将其描述为“我有兴趣使用清除进行开发,但我不确定究竟是做什么”或“我在运行代码时遇到安全问题,除非我们知道,否则不会让我运行它的权力到底是什么“。然后你编码你的代码。

我,如果可能,我会使用选项1(我天生懒惰:-)。如果你打算写一个工具来与purge竞争(这很难给它免费),选项2可能是最好的选择。