Linux初心者です。
ユーザモードで動作しているプロセスからデバイスドライバに対してDMA転送要求を行った場合、ドライバでDMAバッファ用のメモリを確保すると思います。
ドライバはDMA転送用バッファとして、GFP_DMA指定でkmallocし、確保されるメモリ領域はZONE_DMAだと思います。
(PCIデバイスドライバの場合は、上記指定は必須ではないみたいですが。)
ここで疑問なのですが、カーネルモードでしかアクセスできないZONE_DMA領域を、ユーザモードのプロセスがどのように扱うのでしょうか?
ある本で「ユーザモードで動作中でもシステムコールに関してはCPU内でカーネルモードで動作する」というのを見たことがあるのですが、これによってZONE_DMA領域にアクセスできるようになるということでしょうか?
ご存知の方がいたら、よろしくお願いします。
また、そもそも質問内容(前提)の間違えなどありましたらご指摘いただきたいです。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
kmallocで確保した領域はドライバからはアクセス可能です。
なので、ドライバインターフェースとして、以下の2点の関数を用意する。
・ユーザにkmalloc領域内のデータを渡す関数
・ユーザから受け渡されたデータをkmalloc領域内に格納する関数
No.1
- 回答日時:
カーネル、デバイスドライバの中でもDMAは高度な話題になりますので、まずは一般的なデバイスドライバが、デバイスからand/orデバイスへのデータをどのようにバッファリングしているかを勉強された方がよいかと思います。
文字数などの制限で若干端折った説明になりますが、概ね次のようになります。
デバイスドライバはカーネル空間で動作していますので、バッファもカーネル空間内に置かれます。通常、I/OはCPUの処理速度に比べて、遅いことから、直接ユーザー空間のデータ領域にデータを入れることはせず、カーネル空間にバッファされます。(特に読み込み時)。その後、プロセスが要求するだけのデータが揃ったところで、カーネル空間のデータがユーザー空間にコピーされます。書き出し時もブロックデバイスのように一定のサイズ単位でないといけない物はカーネル空間でバッファリングされます(他にもいろいろな理由でバッファリングが行われます)。
特別な場合に直接ユーザー空間のデータをカーネル空間にマッピングしてI/O処理を行う場合がありますが、例外的な処理になります。
DMAの場合、ほとんどのデバイスが論理アドレスでの転送が出来ないため、直接ユーザー空間にデータを転送することは出来ません。従って、DMAの場合もいったんカーネル空間上のバッファにDMAで転送された後、ユーザー空間にコピーされることになります。
また、ユーザープロセスが直接デバイスに対してDMAで転送を要求することはありません。デバイスドライバが必要に応じてDMA転送を行います。
デバイスドライバを含むカーネルの役割、動作について理解されていないように見受けられますので、DMAの問題に取りかかる前に、基本的なことを勉強されることをお勧めします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Windows8 ntoskrnl.exeについて
-
LinuxでIDE、SATAの認識順番に...
-
カーネルスタック不足について
-
linuxカーネルのダウングレード...
-
UNIXとBSDとLinuxの違いを小学...
-
LinuxのDMA転送でのメモリ操作...
-
割り込み不可能?なプロセスを...
-
SolarisとLinuxの違い
-
ブルースクリーンの原因が「ntk...
-
BSDでフォーマットされたHDDは...
-
Dockerコンテナ(centos7.9)の...
-
ザウルス SL-C860のフリーズは...
-
パフォーマンスモニタの%Proces...
-
カーネルバッファとは何でしょうか
-
CentOS6.2のカーネルコンパイル
-
Linuxでcrcエラー?
-
HP-UX(11.23)からDAT装置を認識...
-
KNOPPIXが起動しない場合の対処...
-
Daemonの由来、語源とは??
-
ubuntu 初期化について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
/dev/nvme0n1p2 clean と表示さ...
-
SolarisとLinuxの違い
-
パフォーマンスモニタの%Proces...
-
割り込み不可能?なプロセスを...
-
ブルースクリーンの原因が「ntk...
-
KNOPPIXが起動しない場合の対処...
-
romfsってなんですか?
-
UNIXとBSDとLinuxの違いを小学...
-
Linux 32Bitと64Bitのメモリー...
-
カーネルバッファとは何でしょうか
-
Windows Vistaは本当にゴミOSな...
-
エラー”Illegal seek”はどんな...
-
カーネルアップグレード後、una...
-
/proc/sys/net/ipv4/route/flus...
-
Dockerコンテナ(centos7.9)の...
-
魔改造版Windows 2000をインス...
-
Linux のカーネル・パニックに...
-
SunOS5.x と Solarisの違いは?
-
USB接続シリアル変換ケーブル
-
CentOS5.3でNICを認識しない
おすすめ情報