在C ++中,是否可以创建一个特定大小的数组(例如短数组[2048]),该数组从特定地址开始,例如0x1000?
答案 0 :(得分:1)
在嵌入式系统中,您可以使用链接器文件在那里映射符号或特殊段。或者可能是一个pragma。对于嵌入式系统来说,这是很常见的事情,其中引导加载程序需要与启动的应用程序共享内存空间,或者协处理器具有共享内存库,主CPU位于固定地址。问题是该方法因工具而异。
答案 1 :(得分:0)
简答:不。 在非嵌入式系统(我将限制我的答案)中,用户地址空间是虚拟地址空间。这意味着,即使您获得的指针指向0x1000,该指针不是物理内存映射中已分配数据的物理位置。因此,由于系统会隐藏您的物理地址 - 您无法请求特定的物理地址。然而,虚拟地址是adiffernet故事......
了解到无法保证指向0x1000实际上意味着您指向物理地址 0x1000,在Linux中您可以使用函数mmap()
及其Windows对应物VirtualAlloc()
请求分配到特定的虚拟地址。当然,这些功能不能保证工作(例如,如果您要请求的虚拟地址已经映射,或者系统是“保留”)。
答案 2 :(得分:0)
可以使用新的展示位置:
struct A { short array[2048]; };
char *addr = (char*)0x1000;
new (addr) A;
如果您想要动态尺寸,请使用以下内容:
new (addr) short[size];
答案 3 :(得分:0)
假设是嵌入式系统,您的问题确实很合理 。
通常,您将通过定义具有寄存器大小的易失性指针来访问外设的内存映射寄存器。但是,由于这种方法很常见,因此一旦涉及到诸如MISRA或CERT C之类的编码标准,它就有一个缺点。这些标准声称指针通常在安全关键系统中是危险的事情。因此,您应尽可能避免使用它们。
当我偶然发现这个问题一段时间时,ARM似乎提供了类似“ Mapping variables to specific addresses”这样的“更好”的方法。您必须在自己的编译单元中定义结构/数组(其结果是单个.o文件)。之后,您需要编写一个链接器文件,将单个.o文件放在指定的地址。
答案 4 :(得分:-1)
如果你想要一个特定地址的数组,你可以把它放在一个结构中,然后你可以指定一个指向所需位置的指针。见这个例子:
struct A {
short array[2048];
};
int main(char argc, char** argv) {
A* a = (A*)0x1000;
printf("%p\n", &a->array[0]);
return 0;
}