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

Where are the stack, data and instruction segments implemented?

所以内存分段在x86-64中被废弃了,但是我们在使用汇编的时候可以在我们的代码中指定.code和.datasections/segments,还有栈指针寄存器

以及堆栈段、数据段和代码段寄存器。

code/data/stack 的划分是如何以及在哪里发生的,它是由 CPU 还是 OS 实现的?

因为我们在调试的时候看到一些C程序的反汇编视图,地址space是线性的,没有分割。

当他们说数据段有 "parts" 全局变量、静态变量和堆时,这是 OS 抽象?

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

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

这些属性可以在页面级别设置。在一个系统中,你可以让页面交错

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

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

您不受叶奥尔德8086分割系统的限制

然后这些部分由操作系统和链接器控制。