質問

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を持っていないので、これらすべてをテストすることはできません。

他のヒント

どうやら:

  

usr / bin / purgeを使用できます(タイプパージ   ターミナルで)ディスクをフラッシュする   キャッシュ(非アクティブなメモリ)、または実行できます   ハードディスクからの多くのランダム読み取り   同じことをする

コメント

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が最善策です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top