0

关于windows内存分割的几个问题。

  1. Windows 中的每个进程都有自己的虚拟内存。这是否意味着每个进程都有自己的任务(我的意思是自己的任务描述符或任务门)?

  2. 我用 ollydbg 打开了一个简单的 exe,我看到每个对 dll 函数的 CALL 指令都将我带到了跳转表。跳转表有到 DLL 的跳转指令,如下所示:

    JMP DWORD PTR DS:[402058]

    我的问题是为什么它使用数据段而不是 CS 选择器作为基地址?如果我打开内存映射并找到存储在 402058 的内容,我会发现它包含资源。如果我正确理解了存储在 DS 中的 DLL 函数的地址?

  3. 我注意到内存映射是由所有者组织的。它不应该用段来组织,比如所有代码都在 DS 等的 CS 数据中吗?

    谢谢你

4

1 回答 1

0

1. AProcess有自己的虚拟地址空间。我不明白您所说的“任务描述符或任务门”是什么,但 Windows 操作系统为每个进程保存一个描述符,称为Process Control Block,其中包含有关进程的信息(例如标识、访问令牌、执行状态,虚拟内存映射等)。

ATask是一个逻辑单元,可用于管理单个进程或多个进程。

工作 -> 任务

任务 -> 进程

进程 -> 线程

2.在你提到的情况下,这对于编译器来说很常见,程序在加载函数地址后使用.DATA部分来存储跳转表。

首先发生这种情况的原因是因为编译器在编译时无法知道 DLL 基地址,因此必须在加载时固定地址以指向函数。这称为重定位。

为了将跳转表与代码分开维护,编译器将其存储在 .DATA 部分中。这样,我们也可以给它写权限(通常 .DATA 段有写权限)并在不牺牲稳定性和安全性的情况下根据需要对其进行修改。

3. 在进程的虚拟地址空间中加载的每个模块都包含它自己的部分 - 这就是为什么您会看到每个模块的不同的 .text、.data、.reloc 等集合。“所有者”列是模块名称。

PS 请在每个帖子中问一个问题 - 这样在您得到回答后其他用户可以轻松访问它,并且每个问题都可能得到更准确的答案。

于 2013-05-18T14:56:29.700 回答