メモリアドレスを変数にマップします[重複]
メモリアドレスを変数にマップして、そのメモリ位置に構造を作成するにはどうすればよいですか?次のコードを試して、指定されたメモリアドレスに構造体を作成しようとしましたが、セグメンテーション違反をダンプするだけですか?
コード内のメモリ位置は入力領域であり、特定のデータを設定し、オペコードでドアベルを鳴らして、CPUが入力データを取得し、入力領域のデータに対してオペコードが指示することを実行する必要があります。
some_struct* some_struct_obj= (some_struct*)0xc321000000;
memset(some_struct_obj, 0x00, sizeof(some_struct));
回答
メモリアドレスを変数にマップします
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
既存のマッピングが強制的に削除され、マルチスレッドプロセスが自身のアドレス空間を簡単に破壊できるため、の使用は危険です。