c - 堆栈、数据和指令段在哪里实现?

标签 c assembly memory x86-64 memory-segmentation

所以内存分段在x86-64中被放弃了,但是当我们使用汇编时,我们可以在代码中指定.code和.data段/段,并且还有堆栈指针寄存器。

还有堆栈段、数据段和代码段寄存器。

代码/数据/堆栈的划分是如何以及在哪里发生的,是由 CPU 还是操作系统实现的?

因为当我们调试并看到一些C程序的反汇编 View 时,地址空间是线性的,没有划分。

当他们说数据段具有全局、静态和堆的“部分”时,这是操作系统抽象?

最佳答案

您需要使用不同的模型来考虑内存使用情况。考虑使用具有如下属性的程序部分的内存:

  • 代码:可执行、可读、不可写
  • 静态数据:不可执行、可读、不可写
  • 可修改数据:不可执行、可读、可写 (您还可以添加零需求区域)

这些属性可以在页面级别设置。在系统中,您可以将页面交错

代码-数据-代码-数据-代码-数据

通常,链接器会将相似的部分放在一起,但它可以通过分页以几乎任何方式布局内存。通常的机制是,如果您为节命名,链接器将收集具有相同节的内容并将其分组在一起。

您不受 Ye Olde 8086 分段系统的限制。

这些部分由操作系统和链接器管理。

关于c - 堆栈、数据和指令段在哪里实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28005663/

相关文章:

c++ - typedef float _Float32的声明说明符中的两个或多个数据类型;

c - 包括其他目录中的 .h 文件

assembly - 通过堆栈从过程返回一个值

assembly - 我试着用汇编写

c++ - 用给定大小初始化的 std::vector 的值是什么?

c - 不明白C中的指针

c - 动态内存访问仅在函数内部有效

c - 哪种顺序在汇编语言中更有效?

memory - CoreOS单容器高内存使用率

memory - 我的 CUDA 纹理内存有多大?