Windows 内核原理与实现 - 读书笔记

来源:互联网 发布:qt软件打包 编辑:程序博客网 时间:2024/05/22 18:20

 

windows内核为用户模式代码提供了一组系统服务,供应用程序使用内核中的功能。应用程序通常不直接调用这些系统服务,而是通过一组系统DLL,最终通过ntdll.dll切换到内核模式下的执行体API函数中,以调用内核中的系统服务。

 

windows kernel 关键组件

内核      =  执行体   +  微内核  +  HAL

  1. 内核          ntdll.dll, ntoskrnl.exe   +    hal.dll  + drivers

 

HAL-

在windows中,HAL是一个独立的dll。windows安装包随带了多个主流机器的HAL,但安装时只有一个被copy和改名为hal.dll. hal.dll 提供了其它内核模块和设备应用程序的调用例程,使得一个设备驱动程序可以支持同样的设备在不同的硬件平台上运行。

HAL 不仅涵盖的处理器的体系结构,也涉及了中断控制器、单处理器和多处理器等硬件条件。

内核(或微内核)

它是内核模块ntoskrnl.exe中的下层部分,最接近于HAL层,负责线程调度和中断,异常处理,同步多处理器之间的行为。这一层的核心任务是让系统中的所有处理器尽可能地忙和高效。内核层可以在多个处理器上并发执行,代码以C语言为主和部分汇编。按照面向对象的思想设计而成,负责管理两种类型的对象:分发器对象(Dispatcher Object) 和控制对象。

线程调度--抢占式线程调度,按优先级顺序为每个线程分配处理器。

分发器对象--实现了各种同步功能,这些对象的状态会影响线程的调度。windows内核实现的分发器对象包括事件(Event)、突变体(Mutant)、信号量(semaphore)、进程、线程、队列、门和定时器。

控制对象--用于控制内核的操作,但不影响线程的调度,包括异步过程调用(APC),延迟过程调用(DPC)和中断对象等。

APC--

当一个线程产生时,系统自动为这个线程配置一个apc队列
当系统进行异步调用时,如readfileex,驱动程序完成一个异步I/O后,系统会给apc队列加入一个完成通知数据块,这个数据块包含一个callback函数的地址和一个overlapped结构的地址。这个callback函数不会被立即调用,当线程调用sleepex等函数时,线程进入一个alert状态,这个时候callback函数就被调用

------from csdn

 

执行体

执行体是内核模块ntoskrnl.exe的上层部分,它包含5种类型的函数。

1。 被导出的、可在用户模式下调用的函数,这些函数的调用接口位于ntdll.dll 模块中,应用程序通过windows API来调用这些接口。

2。 被导出、可在用户模式下调用、但不能通过任何windows API调用的函数。

3。 只能在内核模式下调用的函数,在windows DDK中有关于这些函数的文档,主要用于被设备驱动程序调用。

4。 供执行体组件之间调用,未文档化。

5。 组件的内部函数。

执行体的内部组件

  • 1。进程和线程管理器---负责线程进程的创建和终止。内核层提供对进程和线程的调度等一些底层操作。
  • 2。内存管理器---系统地址空间的内存管理,为每个线程提供私有的地址空间,支持进程间的内存共享。
  • 3。安全引用监视器(SRM, Security Reference Monitor)
  • 4。I/O管理器---实现与设备无关的输入输入功能。负责将IO请求分发给正确的设备驱动程序以便进一步处理。
  • 5。缓存管理器--
  • 6。即插即用管理器---
  • 7。电源管理器

执行体还包含4组主要的支持函数,供以上执行体组件调用。they are:

  1. 对象管理器---创建、管理和删除windows执行体对象,以及表示操作系统资源的抽象数据类型,比如进程、线程和各种同步对象。
  2. LPC ---负责同一机器上和服务器进程之间传递消息。
  3. 一组运行时库函数---
  4. 执行体支持例程---例如系统内存分配

 

设备驱动程序

在windows内核中,除了ntoskrnl.exe和hal.exe之外,其他的模块几乎都以驱动程序的形式存在。

我们可以认为驱动程序是系统内核的扩展机制,通过驱动支持新的物理设备和扩展功能。设备驱动程序是可以动态加载到系统中的模块,其文件名为.sys,格式是标准的PE格式。驱动程序运行在内核模式下,通过操作HAL中的函数来与硬件打交道

(PE文件格式)

COFF是UNIX引入的用于描述二进制模板文件的规范。

  1. MS在COFF基础上将其扩展成PE格式。
  2. AT&T在COFF基础上扩展了ELF格式。
  3. IBM在COFF基础上扩展了XCOFF格式。

windows平台上,exe,dll,obj,sys都适用PE文件格式。32位的PE文件格式叫PE32,64位系统适用的PE文件格式叫PE32+。

设备驱动程序包含3种类型:

1. 即插即用设备驱动程序( 也称为WDM驱动程序 )

2. 内核扩展驱动程序

3. 文件系统驱动程序

网络

windows socket 是windows 最重要的网络API。它包括 ws2_32.dll (用户模式部分) + afd.sys(内核模式部分)

在内核模式部分,网络API驱动程序通过传输驱动程序接口(TDI, Transport Driver Interface)与协议驱动程序进行通信。

一个TDI可以被多个TDI客户(网络API)使用,如tcpip.sys 既可以被afd.sys使用也可以被netbt.sys 使用