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

基本上,我正在寻找 10.5(及更高版本)的等效源 purge 命令。 编辑: 我现在看到这是 CHUD 工具的一部分,但似乎无法直接获得该工具的源代码。但是,我仍在寻找一些代码来执行相同的操作。

有帮助吗?

解决方案

我已经从CHUD框架拆卸问题(_utilPurgeDiskBuffers)的功能。该功能似乎并不十分复杂,但因为我不是MacOS的程序员,进口,并呼吁SYS API没有多大意义了我。

的API的第一件事是调用另一个函数,即_miscUtilsUserClientConnect_internal。这个功能似乎建立到CHUD内核扩展的连接。结果 要做到这一点,它调用_getCHUDUtilsKextService它试图通过枚举使用从I / O Kit的进口IORegistryCreateIterator所有的kext找到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。

其他提示

看起来:

您可以使用usr/bin/purge(在终端中键入清除)冲洗磁盘缓存(不活动内存), 或者,您可以从硬盘中进行许多随机读取以执行相同的操作.

取自一个 评论 来自用户 .

你可以用 sync(2) 几倍(因为在众所周知的谚语 sync; sync; sync).我似乎找不到的 purge 源代码,但它可能只是一部分人提供的软件包 在10.5.6码

你会不会有兴趣在关闭缓存,而不是一个文件?根据您所想要达到的目的,也可能是一种选择。 此处很好的总结。

  

UBC可以通过运行“清洗”被清除   该分配大量内存到   强制高速缓存清除。

fcntl(fd, F_GLOBAL_NOCACHE, 1)  
     

可以用来关闭缓存用于特定   文件。这可以在任何过程中完成   并且该文件可以被后关闭。

当你没有您要模仿(比如这里的情况)工具的源代码,有多种方法去了解它。

1 /从C代码,只需调用与system()函数调用的工具。这只要没有明显的影响(如打开一个图形窗口)效果很好。你可以使用system("/path/to/purge -purgargs >/dev/null 2>&1");,例如。

2 /反向工程代码,看看它是如何真正做这件事。这有点棘手,因为它需要的汇编语言的知识,系统调用和许多其他的事情。

3 /联系开发商获取有关它是怎么做的提示。这并不一定是一个“寄给我的代码,所以我能撕裂其关闭,使钱”的问题。你可以短语为“我在使用吹扫发展的兴趣,但我不能确定到底是什么呢”或“我的安全问题与运行的代码,这是权力不会让我运行它,除非我们知道正是它”。然后,你的代码你做同样的。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top