15

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

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

4

5 回答 5

12

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

API 做的第一件事是调用另一个函数,即_miscUtilsUserClientConnect_internal. 这个函数似乎建立了与 CHUD 内核扩展的连接。
为此,它调用which 尝试通过使用从 I/O 工具包导入的_getCHUDUtilsKextService所有 kext 枚举所有 kext 来定位 CHUD 内核扩展。IORegistryCreateIterator找到 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之前已归零。

希望你们中的一些人能从这些系统调用中理解更多。如果您想了解更多信息,请告诉我。

更新:
为了让您开始,只需以AppleSamplePCIClient.cIO 套件 SDK 中的示例为例。这基本上完成了 CHUD 工具中的清除应用程序所做的事情。
您唯一需要更改的是最终_IOConnectMethodStructureIStr调用的参数。从上面的反汇编列表中获取它们。因为我没有 Mac,所以我无法测试所有这些东西。

于 2009-02-07T19:29:35.270 回答
6

看起来:

您可以使用 usr/bin/purge(在终端中键入 purge)来刷新磁盘缓存(非活动内存),或者您可以从硬盘执行许多随机读取来执行相同的操作

取自用户guns评论

于 2009-02-07T18:32:23.933 回答
4

您是否对关闭文件的缓存不感兴趣?根据您要实现的目标,它可能是另一种选择。很好的总结在这里

UBC 可以通过运行“清除”来清除,它分配大量内存以强制清除缓存。

fcntl(fd, F_GLOBAL_NOCACHE, 1)  

可用于关闭特定文件的缓存。这可以在任何进程中完成,之后可以关闭文件。

于 2009-02-07T18:20:52.910 回答
3

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

于 2009-01-19T23:13:06.610 回答
2

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

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

2/ 对代码进行逆向工程,看看它实际上是如何做的。这有点棘手,因为它需要了解汇编语言、系统调用和许多其他知识。

3/ 联系开发人员以获取有关如何完成的提示。这不一定是“将代码发送给我,这样我就可以撕掉它并赚钱”的问题。您可以将其表述为“我有兴趣使用 purge 进行开发,但我不确定它到底是做什么的”或“我在运行代码时遇到了安全问题,除非我们知道,否则权力不会让我运行它正是它的作用”。然后你编写你的代码来做同样的事情。

我,如果可能的话,我只会使用选项 1(我天生就是懒惰的 :-)。如果您要编写一个与 purge 竞争的工具(鉴于它是免费的,这将很难),选项 2 可能是最好的选择。

于 2009-02-06T02:16:09.070 回答