15

Mac、できればCでバッファキャッシュをプログラムでクリアする方法はありますか?

purge基本的に、私は10.5(およびそれ以上)のコマンドのソースに相当するものを探しています。編集:これはCHUDツールの一部であり、ソースが直接利用できないようです。しかし、私はまだ同じことをするためのいくつかのコードを探しています。

4

5 に答える 5

12

問題の関数 ( _utilPurgeDiskBuffers) を CHUD フレームワークから逆アセンブルしました。この関数はそれほど複雑ではないように見えますが、私は MacOS プログラマーではないので、インポートと呼び出された sys API はあまり意味がありません。

API が最初に行うことは、別の関数、つまり_miscUtilsUserClientConnect_internal. この関数は、CHUD カーネル拡張機能への接続を確立するようです。
これを行うために_getCHUDUtilsKextServiceIORegistryCreateIteratorI/O キットからインポートされた . 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以前にゼロにされたことに注意してください。

願わくば、あなたの何人かがこれらの syscall をより理解できるようになることを願っています。さらに詳しい情報が必要な場合は、お知らせください。

更新:
開始するにはAppleSamplePCIClient.c、IO キット SDK の例を参考にしてください。これは基本的に、CHUD ツールのパージ アプリケーションと同じことを行います。
変更する必要があるのは、最後の_IOConnectMethodStructureIStr呼び出しのパラメーターだけです。上記の分解リストから取り出してください。私は Mac を持っていないので、これらすべてをテストすることはできません。

于 2009-02-07T19:29:35.270 に答える
6

のようだ:

usr/bin/purge (ターミナルで「purge」と入力) を使用してディスク キャッシュ (非アクティブなメモリ) をフラッシュするか、ハードディスクから多数のランダム読み取りを実行して同じことを行うことができます

ユーザーgunsからのコメントから引用。

于 2009-02-07T18:32:23.933 に答える
4

代わりに、ファイルのキャッシュをオフにすることに興味がありませんか?あなたが達成しようとしていることに応じて、それは代替案である可能性があります。ここに良い要約があります

UBCは、キャッシュを強制的にクリアするために大量のメモリを割り当てる「purge」を実行することでクリアできます。

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 に答える