在Mac OS X上清除缓冲区缓存
有没有办法以编程方式清除Mac上的缓冲区缓存,最好是在C?
基本上,我正在寻找相当于10.5(和更高)的purge
命令的来源。 编辑:我现在看到这是CHUD工具的一部分,似乎源不是直接可用的。 但是,我仍然在寻找一些代码来做同样的事情。
我已经从CHUD框架中反汇编了有问题的函数( _utilPurgeDiskBuffers
)。 该函数似乎并不复杂,但由于我不是MacOS程序员,因此导入和调用sys API对我来说没有多大意义。
API所做的第一件事就是调用另一个函数,即_miscUtilsUserClientConnect_internal
。 此函数似乎建立了与CHUD内核扩展的连接。
为此,它调用_getCHUDUtilsKextService
,它尝试通过使用从I / O工具包导入的IORegistryCreateIterator
枚举所有kexts来查找CHUD内核扩展。 找到kext后,通过_IOServiceOpen
打开它。
此时我们连接到CHUD kext(至少这是我对反汇编列表的理解)。
最后调用了IOConnectMethodStructureIStructureO
,我猜这是真正的魔力。
在不知道某些内部细节或此function的签名的情况下,参数对我来说没有意义。
不过这是反汇编:
__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,所以无法测试所有这些东西。
看起来:
您可以使用usr / bin / purge(在终端中键入purge)来刷新磁盘缓存(非活动内存), 或者您可以从硬盘执行许多随机读取来执行相同的操作 。
取自用户枪的评论 。
您可以多次使用sync(2)
(如众所周知的习语sync; sync; sync
)。 我似乎无法找到purge
源代码,但它可能只是10.5.6代码中可用的man包的一部分
您是否有兴趣关闭文件的缓存? 根据您想要实现的目标,它可能是一种替代方案。 这里好总结 。
可以通过运行’purge’来清除UBC,它可以分配大量内存来强制缓存清除。
fcntl(fd, F_GLOBAL_NOCACHE, 1)
可以用于关闭特定文件的缓存。 这可以在任何过程中完成,文件可以在之后关闭。
当您没有要模拟的工具的源代码时(这里就是这种情况),有很多方法可以解决它。
1 /从您的C代码,只需使用system()
函数调用调用该工具。 只要没有可见效果(例如打开图形窗口),这种方法就可以正常工作。 你可以使用system("/path/to/purge -purgargs >/dev/null 2>&1");
, 例如。
2 /对代码进行反向工程以查看它是如何实际执行的。 这有点棘手,因为它需要汇编语言,系统调用和许多其他东西的知识。
3 /联系开发人员以获取有关如何完成的提示。 这不一定是“发给我代码所以我可以把它扯掉并赚钱”的问题。 您可以将其描述为“我有兴趣使用清除进行开发,但我不确定究竟是做什么”或“我在运行代码时遇到安全问题,除非我们知道,否则不会让我运行它的权力到底是什么“。 然后你编码你的代码也一样。
我,如果可能的话,我会使用选项1(我天生懒惰:-)。 如果你打算写一个工具来与purge竞争(而且这很难给它免费),选项2可能是最好的选择。