《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个字节的参数,即一个参数。

posted @ 2011-09-13 15:21  飞翔荷兰人  阅读(2413)  评论(0编辑  收藏  举报

I Love Lina~