このドキュメントで説明するソフトウェアは、Extended SupportまたはSustaining Supportのいずれかにあります。 詳細は、https://www.oracle.com/us/support/library/enterprise-linux-support-policies-069172.pdfを参照してください。
Oracleでは、このドキュメントに記載されているソフトウェアをできるだけ早くアップグレードすることをお薦めします。
カーネル空間とユーザー空間との間でデータを移行する場合は、copy_from_user()
関数とcopy_to_user()
関数を使用できます。 1、2、4、8バイトのデータを移行するときは、put_user()
とget_user()
、またはaccess_ok()
を使用してユーザー空間アドレスを検証してから、__put_user()
または__get_user()
を実行することもできます。
ユーザー・プログラムがデバイス・メモリーに直接アクセスする必要がある場合は、mmap()
システム・コールを使用して、デバイス・メモリーをユーザー空間に直接マップできます。 たとえば、Xサーバーはmmap()
を使用してビデオ・アダプタ・メモリーに書き込み、PCIデバイスは通常、制御レジスタをメモリー・マップしてパフォーマンスを向上させます。 制限事項は、マップ領域がPAGE_SIZE
の倍数でなければならず、またPAGE_SIZE
の倍数の物理メモリー・アドレスで開始する必要がある点です。
直接I/O get_user_pages()
関数を使用すると、ユーザー空間とカーネル空間との間でデータ・コピーのオーバーヘッドを生じさせることなく、ドライバはユーザー空間バッファを使用できます。 ただし、ほとんどのブロック・ドライバとネットワーク・ドライバでは、カーネルに組み込まれたハードウェア抽象化により必要に応じて直接I/Oを使用できるので、直接I/Oの実装は不要です。 直接I/Oを使用してDMA操作を実行するドライバは通常、バッファにscatter/gatherリストを設定します。 get_user_pages()
を使用するときは、down_read()
およびup_read()
も使用して、コールする前後に読取りモードのセマフォを設定する必要があります。
同じように非同期I/Oをサポートした、直接I/Oバッファの使用にかわる方法には、データの読み書きにaio_read()
メソッドとaio_write()
メソッドを使用するやり方があります。 読取り/書込み操作が完了すると、ドライバはaio_complete()
をコールしてカーネルに通知します。