Windows 内核分为三层,与硬件直接打交道的这一层称为硬件抽象层(Hardware Abstraction Layer,简称HAL),这一层的用意是把所有与硬件相关联的代码逻辑隔离到一个专门的模块中,从而使上面的层次尽可能做到独立于硬件平台。HAL之上是内核层,有时候也称为微内核(micro-kernel),这一层包含了基本的操作系统原语和功能,如线程和进程、线程调度、中断和异常的处理、同步对象和各种同步机制。在内核层之上则是执行体(executive)层,这一层的目的是提供一些可供上层应用程序或内核驱动程序直接调用的功能和语义。Windows 内核的执行体包含一个对象管理器,用于一致地管理执行体中的对象。执行体层和内核层位于同一个二进制模块中,即内核基本模块,其名称为ntoskrnl.exe。
内核层和执行体层的分工是,内核层实现操作系统的基本机制,而所有的策略决定则留给执行体。执行体中的对象绝大多数封装了一个或者多个内核对象,并且通过某种方式(比如对象句柄)暴露给应用程序。这种设计体现了机制与策略分离的思想。下图显示了Windows 内核的详细组成结构。
HAL(硬件抽象层)
HAL的目的是将硬件的差别隐藏起来,从而为操作系统的上层提供一个抽象的,一致的硬件资源模型,这样就可以让windows更容易地迁移到不同的平台上。目前来看,windows做的很不错。
在window里,HAL是一个独立的动态链接库。在安装windows的时候,系统判断对应的硬件类型,将需要的HAL安装进入即可。
实际我们在写代码的时候,也要注意这些抽象,有了类似的抽象后,软件才有更好的兼容性,可扩展性。
内核(微内核)
这个其实就是内核的核心部分了,它负责线程调度和终端,异常的处理,在多处理器的情况下,还负责多处理器之间的协调,从而优化系统的性能。这层的核心任务是:让系统中所有的处理器尽可能地忙和高效。
windows的内核按照面向对象的思想来设计,它管理两种类型的对象:分发器对象(sipatcher object)和控制对象。分发器对象实现了各种同步功能,这些对象的状态会影响线程的调度。windows内核的分发器对象有:事件,突变体,信号量,进程,线程,队列和定时器等。控制对象用于控制内核的操作。
执行体
执行体是内核模块的上层部分,在大的方面看,执行体包含以下组件:
- 进程和线程管理器,负责创建进程和线程,以及终止进程和线程。对于进程和线程的底层支持是在内核层中提供的,执行体在内核层的基础上又添加了一些语义和功能。
- 内存管理器。此组件提供了虚拟内存功能,既负责系统地址空间的内存管理,又为每个进程提供了一个私有的地址空间,并且也支持进程间的内存共享。
- 安全引用监视器,该组件强制在本地计算机上实施安全策略,守护操作系统的资源,执行对象的保护和审计。
- I/O管理器。实现与设备无关的输入和输出功能,负责将I/O请求分发给争取的设备驱动程序以便进一步处理。
- 缓存管理器。为文件系统提供统一的数据缓存执行,允许文件系统驱动程序将磁盘上的数据映射到内存中,并通过内存管理器来协调物理内存的分配。
- 配置管理器。负责系统注册表的实现和管理。
- 即插即用管理器。负责列举设备,并为每个列举到的设备确定哪些驱动程序是必须的,然后加载并初始化这些驱动程序。当它检测到系统中的设备变化时,负责发送合适的事件通知。
- 电源管理器。负责协调电源事件,向设备驱动程序发送电源I/O通知。
参考资料:
- https://blog.csdn.net/KingCat666/article/details/44205085
- https://zhuanlan.zhihu.com/p/20796914