オペレーティングシステムの概念では、メモリマッピングファイルとメモリマッピングI / Oは2つあります。メモリマップされたI / Oについては、以下を参照してください。
メモリマッピングファイルを使用するにはmmap()
。
メモリマップされたI / Oを使用するにはどのような機能がありますか?メモリマッピングI / Oはオペレーティングシステムによって内部的にのみ使用され、Linuxのプログラマは公開して使用しませんか?
ありがとうございます。
I / Oの場合、セクション1.2.1で説明されているように、各I / Oコントローラには転送されるコマンドとデータを保持するレジスタが含まれています。通常、特殊I / O命令を使用すると、これらのレジスタとシステムメモリ間のデータ転送が可能になります。 I/O デバイスにアクセスしやすくするために、多くのコンピュータ アーキテクチャでは以下を提供しています。メモリマップされたI/O。この場合、メモリアドレス範囲が予約され、デバイスレジスタにマッピングされます。これらのメモリアドレスを読み書きすると、データがデバイスレジスタに転送され、デバイスレジスタから転送されます。この方法は、ビデオコントローラなどの応答時間が速いデバイスに適しています。 IBM PC では、画面の各位置がメモリー位置にマップされます。画面にテキストを表示することは、適切なメモリマッピング位置にテキストを書き込むのと同じくらい簡単です。
...
プロセッサは、I / O転送を完了するためにコントローラにコマンドとデータをどのように発行しますか?簡単に言うと、コントローラにはデータと制御信号用の1つ以上のレジスタがあります。プロセッサは、これらのレジスタのビットパターンを読み書きする方法でコントローラと通信する。これらのコミュニケーションが行われる1つの方法は次のとおりです。特殊I/O命令を使用してI / Oポートアドレスに送信されるバイトまたはワードを指定します。 I / O命令はバスラインをトリガして正しいデバイスを選択し、ビットをデバイスレジスタの内外に移動します。または、デバイスコントローラが次をサポートできます。メモリマップされたI/O。この場合、デバイス制御レジスタはプロセッサのアドレス空間にマッピングされる。 CPUは、物理メモリのマップされた場所でデバイス制御レジスタを読み書きするために標準データ転送コマンドを使用してI / O要求を実行します。
ベストアンサー1
Linuxでは、MMIOをユーザースペースでmmap
使用できます/dev/mem
。たとえば、Xサーバーは次のことを行います。
fd = open("/dev/mem", O_RDWR);
if (ioBase == NULL) {
ioBase = (volatile unsigned char *) mmap(0, 0x20000,
PROT_READ | PROT_WRITE,
MAP_SHARED, fd, ioBase_phys);
}
close(fd);
場合によっては。ただし、これは廃止され、カーネルはこのタイプのアクセスを使用して実行できる操作を厳密に制御します。/dev/mem
必要CAP_SYS_RAWIO
、現在の展開カーネルは頻繁に使用されます。STRICT_DEVMEM
IO_STRICT_DEVMEM
アクセスを制限する渡す /dev/mem
DOSEMUまたはXに必要な、またはデバイスにマッピングまたは使用されていないメモリのさまざまな範囲(つまりドライバが処理しないデバイスにMMIOを提供します。