Mac、できればCでバッファキャッシュをプログラムでクリアする方法はありますか?
purge
基本的に、私は10.5(およびそれ以上)のコマンドのソースに相当するものを探しています。編集:これはCHUDツールの一部であり、ソースが直接利用できないようです。しかし、私はまだ同じことをするためのいくつかのコードを探しています。
問題の関数 ( _utilPurgeDiskBuffers
) を CHUD フレームワークから逆アセンブルしました。この関数はそれほど複雑ではないように見えますが、私は MacOS プログラマーではないので、インポートと呼び出された sys API はあまり意味がありません。
API が最初に行うことは、別の関数、つまり_miscUtilsUserClientConnect_internal
. この関数は、CHUD カーネル拡張機能への接続を確立するようです。
これを行うために_getCHUDUtilsKextService
、IORegistryCreateIterator
I/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 を持っていないので、これらすべてをテストすることはできません。
代わりに、ファイルのキャッシュをオフにすることに興味がありませんか?あなたが達成しようとしていることに応じて、それは代替案である可能性があります。ここに良い要約があります。
UBCは、キャッシュを強制的にクリアするために大量のメモリを割り当てる「purge」を実行することでクリアできます。
fcntl(fd, F_GLOBAL_NOCACHE, 1)
特定のファイルのキャッシュをオフにするために使用できます。これはどのプロセスでも実行でき、後でファイルを閉じることができます。
数回使用できますsync(2)
(よく知られているイディオムのようにsync; sync; sync
)。ソースコードが見つからないようですが、10.5.6 コードでpurge
利用可能な man パッケージの一部である可能性があります