
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で質問しましょう!
似たような質問が見つかりました
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- デスクトップパソコン ん~…分からん 7 2022/06/10 10:47
- 日本語 「に」について 9 2022/10/25 16:32
- CPU・メモリ・マザーボード CPUで動作しているOSについての質問です。 3 2023/05/05 00:10
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- Web・クリエイティブ デザイン 6 2023/08/04 09:54
- CPU・メモリ・マザーボード デスクトップPCのOS(C:)の空き領域がどんどん減ります。 9 2022/12/12 09:24
- 戦争・テロ・デモ 日本海と竹島を日本の防衛範囲領域に管理してほしいと思います。防衛省は可能でしょうか。? 6 2023/01/06 07:43
- 保育士・幼稚園教諭 保育の課題で、みなさんに至急確認してもらいたいのですが、総合的指導とはなにか→1つの遊びを取り上げて 1 2023/08/28 21:30
- 保育士・幼稚園教諭 保育の課題で、みなさんに至急確認してもらいたいのですが、総合的指導とはなにか→1つの遊びを取り上げて 1 2023/08/28 21:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SolarisとLinuxの違い
-
apacheのプロセス数が不安定
-
パフォーマンスモニタの%Proces...
-
CentOS5.3はなぜカーネルが2つ...
-
Fedora Core 4でのKernelコンパ...
-
Linux 32Bitと64Bitのメモリー...
-
Daemonの由来、語源とは??
-
CentOS6 の画面サイズの設定
-
Dockerコンテナ(centos7.9)の...
-
CentOSのデスクトップ画面が立...
-
ubuntu 初期化について
-
外部レポジトリとは
-
「クラスが登録されていません 」
-
パソコンでゲームをプレイしよ...
-
Ubuntuをインストールし、ユー...
-
ubuntu8.0.4にopenssl-develを...
-
Ubuntu on Xorgのログインについて
-
PUTTYでログインしたコンソール...
-
Windows10を削除する方法が分か...
-
RedHat & 東芝Dynabookでのマウ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パフォーマンスモニタの%Proces...
-
割り込み不可能?なプロセスを...
-
/dev/nvme0n1p2 clean と表示さ...
-
『カーネルとの通信中にエラー...
-
KNOPPIXが起動しない場合の対処...
-
カーネルバッファとは何でしょうか
-
SolarisとLinuxの違い
-
Windows Vistaは本当にゴミOSな...
-
*長文となっております、予めご...
-
/proc/sys/net/ipv4/route/flus...
-
romfsってなんですか?
-
カーネルアップグレード後、una...
-
エラー”Illegal seek”はどんな...
-
linuxカーネルのダウングレード...
-
魔改造版Windows 2000をインス...
-
UNIXとBSDとLinuxの違いを小学...
-
CentOS5.3でNICを認識しない
-
LAMP環境でのパーティション構...
-
Windowsのソースコードって非公...
-
D525MWにCentOS6でLANが繋がらない
おすすめ情報