自己変更コードを含む命令セットを実行する ARM Linux で JIT を作成しています。命令セットには、キャッシュ フラッシュ命令がありません (その点では x86 に似ています)。
コードをページに書き込んでそのページを呼び出しmprotect
た場合、命令キャッシュを無効にするのに十分ですか? cacheflush
それとも、それらのページでシステムコールも使用する必要がありますか?
自己変更コードを含む命令セットを実行する ARM Linux で JIT を作成しています。命令セットには、キャッシュ フラッシュ命令がありません (その点では x86 に似ています)。
コードをページに書き込んでそのページを呼び出しmprotect
た場合、命令キャッシュを無効にするのに十分ですか? cacheflush
それとも、それらのページでシステムコールも使用する必要がありますか?
mmap / mprotect syscallsは、すぐに更新されるマッピングを確立し、指定されたメモリ範囲を使用するためにそれ以上の対話を必要としないことを期待します。カーネルが実際にmprotectのキャッシュをフラッシュしていることがわかります。その場合、キャッシュフラッシュは必要ありません。
ただしcacheflush
、libcの一部のバージョンはの後に呼び出すこともわかりますmprotect
。これは、一部の環境ではキャッシュをフラッシュする必要がある(または以前にフラッシュする必要がある)ことを意味します。これはバグの回避策だと思います。
cacheflushへの呼び出しはいつでも追加できます。これは余分なコードですが、害を及ぼすことはないはずです。最悪の場合、キャッシュはすでにフラッシュされています。あなたはいつでも簡単なテストを書いて、何が起こるかを見ることができます...
キャッシュを明示的にフラッシュする必要はないと思います。
これはどのプロセッサですか? ARMv5? ARMv7?