メモリアドレスを変数にマップします[重複]

Aug 18 2020

メモリアドレスを変数にマップして、そのメモリ位置に構造を作成するにはどうすればよいですか?次のコードを試して、指定されたメモリアドレスに構造体を作成しようとしましたが、セグメンテーション違反をダンプするだけですか?

コード内のメモリ位置は入力領域であり、特定のデータを設定し、オペコードでドアベルを鳴らして、CPUが入力データを取得し、入力領域のデータに対してオペコードが指示することを実行する必要があります。

    some_struct* some_struct_obj= (some_struct*)0xc321000000;
    memset(some_struct_obj, 0x00, sizeof(some_struct));

回答

1 eerorika Aug 17 2020 at 22:43

メモリアドレスを変数にマップします

C ++には、変数の正確な場所を選択する方法はありません。選択できるストレージクラスは、自動、静的、またはスレッドローカルのみです。言語実装はアドレスを選択します。

メモリアドレスを...にマップして、そのメモリ位置に構造を作成するにはどうすればよいですか?

動的ストレージ(変数ではない)を備えたオブジェクトは、そのメモリが割り当てられていて、重要なオブジェクトが含まれていない限り、任意のメモリアドレスに作成できます。これは、placement new式、または内部でplacementnewを実行するいくつかの標準関数を使用して実現できます。

標準のC ++には、任意のアドレスからメモリを割り当てる方法はありません。言語の実装は、変数と動的オブジェクトへのメモリの割り当てを処理します。

仮想メモリのない組み込みシステムでは、言語の実装により、割り当てられた特定のメモリアドレス範囲が文書化される場合があります。このような場合は、placement newを使用して、そのメモリにオブジェクトを作成できます。このようなアドレスを使用すると、他のシステムに移植できなくなります。


非標準的な方法はどうですか?はい、存在する可能性があります。たとえば、POSIX標準は次のmmap機能を指定します。

pa=mmap(addr, len, prot, flags, fildes, off);

このパラメーターflagsは、マップされたデータの処理に関するその他の情報を提供します。フラグの値は、<sys /mman.h>で定義されているこれらのオプションのビット単位のORです。

Symbolic Constant  Description
MAP_SHARED         Changes are shared.
MAP_PRIVATE        Changes are private.
MAP_FIXED          Interpret addr exactly.

MAP_FIXEDがflags引数に設定されている場合、実装には、paの値がaddr正確にであることが通知されます。

ただし、Linuxのマンページから次のことを検討してください。

の唯一の安全な使用法MAP_FIXEDは、で指定されたアドレス範囲addrと長さが以前に別のマッピングを使用して予約されていた場合です。そうしないと、MAP_FIXED既存のマッピングが強制的に削除され、マルチスレッドプロセスが自身のアドレス空間を簡単に破壊できるため、の使用は危険です。