C ++では、0x1000などの特定のアドレスで始まる特定のサイズの配列(short array [2048]など)を作成することは可能ですか?
5 に答える
組み込みシステムでは、リンカー ファイルを使用して、そこにシンボルまたは特別なセグメントをマップできます。またはおそらくプラグマ。これは、ブートローダーが起動するアプリとの共有メモリ空間を必要とする組み込みシステムや、コプロセッサが固定アドレスのメイン CPU と共有メモリ バンクを持っている組み込みシステムではよくあることです。問題は、ツールごとに方法が異なることです。
簡単な答え: いいえ。非組み込みシステム(回答を限定します) では、ユーザー アドレス空間は仮想アドレス空間です。つまり、物理メモリマップ内の割り当てられたデータの物理的な場所ではない0x1000 を指すポインターを取得したとしても。したがって、システムは物理アドレスを非表示にするため、特定の物理アドレスを要求することはできません。ただし、仮想アドレスは別の話です...
0x1000 を指しているからといって実際に物理アドレス0x1000を指しているという保証はないことを理解した上で、Linux ではこの関数mmap()
とその Windows 版を使用して、特定の仮想アドレスVirtualAlloc()
への割り当てを要求できます。もちろん、これらの機能が動作することは保証されていません (たとえば、要求している仮想アドレスが既にマップされている場合や、システムが「予約済み」である場合)。
配置 new を使用して可能です:
struct A { short array[2048]; };
char *addr = (char*)0x1000;
new (addr) A;
動的サイズが必要な場合は、次を使用します。
new (addr) short[size];
特定のアドレスにそのような配列が必要な場合は、それを構造体に配置して、目的の場所を指すポインターを割り当てることができます。次の例を参照してください。
struct A {
short array[2048];
};
int main(char argc, char** argv) {
A* a = (A*)0x1000;
printf("%p\n", &a->array[0]);
return 0;
}