3

組み込み ARM Linux システムで作業していますが、仮想アドレス 0x2b200000 のページにアクセスすると、アプリでバス エラーが発生することがあります (常にではありません)。コンパイラ/リンカーがそのアドレスにコードまたはデータを配置するかどうかに応じて、変数を読み取るとき、またはそのページから命令がフェッチされるときにバス エラーが発生します。バス エラーの後、cat /proc/self/maps を実行し、そのページが自分のプロセスで有効なものに実際にマップされていることを確認します。

その1ページだけのようです。ページ 0x2b201000 と 0x2b1ff000 は常に問題ありません (明らかに、まったく別の場所に別の不適切なアドレスが存在する可能性があり、たまたまアクセスしたことがないだけです)。

ここには無数の不明な点があることはわかっていますが、誰かが調査の方向性を教えてくれるかどうか疑問に思っていました. システムには、カーネルの残りの部分から予約または隠されている物理メモリを使用するカスタム ドライバー .kos がありますが、それが仮想アドレスにどのように影響するかわかりません。

洞察のナゲットは大歓迎です。

4

2 に答える 2

2

助けてくれてありがとう。私は問題を発見しました - 特定のユーザーアドレスが 2MB アラインされることを期待する、動作の悪いドライバーです。たとえば、有効なマップ アドレスが実際には 0x2b3cc000 である場合、0x2b200000 に誤って配置され、アプリを踏みにじるでしょう!

于 2012-04-22T14:41:58.497 に答える
0

システムによっては、同じ virtual->physical マッピングを持つ場合があります。別の動作するデバイスがある場合は、そのデバイスで実行してみます。そうすれば、ソフトウェアの問題なのかハードウェアの問題なのかをすぐに判断できます。

ユーザー コードまたはドライバー コードを実行すると、バス エラーが発生しますか?

エラーは常に発生するとは限りません。特定のビルドで発生する場合、そのビルドで常に発生するのか、それとも散発的なのか?

于 2012-04-21T18:30:15.180 に答える