0

私は、任意の長さの複数のデータ配列を、制御できない固定メモリアドレスにマップする必要がある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 は好きではありません (たとえば、大きすぎる、または整列していない)ページ境界上)」。しかし、どちらが問題なのかはまだわかりません。

4

2 に答える 2

1

それが私のDebian システム上のプロセス0x400000のアドレスであるように思われる(が異なる) ことを考えると、あなたが考えたように、既存のものにマップしようとしているために失敗しているのではないかと思います。どのセグメントがマップされている/使用可能であるかを (プログラムで) 判断する最善の方法はわかりませんが、まず、いくつかの「典型的な」プロセスを調べて、システムがプログラムとライブラリにアドレス範囲をどのように割り当てているかを確認できます。アドレス空間のランダム化もそこにいくつかの余分なしわを投げかけます....textamd64x86/proc/<pid>/maps

于 2012-07-27T16:53:24.160 に答える
0

これは私がかなり前に書いた例で、固定アドレスのmmapを実行します。ピクセルを設定/クリアする目的でフレームバッファをマップします。

http://stromberg.dnsalias.org/~strombrg/pbmonherc.html

videoBase = (unsigned char *) mmap((caddr_t) videoBase, VideoRamLength,
                   PROT_READ | PROT_WRITE,
                   MAP_SHARED | MAP_FIXED,
                   fd, VideoRamStart);

fdは/dev/memに対して開かれています。

于 2012-07-27T16:35:33.917 に答える