gpt4 book ai didi

x86 - x86数据段在真实操作系统和进程中是如何使用的?

转载 作者:行者123 更新时间:2023-12-03 23:38:33 25 4
gpt4 key购买 nike

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

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

最佳答案

来自 INTEL 80386 程序员引用手册 1986:

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 ║
╚════════════╩═══════════╩══════════════╝

在 Windows 中,大多数时候在大多数进程中 DS=ES=SS,并且 CS 和 DS 的值在所有进程之间共享。进程可能会更改它们的段寄存器,但很少需要,因此大多数时候您会看到相同的一组 CS 和 DS/ES/SS 值。内核使用自己的 CS 和 DS。

关于x86 - x86数据段在真实操作系统和进程中是如何使用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12760109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com