私は現在Ubuntu用のPCIデバイスドライバを開発しています。 PCIドライバのサンプルコードはいくつかありますが、ioremapとfile_Operation.mmapを理解するのに問題があります。
ファイル操作mmapの指示:
メモリマッピングは、現代のUnixシステムの最も興味深い機能の1つです。ドライバー側では、ユーザープログラムがデバイスメモリに直接アクセスできるようにメモリマッピングを実装できます。デバイスマッピングは、一連のユーザ空間アドレスをデバイスメモリに関連付けることを意味します。プログラムが指定されたアドレス範囲内で読み書きするたびに、実際にデバイスにアクセスします。
ioremapの説明:
多くのシステムでは、I / Oメモリはこの方法で直接アクセスできません。したがって、マッピングを最初に設定する必要があります。これが ioremap 関数の役割です。この機能は、I / Oメモリ領域に仮想アドレスを割り当てるように特別に設計されています。
上記の説明はすべて「makelinux」からのものです。しかし、これら2つの機能の違いを正しく理解しているかどうかはまだわかりません。現在私が理解する方法は次のとおりです。 (fops.mmap
ファイル操作mmap)は、一連のユーザ空間アドレスをデバイスメモリに関連付けます。これは、PCIデバイスの場合、.ByをBAR
使用してから取得した「実アドレス」に対して仮想アドレスマッピングを実行することを意味します。fops.mmap
ioremap
fops.mmap
誰かが私が間違っていると言うことができますか?ありがとうございます〜
PS。私はこの記事をUbuntuコミュニティに投稿しています。ルールを破らないことを願っています。
答え1
ぜひご覧ください。LDD3本、これは無料です。第9章249ページでioremapについて説明します。また見てくださいAPIU第3版、14.8章、525ページ。私ができる限界内で要約してみましょう。
マッピングI / Oマッピングメモリと呼ばれるメカニズムを介してハードウェアへのアクセスを可能にするカーネル機能。メモリの特定のアドレスは、CPUとRAMの間のマザーボードによって傍受され、ディスクやキーボードなどの他のハードウェアにリダイレクトされます。ポインタや他のカーネル機能で一般的なアドレッシングが利用できるかどうかはわかりません。
I / Oメモリは、単にデバイスがバスを介してプロセッサに提供するRAMと同様の位置領域です。このメモリは、ビデオデータまたはイーサネットパケットを保持するだけでなく、I / Oポートに似たデバイスレジスタを実装するなど、さまざまな目的に使用できます(つまり、読み書きに関連する副作用があります)。
マッピングプロセスメモリ領域をRAMの代わりにファイルの内容にマップするユーザースペースで使用できるシステムコール。一般的なポインタの逆参照を介してマップされたメモリ領域にアクセスすると、カーネルはそれをファイル操作に変換します。デフォルトでは、メモリへの書き込みはファイルへの書き込みです。これはwrite()を呼び出すより素晴らしい方法です。
メモリマッピングI / Oを使用すると、ディスク上のファイルをメモリ内のバッファにマッピングできるため、バッファからバイトをインポートするときにファイル内の対応するバイトを読み取ります。同様に、データをバッファに保存すると、そのバイトが自動的にファイルに書き込まれます。これにより、読み取りまたは書き込みを使用せずにI / Oを実行できます。
(参考)1つ目は「IOマッピングメモリ」、2つ目は「メモリマッピングIO」だと思います。あなたが混乱していることも当然です。
答え2
ユーザ空間メモリアクセスはユーザ空間アドレスに制限される。ファイルをメモリにマッピングすることに加えて、mmapはIOレジスタなどの物理メモリにアクセスするためにも使用できます。スーパーユーザーとして "/dev/mem"を開き、mmapを使用して必要な物理メモリ領域をマッピングする必要があります。その後、IOレジスタを読み書きできます。ほとんどのシステムでは、マッピングする物理アドレスはページ境界になければなりません。