Linux 2.6.24 を実行する XSCALE アーム コアを備えた ixp23xx ネットワーク プロセッサを搭載したフィールド上で、製品ソフトウェアを実行しています。フィールドから時折問題が発生し、ラボで再現されることもあります。コンソールには、次の障害行が出力されます。さらに掘り下げると、仮想アドレスが有効な物理アドレスにマップされていないページ テーブル エントリがほとんどないことがわかりました。したがって、これらの仮想アドレスにアクセスすると、不正確なアボートが発生する可能性があります。最終的な解決策は、間違ったマッピングを削除することです。そのため、次回は正確で簡単に検出できるセグメンテーション エラーが発生するはずです。ただし、間違ったエントリを削除するには時間がかかり、デバッグ情報を使用してビルドを作成する必要があるため、このオプションは後で使用します。
質問に戻ると、XSCALE データシートによると、この障害は、X ビット = 0、C ビット = 0、および B ビット = 0 に設定することにより、「完了するまでストール」を使用してほぼ正確 (+3 instr) にすることができます。しかし、Linuxでそれを行う方法が正確にはわかりません。それは役に立ちますか? 基本的に、これは DCACHE を無効にするように見えます。arc/arm/mm/proc-xscale.S の下のコードはすべてアセンブリであり、正確に無効にする方法がわかりません。Kernel Config には CONFIG_CPU_DCACHE_DISABLE というオプションが 1 つあります。これは DCACHE を無効にしているように見えますが、X=C=B ビットが 0 に等しい場合と同じでしょうか? 以下はデータシートからの抜粋です
*
不正確なデータ アボートは、アボート ハンドラが回復するのが困難なシナリオを作成する可能性があります。外部データ アボートとデータ キャッシュ パリティ エラーの両方が原因で、対象のレジスタ データが破損する可能性があります。これらのフォルトは不正確であるため、Data Abort フォルト ハンドラが呼び出される前に、破損したデータが使用されている可能性があります。このため、ソフトウェアは不正確なデータ アボートを回復不能として扱う必要があります。「完了するまで停止」とマークされたメモリ アクセスでさえ (セクション 3.2.2.4 を参照)、不正確なデータ アボートが発生する可能性があります。これらのタイプのアクセスの場合、障害は一般的な場合よりも多少不正確ではありません。障害を引き起こした命令から 3 命令以内で発生することが保証されています。つまり、「完了するまでストール」する LD または ST 命令が不正確なフォルトをトリガーした場合、その場合、その障害はプログラムによって 3 つの命令内で検出されます。MMU が無効になっている場合、すべてのデータ アクセスはキャッシュ不可かつバッファ不可になります。これは、MMU が有効になっている場合と同じ動作であり、データ アクセスでは、X、C、および B がすべて 0 に設定されたディスクリプタが使用されます。X、C、および B ビットは、プロセッサがいつ新しいデータを Dataキャッシュ。キャッシュは、データを行 (ブロックとも呼ばれます) でキャッシュに配置します。したがって、新しいデータをキャッシュに入れるかどうかを決定するための基準は、「ライン割り当てポリシー」と呼ばれます。Line Allocation Policy が read-allocate の場合、キャッシュを逃したすべてのロード操作 データ アクセスでは、X、C、および B がすべて 0 に設定されたディスクリプタが使用されます。X、C、および B ビットは、プロセッサがいつ新しいデータをデータ キャッシュに配置する必要があるかを決定します。キャッシュは、データを行 (ブロックとも呼ばれます) でキャッシュに配置します。したがって、新しいデータをキャッシュに入れるかどうかを決定するための基準は、「ライン割り当てポリシー」と呼ばれます。Line Allocation Policy が read-allocate の場合、キャッシュを逃したすべてのロード操作 データ アクセスでは、X、C、および B がすべて 0 に設定されたディスクリプタが使用されます。X、C、および B ビットは、プロセッサがいつ新しいデータをデータ キャッシュに配置する必要があるかを決定します。キャッシュは、データを行 (ブロックとも呼ばれます) でキャッシュに配置します。したがって、新しいデータをキャッシュに入れるかどうかを決定するための基準は、「ライン割り当てポリシー」と呼ばれます。Line Allocation Policy が read-allocate の場合、キャッシュを逃したすべてのロード操作
*