《windows内核情景分析》读书笔记(1)---概述
1、采用现代操作系统的硬件必须具备哪些条件?
①CPU必须有内核态和用户态,防止操作系统映像被用户的不良行为破坏。
②用户程序必须分隔在不同的地址空间中,不能因为一个用户的误操作导致所有进程崩溃。
③用户进程在物理内存中的位置不应固定。
从80286开始,cpu开始支持保护模式,使pc具备了采用现代操作系统的条件。
2、windows内核初探
系统结构图如下:
windows内核可分为两部分
①核心层:包括硬件抽象层(HAL)和设备驱动底层
②管理层:包括对象管理、内存管理、进程管理、安全管理、I/O管理等等。
windows用户空间可分为:
①系统DLL:代表是ntdll.dll,kernel32.dll、user32.dll。提供windowsAPI。
②用户自定义DLL:用户应用软件中需要用到的DLL。
③应用程序
windows中,进程4GB虚拟空间分为两部分,从地址0x80000000开始向上是系统空间,以下是用户空间。
CPU必须进入"系统态"才能执行系统空间中的代码及访问其中数据。而用户空间则无论"系统态"和"用户态"均能访问。
CPU进入"系统态"的方法:
①系统调用(trap)
②中断
③异常
3、IRQ级别:Interupt Request Level 中断优先级、页面倒换
优先级的定义如下:
#define PASSIVE_LEVEL 0 #define LOW_LEVEL 0 #define APC_LEVEL 1 #define DISPATCH_LEVEL 2 #define PROFILE_LEVEL 27 #define CLOCK1_LEVEL 28 #define CLOCK2_LEVEL 28 #define IPI_LEVEL 29 #define POWER_LEVEL 30 #define HIGH_LEVEL 31
如果CPU执行一个线程已经处于某个级别,其操作就不能收同级或更低级别的操作所干扰。
(1)其中PASSIVE_LEVEL的级别最低,但是却对应着系统结构中的较高的层次。IRQL是CPU可以自由设置的,每当CPU进入更底层、更核心的层次时就提高IRQL,反之则降低IRQL;但是表明IRQL的变量在内核中,运行于用户空间时是无法改变IRQL的。
(2)DISPATCH_LEVEL相当于CPU运行于Windows内核中的核心层,即“内核”层;线程的切换只能发生于CPU将从DISPATCH_LEVEL级别下降的时候。
(3)IRQL级别3以上用于硬件中断。
CPU的IRQL级别不高于APC_LEVEL的层次,其代码都是允许倒换的,但是从DISPATCH_LEVEL开始就不允许了。管理层代码中的大部分函数都有如下的代码,来说明该段代码可以被倒换出去:
#ifdef DBG #define PAGED_CODE(){ if(KeGetCurrentIrql() > APC_LEVEL){ KdPrint(("NTDDK:Pageable code called at IRQL > APC_LEVEL(%d)\n", KeGetCurrentIrql())); ASSERT(FALSE); } } #else #define PAGED_CODE() #endif
在Debug模式下,如果发现该段代码在高于APC_LEVEL的级别下运行,就会发出警告。
#pragma alloc_text(PAGE, NtQueryObject)时一个函数所在的页面可倒换。
4、windows内核函数命名
C语言程序:
ex:管理层
ke:核心层
hal:硬件抽象层
ob:对象管理
Mm:内存管理
Ps:进程管理
Se:安全管理
Io:I/O管理
Fs:文件系统
Cc:文件缓存管理
Cm:系统配置管理
Pp:"即插即用管理"
Rtl:运行时刻库
汇编语言程序:
在函数名前加"_",并加上标示参数个数的后缀。例如RtlZeroMemory()出现在汇编程序中就是_RtlZeroMemory@8,其中,@8表示两个参数,8个字节。
快速调用函数跟上面的格式又不一样,如@KfLowerIrql@4表示这是一个快速调用函数,后缀@4表示带有4个字节的参数,即一个参数。