Gcc 何时将虚拟地址(VA)分配给应用程序?(运行时/编译时)

Gcc 何时将虚拟地址(VA)分配给应用程序?(运行时/编译时),gcc,linker,arm,mmu,virtual-address-space,Gcc,Linker,Arm,Mmu,Virtual Address Space,将应用程序二进制文件加载到RAM中,并使用GCC编译 该二进制文件是否从0x0或其他值开始获取虚拟地址(VA) (当我检查应用程序二进制文件时,在应用程序中看不到任何VA)我读了很多文章,找到了一个答案,可以解决我的一些问题 GCC使用ELF格式创建应用程序二进制文件。 如果您执行“readelf-a app_binary”,那么它将显示应用程序的入口点地址 使用GCC编译的应用程序在64位系统中使用起始虚拟地址0x400000,在32位系统中使用起始虚拟地址0x804800 所以,如果我们尝试

将应用程序二进制文件加载到RAM中,并使用GCC编译

该二进制文件是否从0x0或其他值开始获取虚拟地址(VA)


(当我检查应用程序二进制文件时,在应用程序中看不到任何VA)

我读了很多文章,找到了一个答案,可以解决我的一些问题

GCC使用ELF格式创建应用程序二进制文件。 如果您执行“readelf-a app_binary”,那么它将显示应用程序的入口点地址

使用GCC编译的应用程序在64位系统中使用起始虚拟地址0x400000,在32位系统中使用起始虚拟地址0x804800

所以,如果我们尝试访问0x0-0x3fffff,那么就会看到分段错误。因为虚拟内存没有定义


如果我的答案有错误,请更正。:-)

你指的是哪一个?至少试着解释一下你在问什么。很明显,VA是指标签上的虚拟地址。但是,这些都是由操作MMU的操作系统或至少是代码分配的。这取决于操作系统,没有给出详细信息“链接器”是一个有趣的标记,因为“加载器”实际上是分配给它的。一般来说,应用程序可以自由使用所有地址空间,例如0-1GB。加载程序将映射共享库和其他功能。我同意夜猫子的看法,这个问题肯定需要进一步研究。对此夜猫子表示抱歉。更正它。它可以是运行时或编译时;这取决于操作系统。在编译时是最简单的,因为生成的代码可以在本地更优化。但是,可以生成PC相对代码或数据地址相对代码,让操作系统/加载程序在运行时重新定位代码。99%的代码可能是与PC相关的,有一些是绝对的修正,等等。它也可能是两者兼而有之。运行时对于系统来说更为优化,因为如果您可以移动内容,共享库可以更容易地共享。这在全球范围内可能更为理想。例如,malloc总是在缓存中等。