
mmap()の第一引数(仮にstartとします)にNULLを指定した場合と
特定のアドレスを指定した場合の挙動の違いが判らないのですが
御存知の方おられましたら、御教授頂けませんでしょうか
今、理解できているのは
・NULL指定した場合は、kernelにおまかせで仮想アドレスを割り当ててもらう。
・startに特定アドレスを指定した場合は、mmap()の戻り値はstartに指定したアドレスになる。(当然か。。。)
※また、startにNULLを指定した場合はキャッシャブルで特定アドレスを指定した場合は、非キャッシャブルという記述をどこかのHPで見かけたのですが、この意味がわかりません。どなたか御教授頂けると助かります。
宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
・NULL指定した場合は、kernelにおまかせで仮想アドレスを割り当ててもらう。
・startに特定アドレスを指定した場合は、mmap()の戻り値はstartに指定したアドレスになる。(当然か。。。)
-----
その通りです。私は NULL を指定したことしかありません。なぜなら、mmap() を複数回行うと、それぞれのアドレス範囲が重ならないように注意しなければなりませんから。NULL だと kernel が自動的にやってくれますので、この心配がありません。
逆に strart アドレスを指定する方が、一般に少ないと思います。mmap() は shared library とか、場合によっては malloc() とかからでも呼び出される事があり、特に shared library のアドレスは kernel が決め打ちだったりします。ということで、mmap() の start アドレスは、実際には任意の値とすることができないので、プロセスのアドレスマップに精通するなど、かなり注意を要します。
間違って既に mmap() してある領域に新たに mmap() すると、どうなるか、これは kernel 依存だったような気がします。物によってはエラーにならずに黙って mmap() して、mmap() したとたん今までとは違ったメモリの内容が見えたりすると、かなり原因究明に困難をきたす事も考えられます。
「キャッシャブル」云々はカーネル内での mmap の話ではありませんか?PCI デバイスなどの PCI アドレスにマップされたデバイスのメモリをアクセスする場合、デバイスが I/O 等の結果により自分(デバイス)のメモリ(これは 例えば PCI カードに乗っているメモリで、普通にいうメモリではない)を書き換えてしまうと、CPU のキャッシュにはその変更が反映されないため、非常に困ったことが起きます。このためデバイスが自分のメモリを書き換える時は、「このデバイスのメモリはキャッシュしないでマップする」というようにします。もちろんこうするとこのページへのアクセスは遅くなりますが、仕方がないですよね。
Linux だと PCI デバイスのマップは "/sbin/lspci -v" とかで見ることができます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- 電車・路線・地下鉄 仙台~大宮間の週末パスを利用したはやぶさ乗車について 2 2022/09/19 19:50
- Excel(エクセル) 【マクロ】webアドレスにて指定されたCSVファイル【excelソフト表示】を印刷する件 1 2023/02/15 01:52
- Visual Basic(VBA) 指定文字を太字にするVBAを別シートのセルを指定する構文(改良について) 6 2022/08/27 22:11
- その他(プログラミング・Web制作) このプログラミング誰か教えてくれませんか 4 2022/04/29 15:56
- Visual Basic(VBA) 特定の文字を含むシートだけマクロ処理をしたい 1 2023/05/22 01:43
- その他(インターネット接続・インフラ) ブラウザにIPアドレス入力した時 1 2022/06/16 19:08
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- YouTube youtube動画再生について… 1 2022/04/08 04:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メモリのセグメント違反の解決...
-
変数のスコープはどうするのが...
-
メモリが不足しています(VBA)
-
VBAの配列サイズとメモリに関して
-
VB.netでUSBメモリの固有I...
-
DirectX9でのテクスチャフォー...
-
C言語で、メモリを解放しないで...
-
C言語で1度に使用可能な変数...
-
C言語で再帰的処理が出来ない理由
-
マインスイーパ、自動解析プロ...
-
「ヒープサイズの設定」て何?
-
計算速度が遅い
-
64bitでメモリアロケートエラー...
-
malloc関数の使い終わった後の...
-
Connection、ResultSet、、Stat...
-
Visual Basic Net2003
-
ACCESS2007使用時のメモリ使用...
-
非再入可能なプログラム
-
sil_rew_memのメモリアクセスに...
-
ポップアップメニューを使った...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
メモリが不足しています(VBA)
-
メモリのセグメント違反の解決...
-
「memcpy」と「strcpy」について
-
メモリ不足
-
「ヒープサイズの設定」て何?
-
エクセルのメモリ使用状況/Appl...
-
C言語における再帰呼び出しの...
-
ファイルマッピング関数で失敗
-
ExitProcessの関数コールについ...
-
EXCEL-VBAにてADOのレコードセ...
-
エクセルVBA 大容量CSVファイル...
-
ExcelのVBAでメモリ解放できない
-
メモリを解放しないとどうなる?
-
バッチファイルでの実行EXEのメ...
-
Bitmapを重ね合わせる方法
-
ルネサスマイコン(R8C) ビルド...
-
C,C++プログラムの強制終了時の...
-
C言語:関数のメモリ上でのサイ...
おすすめ情報