
オペレーティングシステムの概念では、メモリマッピングファイルとメモリマッピング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を提供します。
答え2
メモリマップされたI / Oは、mmap()
ファイルの領域を読み取り、マップされたデータを使用して実行されます。
最新のOSを使用している場合、OSはmmappを使用して内部でほとんどのI / Oを実行します。
ファイルの一部を一時カーネル領域にマッピングする
copyout()
データをユーザーのアドレス空間にマップします。これにより、ファイルの内容がカーネルの一時メモリ領域に誤って書き込まれます。マップ解除エリア
mmap()
注:ユーザースペースからハードウェアにアクセスすることに言及している場合、これは通常、グラフィックボードからハードウェアを取り出し、ユーザースペースからアクセスするXサーバーによって行われます。
この場合、デバイスレジスタはメモリアドレスでアクセスでき、カーネル内にあるように見えるコードを書くだけです。つまり、 read() または write() を使わずにハードウェアレジスタアドレスへのポインタを逆参照するだけです。