私は、任意の長さの複数のデータ配列を、制御できない固定メモリアドレスにマップする必要がある64ビットLinuxマシンでプログラムに取り組んでいます。MAP_FIXED と MAP_ANONYMOUS を使用した mmap() が最適だと思いました。たとえば、次のようになります。
mmap((void *) 0x401000, 0x18e, PROT_NONE, MAP_ANONYMOUS | MAP_FIXED, -1, 0);
ただし、この関数を呼び出すたびに MAP_FAILED が返されます。fdを -1 に設定しました。これは一部のシステムで必要であることがわかっています。アドレスはページ サイズ (4096) の倍数であり、長さは負ではないため、おそらく 0x401000 が既に実行されているのではないかと考えています。私のシステムで使用されています。0x402000、0x403000、および 0x404000 も同じ結果で試しました。
mmap() について私が見逃しているものはありますか、またはこのアドレスに既にあるものを見つける方法はありますか? さらに良いことに、必要なアドレスを制御できないため、既存のマッピングに遭遇しないようにするためのより良い方法はありますか?
編集: を確認errno
したところ、取得しているコードが無効な引数であることがわかりました。そのため、man ページによると、「addr、length、または offset は好きではありません (たとえば、大きすぎる、または整列していない)ページ境界上)」。しかし、どちらが問題なのかはまだわかりません。