Operating system x86数据段如何在实际操作系统和进程中使用?

Operating system x86数据段如何在实际操作系统和进程中使用?,operating-system,x86,x86-64,segment,Operating System,X86,X86 64,Segment,我一直在实模式下编程x86 asm程序(引导加载程序),我知道如何使用段、寄存器和类似的东西 我从OllyDbg和类似的调试器中看到DS寄存器、SS等。。显然是用了。。但是,正常的“类似Windows”的进程如何使用它们呢?我知道部分使用了分段(只是为了将ring0和ring3分开),并且它们的条目都在GDT中,我知道这涉及到分页,这会将地址与PDE和PTE完全弄乱,但我无法将所有内容“链接”在一起,也无法理解数据堆栈额外分段的含义。。每个进程是否有不同的DS/SS/ES?通常,在x86保护模式

我一直在实模式下编程x86 asm程序(引导加载程序),我知道如何使用段、寄存器和类似的东西


我从OllyDbg和类似的调试器中看到DS寄存器、SS等。。显然是用了。。但是,正常的“类似Windows”的进程如何使用它们呢?我知道部分使用了分段(只是为了将ring0和ring3分开),并且它们的条目都在GDT中,我知道这涉及到分页,这会将地址与PDE和PTE完全弄乱,但我无法将所有内容“链接”在一起,也无法理解数据堆栈额外分段的含义。。每个进程是否有不同的DS/SS/ES?

通常,在x86保护模式和x86-64长模式下,实际上不使用分段(平面内存模式)。有四个主要的段描述符,每个描述符都允许访问整个地址空间:ring0代码、ring0数据、ring3代码、ring3数据。内存保护是通过分页实现的。因此,一般来说,所有进程都具有相同的CS、DS、SS、ES值

请注意,例如,某些操作系统在寻址本地数据时使用FS和GS段

还值得一提的是,在x86保护模式下,这种行为是可选的,内核可以自由使用多个段进行内存保护,而在x86-64长模式下,通常会禁用分段,操作系统被迫使用平面内存模式(尽管它仍然可以使用FS和GS来处理本地数据和操作系统结构)


您可能还想查看有关x86和x86-64体系结构的宝贵信息来源:(第3.2节应澄清您对分段的所有疑问)

摘自《1986年英特尔80386程序员参考手册》:

Figure 5-1.  Address Translation Overview

             15           0      31                           0
    LOGICAL ╔═══════════════╗   ╔══════════════════════════════╗
    ADDRESS ║    SELECTOR   ║   ║            OFFSET            ║
            ╚═══════════╤═══╝   ╚═══╤══════════════════════════╝
                        v           v
                     ╔══════════════════════════════╗
                     ║     SEGMENT TRANSLATION      ║
                     ╚══════════════╤═══════════════╝
                                 ╔══╧═╗       PAGING ENABLED
                                 ║PG ?╟────────────────────┐
                                 ╚══╤═╝                    │
                   31        PAGING v DISABLED       0     │
          LINEAR  ╔═══════════╦═══════════╦═══════════╗    │
          ADDRESS ║    DIR    ║   PAGE    ║  OFFSET   ║    │
                  ╚═══════════╩═════╤═════╩═══════════╝    │
                                    v                      │
                     ╔══════════════════════════════╗      │
                     ║       PAGE TRANSLATION       ║      │
                     ╚══════════════╤═══════════════╝      │
                                    │<─────────────────────┘
                      31            v              0
            PHYSICAL ╔══════════════════════════════╗
            ADDRESS  ║                              ║
                     ╚══════════════════════════════╝


Figure 5-2.  Segment Translation

           15              0    31                                   0
  LOGICAL ╔════════════════╗   ╔═════════════════════════════════════╗
  ADDRESS ║    SELECTOR    ║   ║                OFFSET               ║
          ╚═══╤═════════╤══╝   ╚═══════════════════╤═════════════════╝
       ┌──────┘         v                          │
       │ DESCRIPTOR TABLE                          │
       │  ╔════════════╗                           │
       │  ║            ║                           │
       │  ║            ║                           │
       │  ║            ║                           │
       │  ║            ║                           │
       │  ╠════════════╣                           │
       │  ║  SEGMENT   ║ BASE          ╔═══╗       │
       └─>║ DESCRIPTOR ╟──────────────>║ + ║<──────┘
          ╠════════════╣ ADDRESS       ╚═╤═╝
          ║            ║                 │
          ╚════════════╝                 │
                                         v
              LINEAR  ╔════════════╦═══════════╦══════════════╗
              ADDRESS ║    DIR     ║   PAGE    ║    OFFSET    ║
                      ╚════════════╩═══════════╩══════════════╝
图5-1.地址翻译概述
15           0      31                           0
合乎逻辑╔═══════════════╗   ╔══════════════════════════════╗
地址║    选择器║   ║            抵消║
╚═══════════╤═══╝   ╚═══╤══════════════════════════╝
v v
╔══════════════════════════════╗
║     段翻译║
╚══════════════╤═══════════════╝
╔══╧═╗       已启用分页
║PG?╟────────────────────┐
╚══╤═╝                    │
31分页v已禁用0│
线性的╔═══════════╦═══════════╦═══════════╗    │
地址║    迪尔║   页║  抵消║    │
╚═══════════╩═════╤═════╩═══════════╝    │
v│
╔══════════════════════════════╗      │
║       页面翻译║      │
╚══════════════╤═══════════════╝      │

│║ 描述符╟──────────────>║ + ║如果您
知道如何使用段、寄存器等
,那么您
不能完全“链接”在一起的原因是什么
,您如何
不理解数据堆栈额外段的全部内容
?您的问题是什么?是否
“每个进程都有不同的DS/SS/ES?”
?我有很多困惑,因为在实模式下,您只需使用段+偏移寻址模式来寻址内存,一旦在受保护的内存中,内存会随着分页而变化。userland中的每个进程都有不同的DS/SS/ES吗?它在kernelmode中变化还是相同?感谢您向我澄清这一点!感谢您的帮助和帮助伟大的艺术!