繁体   English   中英

x86 程序集中的 .data 部分

[英].data section in x86 assembly

我正在尝试学习汇编语言,但无法理解通过 .data 部分声明全局变量的概念。当您在 .data 部分声明变量时,汇编器/链接器会将其映射到内存位置。 但是它如何知道在编译源代码时可用的空闲内存。 如果内存分配是在运行时完成的,那么程序如何知道在哪里分配内存,因为我们没有在代码中这样做。

但是它如何知道在编译源代码时可用的空闲内存。

编译时; 它使用一个非常简单的分配器为段中的代码和数据段创建空间,该分配器可以像“ offset = section.size; section.size += object.size ”一样简单。 稍后(链接时),当节的最终大小已知(并且每个节的开始地址已知)时,它会返回并将这些偏移量转换为地址,方法是将“节开头的地址”添加到每个“部分偏移”。

然后,节的详细信息(它们在内存中的地址、大小、属性、它们在可执行文件中的位置)存储在可执行文件的头中。

当可执行文件被加载时,操作系统使用可执行文件的头来确定文件的哪些部分被加载/映射到哪里。 通常操作系统(或编程语言的库)也会跟踪虚拟地址空间的哪些区域用于什么; 这样,如果/当程序分配更多的虚拟地址空间(使用 Windows 上的VirtualAlloc()或 Unix 克隆上的mmap()等函数)时,它可以分配尚未使用的虚拟空间(按节等)。

最后; 当程序开始运行时(可能在链接器为您提供的“默认启动代码”中)它可能会为程序的堆分配虚拟空间,然后使用该虚拟空间来设置动态内存管理(例如malloc()new或任何对语言及其库有意义的东西)。

注 1:编译和链接并不是那么简单(例如,用于在节中创建空间的分配器也必须担心对齐之类的事情)。

注 2:可执行加载器并没有那么简单(例如,它们还加载/映射共享库并进行动态链接)。

注 3:大多数现代系统使用“地址空间布局随机化”(试图提高安全性),因此最终地址(由代码、数据使用)可以由可执行加载程序(作为部分的偏移量)确定动态链接)而不完全由链接器本身决定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM