2

Linuxカーネルを実行しているARM Cortex A-8デバイスでいくつかの実験を行っています。

問題なく L2 キャッシュ ロックダウン レジスタの値にアクセスして読み取ることができます。

asm volatile ("mrc p15, 1, %0, c9, c0, 0" : "=r" (i));

値を書き戻そうとすると、デバイスがすぐにクラッシュします。

asm volatile ("mcr p15, 1, %0, c9, c0, 0" : : "r" (i));

コードはカーネル モジュールとして実行されるため、権限の問題はありません。

そのレジスタ値を書き込む前に何か特別なものが欠けているのだろうか?

4

1 に答える 1

3

キャッシュ ロックダウンを使用する場合は、注意が必要な長いチェックリストがあります。ARM のインフォメーション センターにはいくつかのヒントがあります: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344i/Chdeghcb.html

特に、割り込みが無効になっていること、および適切な命令/データが無効になっていることを確認してください。また、読み取り/書き込みアクセスが有効になっていることも確認してください。カーネル モードであっても有効になっていない可能性があります。コードが重要なポイントでページやキャッシュ ラインをまたいでいないことを確認する必要があります。正しく理解するのは本当に難しいです。キャッシュウェイをロックしてすべてが機能することを期待することはできず、C のインライン ASM だけでそれを行うこともできません。

最悪の場合、L2 キャッシュ コントローラーの内部ステート マシンが妨害され、間違ったデータがロックされ、データが完全にキャッシュされなくなり、すべてが中止されたり、タグが同期しなくなったりすることになります。それはクラッシュを説明します。

Also, is this just experimentation or are you trying to boost performance? It's useful for avoiding touching DRAM/bus for well crafted code sequences, for example if you want to turn it off (deep sleep), but it's not usually a performance win.

于 2011-03-01T07:50:30.420 に答える