質問
Mac、できればCでバッファキャッシュをプログラムでクリアする方法はありますか?
基本的に、10.5(およびそれ以降)のpurge
コマンドのソースに相当するものを探しています。 編集:現在、これはCHUDツールの一部であり、ソースは直接利用できないようです。しかし、私はまだ同じことをするコードを探しています。
解決
CHUDフレームワークから問題の関数(_utilPurgeDiskBuffers
)を逆アセンブルしました。関数はそれほど複雑ではないようですが、私はMacOSプログラマーではないため、インポートとsys APIの呼び出しはあまり意味がありません。
APIが最初に行うことは、別の関数、つまり_miscUtilsUserClientConnect_internal
を呼び出すことです。この関数は、CHUDカーネル拡張機能への接続を確立しているようです。
これを行うには、_getCHUDUtilsKextService
を呼び出します。これは、I / Oキットからインポートされた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を持っていないので、これらすべてをテストすることはできません。
他のヒント
sync(2)
を数回使用できます(よく知られているイディオムsync; sync; sync
のように)。 purge
ソースコードが見つからないようですが、それは 10.5.6コード
代わりに、ファイルのキャッシュをオフにすることに興味はありませんか?あなたが達成しようとしているものに応じて、それは代替手段になる可能性があります。 こちらの概要。
UBCは、 'purge'を実行してクリアできます に多くのメモリを割り当てます キャッシュを強制的にクリアします。
fcntl(fd, F_GLOBAL_NOCACHE, 1)
特定のキャッシュをオフにするために使用できます ファイル。これはどのプロセスでも実行できます ファイルは後で閉じることができます。
エミュレートしたいツールのソースコードがない場合(ここにあるように)、それを実行する方法はいくつかあります。
1 / Cコードから、system()
関数呼び出しでツールを呼び出すだけです。これは、視覚的な効果(グラフィカルウィンドウを開くなど)がない限り機能します。たとえば、system("/path/to/purge -purgargs >/dev/null 2>&1");
を使用できます。
2 /コードをリバースエンジニアリングして、実際にどのように実行されているかを確認します。これは、アセンブラー言語、システムコール、その他多くの知識を必要とするため、やや複雑です。
3 /開発者に連絡して、それがどのように行われたかに関するヒントを入手してください。これは<!> quot;である必要はありません。コードを私に送ってください。質問。 「!または<!> quot;コードの実行にセキュリティ上の問題があります。コードの実行内容が正確にわからない限り、実行できません。<!> quot;次に、同じことを行うようにコーディングします。
私は、可能であればオプション1を使用します(本質的に怠け者です:-)。パージに対抗するツールを作成する場合(無料の場合は難しいでしょう)、おそらくオプション2が最善策です。