
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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Windows11 デバイスセキュリテ...
-
Windows Vistaは本当にゴミOSな...
-
Fedora Core 4でのKernelコンパ...
-
Windows2000を最新マシンにイン...
-
リテール版とは通常版のことで...
-
パソコンでゲームをプレイしよ...
-
自分は、パソコンにAPEXを入れ...
-
1枚でも「1枚”組”」なのですか?
-
ubuntu 初期化について
-
CD-ROMの認識方法について(MS-...
-
rpm コマンドでエラーが…
-
パッケージが既存のパッケージ...
-
Ubuntuをインストールし、ユー...
-
MS-DOSが認識できるHDの....
-
osインストールできない
-
REGZA HDD Easy Copy
-
PUTTYでログインしたコンソール...
-
Debianでのmakeコマンドインス...
-
メールソフトBecky!について
-
パッケージとRPMについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SolarisとLinuxの違い
-
パフォーマンスモニタの%Proces...
-
/dev/nvme0n1p2 clean と表示さ...
-
モジュールの場所を確認できま...
-
Linuxって何?
-
カーネルアップグレード後、una...
-
アップデートをかけたら、ブー...
-
カーネル更新
-
pppoe
-
カーネルの再構築について
-
LINUXはどうして普及したのでし...
-
重厚長大なOSは必要か。
-
「モジュールの場所を確認でき...
-
基本ソフトと応用ソフトの仕事...
-
XPが再起動ばかりを繰り返します
-
最近、よくOpenWall という言葉...
-
RHL7.2でカーネルの再構築
-
Linuxカーネルは誰が動かしてい...
-
*長文となっております、予めご...
-
boot領域のlvmについて
おすすめ情報