• 締切済み

LinuxのDMA転送でのメモリ操作について

Linux初心者です。 ユーザモードで動作しているプロセスからデバイスドライバに対してDMA転送要求を行った場合、ドライバでDMAバッファ用のメモリを確保すると思います。 ドライバはDMA転送用バッファとして、GFP_DMA指定でkmallocし、確保されるメモリ領域はZONE_DMAだと思います。 (PCIデバイスドライバの場合は、上記指定は必須ではないみたいですが。) ここで疑問なのですが、カーネルモードでしかアクセスできないZONE_DMA領域を、ユーザモードのプロセスがどのように扱うのでしょうか? ある本で「ユーザモードで動作中でもシステムコールに関してはCPU内でカーネルモードで動作する」というのを見たことがあるのですが、これによってZONE_DMA領域にアクセスできるようになるということでしょうか? ご存知の方がいたら、よろしくお願いします。 また、そもそも質問内容(前提)の間違えなどありましたらご指摘いただきたいです。

みんなの回答

  • noritsuu
  • ベストアンサー率100% (1/1)
回答No.2

kmallocで確保した領域はドライバからはアクセス可能です。 なので、ドライバインターフェースとして、以下の2点の関数を用意する。 ・ユーザにkmalloc領域内のデータを渡す関数 ・ユーザから受け渡されたデータをkmalloc領域内に格納する関数

  • u-kid
  • ベストアンサー率50% (34/67)
回答No.1

カーネル、デバイスドライバの中でもDMAは高度な話題になりますので、まずは一般的なデバイスドライバが、デバイスからand/orデバイスへのデータをどのようにバッファリングしているかを勉強された方がよいかと思います。 文字数などの制限で若干端折った説明になりますが、概ね次のようになります。 デバイスドライバはカーネル空間で動作していますので、バッファもカーネル空間内に置かれます。通常、I/OはCPUの処理速度に比べて、遅いことから、直接ユーザー空間のデータ領域にデータを入れることはせず、カーネル空間にバッファされます。(特に読み込み時)。その後、プロセスが要求するだけのデータが揃ったところで、カーネル空間のデータがユーザー空間にコピーされます。書き出し時もブロックデバイスのように一定のサイズ単位でないといけない物はカーネル空間でバッファリングされます(他にもいろいろな理由でバッファリングが行われます)。 特別な場合に直接ユーザー空間のデータをカーネル空間にマッピングしてI/O処理を行う場合がありますが、例外的な処理になります。 DMAの場合、ほとんどのデバイスが論理アドレスでの転送が出来ないため、直接ユーザー空間にデータを転送することは出来ません。従って、DMAの場合もいったんカーネル空間上のバッファにDMAで転送された後、ユーザー空間にコピーされることになります。 また、ユーザープロセスが直接デバイスに対してDMAで転送を要求することはありません。デバイスドライバが必要に応じてDMA転送を行います。 デバイスドライバを含むカーネルの役割、動作について理解されていないように見受けられますので、DMAの問題に取りかかる前に、基本的なことを勉強されることをお勧めします。

関連するQ&A

  • DMA転送になりません

    eitontonと申します。よろしくお願いいたします。 外付けHDDに編集したビデオをAVIで保存後、オーサリングソフトを使って、外付けDVDでビデオDVDを作成しようとしたところ、以下のようなメッセージが出てました。 『My DVDはシステムに接続されている1台以上のレコーディング機器に対してDMAがオフになっていることを検出しました。機器に問題なく書き込むためにDMAをオンにする必要があります。詳細はオペレーティングシステムのマニュアルを参照するか、オンラインヘルプをご覧ください。』 DMA転送に関する質問はいくつかあったので同じようにデバイスマネージャーからIDEチャネルのプロパティを開いて転送モードをDMAに変更しました。 再起動をした後、もう一度IDEチャネルのプロパティを開くと プライマリIDEチャネル デバイス0 転送モード:DMA(利用可能な場合) 現在の転送モード:ウルトラDMAモード4 デバイス1 転送モード:DMA(利用可能な場合) 現在の転送モード:無効 セカンダリIDEチャネル デバイス0 転送モード:DMA(利用可能な場合) 現在の転送モード:PIOモード デバイス1 転送モード:DMA(利用可能な場合) 現在の転送モード:無効 となっています。 やはり、オーサリングソフトを開こうとすると、上記のメッセージが出てDMAモードに変更できていないようです。 DMAモードにする方法を教えていただけないでしょうか。 PC環境は PC:Dynabook:T5/512CME OS:XP/SP2 外付けHDD:BUFFALO HD-HS320U2 外付けDVD:BUFFALO DVM-X16U2 HDD、DVDともにUSB2.0接続 Windows movie Maker で編集後 DVDに同封されていたMyDVDというオーサリングソフトを 開こうとしたらエラーメッセージが出てきました。 ※一度、そのまま書き込みをしたのですが、すぐにフリーズしてしまいました。 子供の成長記録をDVDに残したいと思っているのですが、上手くできずに困っています。よろしくお願いします。

  • DMA転送を有効にしたいのですが

    システムのプロパティ→デバイス マネージャ→ディスク ドライブ→目的のHDDの設定に「DMA転送」の項目が見当たりません。それと関係あるのかよくわかりませんが、「同期データ転送」という項目が有効になっています。使用OSはWindowsMe、Ultla ATA66のHDDを使用しています。 ちなみにデバイス マネージャ→DMA コントローラの設定の「予約メモリ」は32KBにしました。「メモリへのDMA転送を制限」は無効にしています。 よろしくお願いいたします。

  • DMAモードとPIOモード

    ATA規格の転送方法には、DMAモードとPIOモードというのがあるそうなんですが、DMAモードとPIOモードの転送速度はどの程度違うんでしょうか? マザーボードの説明書にはマスタにDMAデバイス、スレーブに非DMAデバイスを接続するように記載されていましたが、DMAモードはマスタデバイスのみで使用されるということでしょうか? また、ディスクの転送モードがDMAかPIOかを確認する方法があれば教えてください。

  •   DMA PIO  ドライブ転送モード

    http://www.iodata.jp/support/advice/dvr-abn4p/setup1.htm http://www.iodata.jp/support/advice/dvr-abn4p/setup4.htm 上記にDVDファームアップデートには 接続しているデバイスの転送モードを「DMA」から「PIO」に変更します  とあります [IDE ATA/ATAPI コントローラ]-[セカンダリIDEチャンネル](ドライブが接続しているチャンネル)をダブルクリックします。 ドライブが接続しているチャンネルがわかりません セカンダリ 詳細設定タブ  現在の転送モード PIOモード(デバイス0)デバイス1無効 プライマリ  現在の転送モード デバイス0 1共に無効なのでセカンダリに接続されていると考えていいですか? 2 「接続しているデバイスの転送モードを「DMA」から「PIO」に変更します」とあります。そして ファームアップデート実行してからDMAに戻すとあります ただ私のPCの設定では初めからPIOです ファームアップデートしてからDMAに戻す必要ありますか? 転送モードをDMA(利用可能な場合)に変更しても その下の現在の転送モードはPIOモードでかわりません 再起動などはしてませんが・・・ 関係あるかわかりませんが・・・・ MB  A8N SLI premium XPインストール初めは店でやってもらいました ちょっとここはあやふやなんですが 1回ファームアップデートやりました 上記URLその時は知らずに何もしないで実行しました その後しばらくして上記URL見つけて調べたらDMAだったような気がします ファームアップデート失敗でした その後XP再インストールしました NCQ使うには確か nforceドライバー??が必要とわかりそれを入れてます 店でやってもらった時はいれてなかったようです(=NCQ使えてない状態)

  • DMA転送モードが度々変わるのですが?

    タイトルの通りなのですが、DMA転送モードが起動の度に変わります。 装着しているHDDはATA100の物をプライマリに2基です。起ち上げた直後のBIOSの画面では2基ともDMA5と表示されているのですが、デバイスマネージャIDEチャネル(プライマリ)の詳細設定を見ますと、現在の転送モードが5のときあり、2のときあり、4のときありとまちまちです。デバイス0も1も両方こんな感じです。 同じような経験、対処の方法等ご存じの方がいらっしゃいましたらお願いします。 OSはwindowsXPsp1です。機種はEPSONDIRECT EdiCUBE MX2300ですが、HDDは当初より大容量のものに載せ替えてます。

  • HDDの転送速度がDMAにならないのですが・・・

    OS:windowsXP HDD:Maxtor 5T040H4 Maxtor 6Y160L0 上記の物を使用しているのですが、デバイスマネージャーで確認してみたところHDDは二つとも、標準デュアルチャネルPCI IDEコントローラーのプライマリIDEチャネルに接続されていて、プロパティーを開き詳細設定で転送モードをデバイス0、1共にDMAにしているのですが、現在の転送モードが二つともPIOモードのままなのですがDMAにすることは出来ないのでしょうか? 他にも、Intel(R) 82801FB Ultra ATA Storange Controllers-2651と Intel(R) 82801FB/FBM Ultra ATA Storange Controllers-266Fがあり、前者には、何も接続されていなく、後者の方のプライマリにはDVDドライブが接続されていて、こちらはプロパティの転送モードはDMAで、現在の転送モードもウルトラDMAモード2となっているのですが、HDDの方もこのようにはならないのでしょうか? どうか回答の方よろしくお願いします。

  • DMAに設定を変更できません

    内蔵のDVDドライブがいつのまにかPIOモードになっており、デバイスマネージャーでDMAモードに変更ができません 現在の環境は WindowsXP sp2 BIOS AMI マシン:Soltek DVD-D LG電子 GSA-4167B(IDEセカンダリマスターに設定) 現在のデバイスマネージャーのIDEコントローラーのセカンダリIDEチャンネルのプロパティを開くと、デバイス0のデバイスの種類は「自動検出」(グレー表示で選択不可)、転送モードは「DMA(転送可能な場合)」、現在の転送モードは「PIOモード」となっています。 プライマリIDEチャネルの転送モードはウルトラDMAモード5に設定されています どうしたらDMA転送に変更できるでしょうか よろしくお願いします

  • DMA転送の設定

    当方、XP HomeSP2を使用しております。 今使用している光学ドライブはLGのGSA-4163Bです。ファームウェアは最新の105。 この環境でDMA転送が有効になりません。現在PIOモードとなっています。 一時期有効になっていたような気がしたのですがうろ覚え状態です。 デバイスマネージャでDMAの設定にはしています。 光学ドライブのバンドルウェアのNero付属のツールを使用しても変わりません。 原因がわかるようであればご教授願います。 ベースとなるPCは日立プリウスの04年モデル。 光学ドライブを上記に交換。メモリを512追加しています。 読み書きが遅いだけで使えなくはないので 暇なときにお願いします。

  • DMA転送モードが上位のものになっています

    マザーボード(チップセット)上ではATA100までしか対応していない場合でも、ATA133対応のHDDを接続した場合、設定される転送モードはDMAモード6になるのでしょうか? 表示はモード6でも実際の転送速度はATA100のモード5で動作しているだけなら、特にかまいません。しかし、転送モードが上位になってしまうことで、転送不良などの不具合が発生してしまわないか心配です。 交換したHDDは MAXTOR製 6Y120P0 UltraATA133 120GB です。

  • 増設HDDの転送モードがDMAにならない

    増設したHDDの転送モードがDMAになりません。 このサイトなどの関連する情報を元に色々試しましたがだめでした。 (レジストリ操作、IDEチャネルドライバの削除など) ケーブルも問題ありません。 プライマリのデバイス0のHDDはDMA5動いているのですが スレーブに設定してあるデバイス1のHDDはPIOモードです。 増設したHDDもDMA5で動かすにはどうしたらよいのでしょうか? 現在の環境は以下の通りです。 M/B Name INTEL 875P Processor Intel(R) Pentium(R) 4 CPU 2.60GHz VideoCard 128 DDR ATI Radeon 9800 Resolution 1280x1024 (32Bit color) Memory 523,260 KByte OS WindowsXP Home SP1 Intel(R) 82801EB Ultra ATA Storage Controllers プライマリ IDE チャネル IC35L120AVV207-1 <= DMA5で動作中 ST3120026A      <= PIOで動作中 <=これをDMAで動かしたい Intel(R) 82801EB Ultra ATA Storage Controllers セカンダリ IDE チャネル _NEC DVD+RW ND-1100A