5

私はいくつかのプログラムを作成しましたが、64ビットでコンパイルすると、メモリマッピングセグメント(たとえば、共有オブジェクトと共有メモリが保持される場所)は常に7f9aca84a000-7fff88400000付近にありますが、まったく同じになることはありません。

x86_64アーキテクチャ(ELF64)でこのメモリセグメントの開始アドレスが固定されているかどうか、またはこのセグメントの最大範囲と最小範囲はどれくらいか知りたいのですが。

これが私がこの質問をする理由です。システムをTru64UNIXからLinuxに移行しています。このシステムは、IPC Sys V共有メモリの複雑な固定メモリマッピングを使用し、チェーンリストを使用してこのセグメント内の構造から別の構造に移動しています。このコードのサイズと複雑さ、および手元にある限られた時間で、共有メモリの開始を修正する堅牢な方法を見つけようとしています(セグメントをアタッチするために指定されたアドレスでshmatを効果的に使用します) )。64ビットの仮想アドレス空間は非常に大きいため(48ビットの事実上可能なアドレス)、「安全な」固定アドレスの選択は32ビットよりもはるかに簡単でリスクが少なくなります。

4

3 に答える 3

4

mmaped セグメントの固定開始アドレスはありますか?

いいえ。Linux は ASLR (Address Space Layout Randomization) をサポートしています。これは、プログラム内のアドレスにランダム性の要素があることを意味します。これは、一部のエクスプロイトが成功する可能性を低くするためです。さらに、おそらく一部のカーネル パッチは異なる ASLR 戦略を実装しています (通常の x86 では実装されています)。PaX、exec-shield などを考えてみてください。

したがって、固定アドレスを使用したい場合は、@Ethereal が推奨するように MAP_FIXED を使用することで解決できます。

于 2011-10-11T19:29:35.923 に答える
4

x86-64 メモリ マッピング レイアウトは で定義されていarch/x86/mm/mmap.cます。ご覧のとおり、トップダウンとボトムアップの 2 つの戦略が使用されています。

トップダウン割り当てがデフォルトです。スタックの最大範囲 (スタック rlimit で定義) の 128MB 下から開始し、ランダムなオフセットで微調整し、そこから後続のマッピングをメモリ内で下方に割り当てます。

ボトムアップの割り当てはフォールバックです。次のいずれかの場合に使用されます。

  • スタック rlimit は無制限です。
  • プロセスにはADDR_COMPAT_LAYOUTパーソナリティ セットがあります。また
  • vm.legacy_va_layoutsysctl がゼロ以外です。

ボトムアップの割り当てでは、マッピングされた領域は から始まりTASK_SIZE / 3、ランダムなオフセットによって微調整されて、徐々に高いアドレスが割り当てられます。 TASK_SIZEx86-64 では が0x800000000000であるため、ボトムアップの割り当ては から開始され0x2AAAAAAAAAAAます。

どちらの割り当て戦略でも問題ない固定マッピングに適した穴をお勧めします2 * TASK_SIZE / 3-私は を使用します0x500000000000

于 2011-10-12T02:13:14.783 に答える
3

直接的な答えはまだありませんが (まだ!)、より高いメモリ範囲をはるかに超えてメモリをマッピングすることに成功したと言えます。例えば:

#include <stdio.h>
#include <sys/mman.h>
#include <stdint.h>

#define ADDRESS 0x700000000

int main(int argc, char *argv[]) {
    uint64_t *map = mmap((void *)ADDRESS, 4096, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);

    map[0] = 64;

    printf("Value: %lu\n", map[0]);

    munmap(map, 4096);

    return 0;
}

申し訳ありませんが、現時点ではカーネル ソースを確認する時間がありませんが、後で必ず確認します。この質問に対する答えは何だろうといつも思っていました。. .

于 2011-10-11T16:19:25.380 に答える