关于Windows内存分段的一些问题。
Windows中的每个进程都有自己的虚拟内存。这是否意味着每个进程都有自己的任务 (我的意思是自己的任务描述符或任务门)?
我用ollydbg打开了一个简单的exe,我看到每个CALL对一个dll函数的引用都把我带到跳台。跳转表有像这样的跳转指令:
JMP DWORD PTR DS:[402058]
我的问题是为什么它使用数据段而不是基本地址的CS选择器? 如果我打开内存映射并找到存储在402058的内容,我发现它包含了resorces。 如果我正确理解存储在DS中的DLL函数的地址?
我注意到内存映射是由所有者组织的。不应该像DS等CS数据中的所有代码那样组织起来吗?
谢谢
答案 0 :(得分:0)
1。
Process
拥有自己的虚拟地址空间。
我不明白你所指的是什么"任务描述符或任务门",但Windows操作系统为每个进程保存一个描述符,称为Process Control Block
,其中包含有关的信息。进程(如标识,访问令牌,执行状态,虚拟内存映射等)。
Task
是一个逻辑单元,可用于管理单个进程或多个进程。
工作 - >任务
任务 - >过程
流程 - >线程
2。 在你提到的编译器常见的情况下,程序使用.DATA部分在加载函数地址后存储跳转表。
首先发生这种情况的原因是因为编译器在编译时无法知道DLL基址,因此必须在加载时修复该地址以指向该函数。这称为重定位。
为了从代码中单独维护跳转表,编译器将其存储在.DATA部分中。这样,我们也可以赋予它写权限(通常.DATA段具有写权限)并根据需要进行修改,而不会牺牲稳定性和安全性。
3。 在过程中加载的每个模块'虚拟地址空间包含它自己的部分 - 这就是为什么你为每个模块看到一组不同的.text,.data,.reloc等。 "所有者" column是模块名称。
P.S。请在每个帖子中提出一个问题 - 这样,在您得到答案后,其他用户可以轻松访问该问题,并且每个问题都可能获得更准确的答案。