高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

HW 28 - DRエミュレータのキャッシュ

(8-Apr-96)

Q: 新しいダイナミック・リコンパイリング・エミュレータ(Dynamic Recompiling emulator、DRエミュレータ)を搭載したMacintoshでは、私たちの68Kアプリケーションはクラッシュします。FlushCodeCache()FlushDataCache()をコールすると、クラッシュは収まります。これは、DRエミュレータのバグですか?

A: 本件は、DRエミュレータのバグではありません。DRエミュレータは、68020、030および040のように、フラッシュを行う必要のあるインストラクション・キャッシュを有しています。

DRエミュレータは、以前のエミュレータのように、あたかも自分自身が68020プロセッサであるかのように情報を返しますが、可変長のインストラクション・キャッシュを有しています(実際のプロセッサの固定長キャッシュとは異なります)。アプリケーションの中には、インストラクション・キャッシュの存在に気づかなかったり、あるいは、実際に680x0プロセッサをテストした結果をもとに、ある程度のコードを実行すればキャッシュのフラッシュは自然に行われると仮定しているために、キャッシュのフラッシュを行わないものもあります。

クラッシュを解決するには、キャッシュをフラッシュすることです。もし、特定の条件でキャッシュのフラッシュを行っていたり、あるいは、キャッシュの一貫性を損なうような操作を行っているのであれば、無条件にキャッシュをフラッシュしてください。

PowerPCを搭載したMacintoshがPPCおよび68Kのどちらのモードで動作している場合でも、インストラクション・キャッシュをフラッシュする最善の方法は、FlushCodeCacheRange()をコールすることです。このコールは、プロセッサあるいはDRエミュレータのキャッシュから必要最低限のコードを取り除き、実行速度の低下を最小限にします。データキャッシュのフラッシュに関しては、FlushDataCache()をコールしてください。DRエミュレータはデータキャッシュを有していないので、フラッシュの必要はないでしょう。FlushCodeCacheRange()を使用するだけでクラッシュが起こらなくなるかどうか試してみてください。

しかし、もしコードを修正しているのであれば、PPCコード中でインストラクション・キャッシュとデータキャッシュの両方をフラッシュする必要があるでしょう。というのも、コードはときとしてデータとして扱われることがあり、それゆえに、そのコード自体がデータキャッシュに含まれているからです。したがって、インストラクション・キャッシュだけフラッシュするのは得策ではありません(インストラクションがデータキャッシュに残ってしまいます)。FlushInstructionCache()FlushCodeCache()が040あるいはPPCのデータキャッシュもフラッシュするのは、この理由からです。

これらのコール(ただしFlushCodeCache()を除く)を実行する前には、TrapAvailable()_HwPriv(0xA198)が使用可能かどうかチェックを行うようにしてください。FlushCodeCache()は、_HwPrivトラップにではなく_CacheFlushに依存しています。_CacheFlushは、キャッシュを搭載しているMacintoshには必ず実装されています。

_HwPrivトラップが使用可能であれば、FlushCodeCacheRange()をコールするようにしてください。もしそのコールがhwParamErr(-502)を返してきたり、あるいは_HwPrivが利用可能でない場合には、FlushCodeCache()をコールしてキャッシュ全体をフラッシュする必要があるでしょう。

以下の資料もご参照ください。

develop 23, "Balance of Power; Power Macintosh: The Next Generation" by Dave Evans

Technote HW06-Cache As Cache Can


[ Technical Q&A's : Hardware (for Mac OS) : HW28 ]