dポイントプレゼントキャンペーン実施中!

mmap()の第一引数(仮にstartとします)にNULLを指定した場合と
特定のアドレスを指定した場合の挙動の違いが判らないのですが
御存知の方おられましたら、御教授頂けませんでしょうか

今、理解できているのは
・NULL指定した場合は、kernelにおまかせで仮想アドレスを割り当ててもらう。
・startに特定アドレスを指定した場合は、mmap()の戻り値はstartに指定したアドレスになる。(当然か。。。)

※また、startにNULLを指定した場合はキャッシャブルで特定アドレスを指定した場合は、非キャッシャブルという記述をどこかのHPで見かけたのですが、この意味がわかりません。どなたか御教授頂けると助かります。

宜しくお願い致します。

A 回答 (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" とかで見ることができます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!