![Windows内核编程](https://wfqqreader-1252317822.image.myqcloud.com/cover/592/39130592/b_39130592.jpg)
上QQ阅读APP看书,第一时间看更新
1.1 进程
进程代表了程序的一个运行实例,是起容纳和管理作用的对象。有个相当常用的术语叫作“进程运行”,它其实是不准确的。进程不运行—它只管理。从技术上来说,线程才是执行代码的东西。从高层次的角度来看,进程拥有如下内容:
- 可执行程序。它包含了用来在进程中执行的原始的代码和数据。
- 私有虚拟地址空间。进程中的代码不管出于何种目的要分配内存时,都从这里分配。
- 主令牌(primary token)。它是一个保存进程默认安全上下文的对象,在进程内执行代码的线程会用到它,除非某个线程通过身份扮演(impersonation)而使用了另一个不同的令牌。
- 私有的句柄(handle)表。它是保存了执行体对象(executive object)如事件(event)、信号量(semaphore)和文件的句柄。
- 一个或多个执行线程。普通的用户模式进程在创建时具有一个线程,该线程执行经典的main/WinMain函数。没有任何线程的用户模式进程多半是没用的,并且正常情况下会被内核销毁。
图1-1中描绘了进程中的元素。
![000](https://epubservercos.yuewen.com/B7706C/20516006501584606/epubprivate/OEBPS/Images/010-1.jpg?sign=1738884626-9prqG0zXvxPqi5ESLMicS8jC53CSHXrD-0-39682ecbfc90271c5707934c56242d2b)
图1-1 进程中的重要成分
进程用一个唯一的进程标识符来标识,只要内核仍然有这个进程对象存在,这个标识符就是唯一的。一旦内核中的进程对象被销毁了,这个标识符就有可能被新的进程所使用。大家需要意识到有一点很重要,可执行文件本身并非一个进程的唯一标识符。例如,可能同时有五个notepad.exe
的实例正在运行。每个进程都有自己的地址空间、自己的线程、自己的句柄表、自己的唯一进程标识符,等等。所有这五个进程使用同一个映像文件(notepad.exe
)作为初始代码和数据。图1-2显示了任务管理器中详情标签页的一个屏幕截图,其中显示了五个notepad.exe
的实例,每个都有自己的属性。
![000](https://epubservercos.yuewen.com/B7706C/20516006501584606/epubprivate/OEBPS/Images/010-2.jpg?sign=1738884626-93ZedLptRZniRw2v1nK4iQRUW6x2rB7P-0-a842b726cc32661d3a40b0d399b60429)
图1-2 记事本的五个实例