第一章–windows内部概览

166 阅读3分钟

第一章–windows内部概览

Pavel Yosifovich
第一章–windows内部概览
1.1进程
进程代表了程序的一个运行实例,是起容纳和管理作用的对象.进程不运行,他只管理.从技术上来说,线程才是执行代码的东西.从高层次的角度来看,进程拥有如下内容:
可执行程序.它包含了用来在进程中执行的原始的代码和数据.
私有虚拟内存地址.进程中的代码不管出于何种目的要分配内存时,都从这里分配.
主令牌(primary token).他是一个保存进程默认安全上下文的对象,在进程内执行代码的线程会用到它,除非某个线程通过身份扮演(impersonation)而使用了另一个不同的令牌.
私有的句柄表(handle).他保存了执行体对象(executive object)如 事件(event),信号量(semaphore)和文件的句柄.

一个或者多个执行线程.普通的用户模式进程在创建时具有一个线程,该线程执行经典的main/WinMain函数.没有任何线程的用户模式进程多半是没用的,并且正常情况下会被内核销毁.
进程用一个唯一的进程标识符来表示,只要内核仍然有这个进程对象存在,这个标识符就是唯一的.一旦内核中的进程对象呗销毁了,这个标识符就有可能被新的进程所使用.可执行文件本身并非一个进程的唯一标识符.例如:可能同时有5个notepad.exe的实例正在运行,每个进程都有自己的地址空间,自己的线程,自己的句柄表,自己的唯一进程标识符,等等.所有这5个进程使用同一个映像文件(notepad.exe)作为初始代码和数据.

1.2虚拟内存
每个进程都有自己的虚拟,私有,线性的地址空间.这个地址空间起始是空的(或者接近于空,因为可执行映像和NTDLL.dll首先被映射到内存中,继而是更多地子系统DLL).一旦(第一个)线程开始执行,很可能就会开始分配内存,同时会有更多的子系统DLL装入地址空间.这个地址空间是私有的,意味着别的进程无法直接访问.地址空间从0开始(虽然从技术上来说,第一个64KB的地址是不能以任何形式分配或者使用的),一直增长到最大值,最大值依赖于进程的”位数”(32/64)和操作系统的位数.规则如下:
win32系统中32位进程,进程地址空间的默认大小是2GB.
win32系统中32位进程,且使用了增大用户地址空间的设置(PE头文件里的LARGEADDRESSAWARE标志),最大地址空间可以达到3GB(取决于实际的设置).为了获得这部分扩展了的地址空间,用于创建进程的可执行文件必须在其文件头中标记了LARGEADDRESSAWARE链接器标志.如果没有,那地址空间还是限制为2GB.
64位进程,地址空间大小为8TB(win8或更早版本)/128TB(win8.1和以后版本).
win64上32位进程,如果影响文件链接时使用了LARGEADDRESSAWARE标志,那么地址空间大小为4GB,否则仍然是2GB.
1.2.1页状态
1.2.2系统内存
1.3线程