1

私は組み込みの ARM と多くのハードワイヤード IP ブロックを備えた SoC に取り組んでいます。各ハードウェア ブロックは、ARM 空間にメモリ マップされます。つまり、ハードウェア ブロックを制御するレジスタは、ARM CPU の空間 32 ビット アドレス空間にあります。この CPU で Linux を実行しています。

ハードウェア ブロックにアクセスするには、ルートとして実行できるアプリで次のように mmap を使用します。

 fd = open("/dev/mem", O_RDWR | O_SYNC);
 mptr = mmap(NULL, mem_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, phy_addr);

他のソフトウェア エンジニアがコードを開発できるように BSP を提供する前に、いくつかのことをよく理解しておきたいと思います。

  1. MAP_SHARED は正しいことですか、それとも MAP_NORESERVE も必要ですか? 基本的にはハードウェアレジスタにアクセスしているので、スワップ領域を割り当てる必要はありませんよね?

  2. 仮想空間 (上記の mptr) への読み取り/書き込みがキャッシュを通過しないようにするにはどうすればよいですか? volatile キーワードは、コンパイラの最適化専用です。

  3. ハードウェア空間全体は実際には非常に大きく、16 MB (多数の SRAM と多数のレジスタ) です。mmap への長さパラメーターをそれほど大きくすることはできますか?それとも、ページ テーブルとマッピングの作成に問題が発生しますか? さまざまな仮想メモリ ポインターを作成する必要がありますか、それとも mptr を取得して物理アドレス オフセットを追加し、ハードウェア アドレスの読み取り/書き込みを問題なく行うことができますか?

どうもありがとう、

4

0 に答える 0