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