2

I/Oメモリ(HIGHMEM)からHDDにデータを書き込もうとしています。 私はio_remap_pfn_range()を使ってメモリバッファをmmapしました。 私のアプリケーションは、ディスクの読み書き操作のためにO_DIRECTを使います。 O_DIRECTを使用すると、writeはEFAULT(不良アドレス)を返します。 IOページ が拒否されているmm/memory.cの__get_user_pagesに移動しました。そして、これは私の現在の知識が私に にカーネルに入るのを許すほど深いです。 IOポインタがなぜ でないのか分かりません。超高速ディスクIOは私たちのプロジェクトの要件です。その間に のコピーはオプションではありません。どんなヒントもありがとうございます。O_DIRECTとIOメモリを使用する

ありがとうございます!

答えて

1

なるほど(あなたがio_remap_pfn_rangeを使用する場合、それは「それらのページは、通常の構造体のページとの定期的なページではありません」告げるVM_PFNMAPフラグ(http://elixir.free-electrons.com/linux/v4.11.7/source/mm/memory.c#L1914)を設定します
http://elixir.free-electrons.com/linux/v4.11.7/source/include/linux/mm.h#L174)それがすべてあるためVM_PFNMAPフラグの起こることを、考えて上記のコードのコメント)
__get_user_pagesはこのフラグをチェックし、エラー(http://elixir.free-electrons.com/linux/v4.11.7/source/mm/nommu.c#L136
PSを返しますVM_IOフラグもio_remap_pfn_range__get_user_pagesの両方にあるため、カーネルページにI/Oが存在せず、ユーザー空間にマップされるか、誰でもカーネルメモリを書き換えます。

関連する問題