Windows内核-杂记

进程
组成部分

(1)一个核心态的对象,操作系统用来保存进程的信息
(2)地址空间,包含可执行文件和所有动态链接库的代码和数据,以及动态分配的内存

进程终止的方式

(1)主线程的入口函数返回(如main函数)
(2)进程主动退出,一个线程调用ExitProcess
(3)进程被动终止,另一个进程调用TerminateProcess(任务管理器-结束任务 ),进程中所有线程被终止,不通知dll。
(4)进程中所有线程都终止。

线程

创建于一个进程的上下文,在进程的地址处空间中运行。每一个进程至少有一个线程。

组成部分

(1)一个核心态的对象,操作系统用来保存线程的信息
(2)线程堆栈,保存线程的运行状态信息

线程的终止

(1)线程函数返回
(2)线程调用ExitThread
(3)其他线程调用TerminateThread
(4)该线程所在进程终止

线程调度
线程优先级

windows使用32个优先级别(0-31)数值越大优先级越高,一个线程的优先级由priority class 与relative thread priority共同决定。

线程同步
内存管理

在这里插入图片描述

进程虚拟地址空间

(1)32位系统进程虚拟空间为4G(2^32)
(2)缺省情况下,内核态用户态各2G
(3)每个进程共享内核态地址空间,用户态相对独立
在这里插入图片描述在这里插入图片描述

虚拟地址空间的状态

(1)free:这段虚拟地址自由,可被分配
(2)reserve:地址被预留,但是没有映射到物理内存,无法访问
(3)commit:被映射到物理内存

进程使用的内存

(1)Private Bytes:进程的虚拟地址空间中已分配的内存,不包括和其他进程共享的内存
(2)Virtual Bytes:进程所使用的虚拟地址空间的大小,包括和其他进程共享的内存
(3)Working Set:进程所使用的物理内存大小

内存映射文件

进程保留一段虚拟地址空间,把一个文件的一部分映射到这段地址空间。操作系统使用内存映射文件类装载.exe和.dll文件,如果多个进程使用同一个dll,物理内存中只有一份拷贝。
应用:
(1)使用内存映射文件来处理大文件,每次只把一部分文件内容映射到进程的地址空间
(2)多个进程之间共享内存

Paging File

paging file 用来保存进程正在使用的修改过的内存,若当系统物理内存不足或者这部分内存长时间未被使用时,这部分内容转移到paging file,当中部分内容再次被访问,从paging file 转移到物理内存、

动态链接库DLL
DLL入口函数

DLL可以指定一个入口函数(DllMain),系统在如下的特定情况下会调用DLL的入口函数:
(1)进程装载DLL(DLL_PROCESS_ATTACH)
(2)进程卸载DLL(DLL_PROCESS_DETACH)
(3)DLL被装载之后创建一个新线程(DLL_THREAD_ATTACH)
(4)DLL被装载之后一个线程终止(DLL_THREAD_DETACH)

DLL装载方式
load-time dynamic linking

编译器把可执行文件所需的dll名字放在可执行文件头的import部分中,可执行文件开始运行时操作系统检查可执行文件的import部分,然后定位和装载所需dll

run-time dynamic linking

应用程序运行之后调用LoadLibrary或LoadLibraryEx装载DLL,操作系统定位并装载DLL。使用GetProcAddress获得DLL的输出函数地址,并使用这些函数。

Known DLLs

Known DLLs是保证用LoadLibrary装载系统DLL时只从特定的系统目录装载,防止装载错误的系统DLL。保存在注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls中,操作系统在装载一个DLL时会检查KnownDLLs注册表下是否有一样的注册表建名,若有,则装载%SystemRoot%system32目录下对应注册表键值的DLL

DLL Hook

Windows提供了一些API,让应用程序注册hook过程,用于监视一些特定的事件,应用程序可以注册系统全局范围的hook或者针对应用程序本身的hook,若应用程序注册了系统全局范围的hook,则hook DLL会被装载到其他进程里,一旦遇到上述时间,Hook DLL会执行相应的额hook过程。

异常处理
常见异常

(1)访问非法内存地址
(2)线程堆栈溢出
(3)遇到断点
(4)执行非法指令

异常处理流程

在这里插入图片描述

下面详细说明异常发生时操作系统是如何处理的:
(1)异常发生,由Exception dispatcher分发异常,如果程序是被调试运行的(比如我们在VS编译器中调试运行程序),当异常发生时,系统首先将异常信息通过Debugger port交给调试程序(记作first chance exception),如果调试程序处理了那么程序继续运行.
(2)否则系统便在发生异常的线程栈中查找可能的异常处理代码。若找到则处理异常,并继续运行程序。若线程没有异常处理代码,则Windows unhandled exception filter会被调用,读取HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AeDebug\下的注册表键值Auto和Debugger。
(3)若Auto=1,自动运行Debugger指定的调试程序(second chance exception),缺省的Debugger是drwtsn32,生成dump文件。若Auto=0,系统会检查HKLM\softw\Microsoft\PCHealth\Error Reporting决定是否显示报告问题对话框。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值