Operating system x86数据段如何在实际操作系统和进程中使用?
我一直在实模式下编程x86 asm程序(引导加载程序),我知道如何使用段、寄存器和类似的东西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保护模式
我从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中变化还是相同?感谢您向我澄清这一点!感谢您的帮助和帮助伟大的艺术!