Windows系统结构
在Windows操作系统中,应用层程序可以通过3种方式进入内核 1.系统调用 2.中断 3.异常
系统调用是应用层程序所发起的函数调用 如调用ReadProcessMemory这个WinAPI的时候,便会借助kernel32.dll 和ntdll.dll 进入内核完成函数功能。
中断是程序运行中被中断所打断 转去执行内核中的中断例程 。
异常时程序运行中出现程序异常 如缺页异常 除零异常等 需要转去内核执行相关的异常处理程。
Windows中的系统调度是抢占式的 但这并不意味 高优先级的线程处于就绪状态后可以立即剥夺当前正在运行的线程,只有当当前线程不处于核心层中,才可以进行线程切换,如果线程处于核心层,则需等待线程从核心层中退出。
在Windows中,内核层的部分内存是允许被换出至文件中的,其原因在于Windows将图像操作/视窗服务的实现放入到内核中即win32k.sys,导致内核过于庞大。
Windows为Cpu设计了一套Irql的机制,保证处于高级别Irql运行的程序不会被低级别的Irql所打断需要注意的是DISPATCH_LEVEL是软件能处于的最高级别,比DISPATCH_LEVEL高的均为硬件的Irql。
根据Irql需要知道一件事,处于DISPATCH_LEVEL运行的程序不允许访问允许被换入到文件的内存(分页内存),一旦访问可能导致缺页异常无法被触发致使程序奔溃。所以在内核代码中经常能看到这样一个宏PAGED_CODE(),该宏常常位于管理层函数的首部用来防止处于DISPATCH_LEVEL级别的代码访问。
以下为内核函数的一些基本命名特点,但是Windows并没有完全严格按照这个规范进行命名
如果以上理解存在偏差,请务必私信我或在底下留言指出,万分感谢。