堆栈、数据和指令段在哪里实现?
Posted
技术标签:
【中文标题】堆栈、数据和指令段在哪里实现?【英文标题】:Where are the stack, data and instruction segments implemented? 【发布时间】:2015-03-16 08:08:09 【问题描述】:所以在 x86-64 中放弃了内存分段,但是当我们使用汇编时,我们可以在代码中指定 .code 和 .data 节/段,并且还有堆栈指针寄存器。
还有堆栈段、数据段和代码段寄存器。
代码/数据/堆栈的划分是如何以及在哪里发生的,它是由 CPU 还是操作系统实现的?
因为当我们调试和看到一些C程序的反汇编视图时,地址空间是线性的,没有除法。
当他们说数据段具有全局、静态和堆的“部分”时,这是操作系统抽象吗?
【问题讨论】:
部分使用分页实现。重要的是不同部分的可写和可执行标志可能不同。操作系统也可以专门处理堆栈,以便它可以按需增长。加载器也会对 ELF 二进制文件中的部分进行特殊处理,例如包含重定位信息的部分。 在编译/链接时,您可以向链接器传递一个通常带有 .cmd 扩展名的文件,该文件将定义 .o 文件中每种段的所需位置。 在 .cmd 文件中,您将定义 .reloc、.const、.text、.data、.data2、.idata 和其他几个段名称的位置/大小。您还可以指定.stack、.heap 等的特定地址/大小我经常在存在内存映射外设时使用它,方法是为外设提供唯一的段名称并在 .cmd 文件中设置该外设段地址 分段并没有完全放弃,因为 FS 或 GS(不确定哪个)仍然用于内核接口和每个线程的东西。 段名称(.text、.data、...)与使用段寄存器寻址的 CPU 段不同。在典型的内存布局中,所有段寄存器(cs、ds、es 和 ss)(fs 和 gs 除外)寻址相同的内存区域。 【参考方案1】:您需要使用不同的模型来考虑内存使用情况。考虑使用具有以下属性的程序部分的内存:
代码:可执行、可读、不可写 静态数据:不可执行、可读、不可写 可修改数据:不可执行、可读、可写 (您也可以添加零需求区域)这些属性可以在页面级别设置。在一个系统中,你可以让页面交错
代码-数据-代码-数据-代码-数据
通常,链接器会将相似的部分放在一起,但它几乎可以通过分页以任何方式布置内存。通常的机制是,如果你给节命名,链接器会将同一个节的东西收集起来并组合在一起。
Ye Olde 8086 的分割系统没有限制你。
这些部分随后由操作系统和链接器管理。
【讨论】:
以上是关于堆栈、数据和指令段在哪里实现?的主要内容,如果未能解决你的问题,请参考以下文章