第3章 Windows运行机理-3.1 内核分析(1)

3.1.1 运行机理

  1. 概述

我们知道,DOS是一个开放的操作系统,应用程序和操作系统在同一个级别上,所以应用程序能控制整个机器的所有资源。这在DOS的早期还没什么问题,但是,后来随着应用程序的增加,系统就出现了一个很严重的问题---资源冲突。

当Windows 3.x推出时,市场上已有很多优秀的DOS软件。为了不失去巨大的市场,微软公司引入了全新的方法,让每个DOS程序和Windows程序都认为自己拥有所有的硬件资源。它们对系统硬件的操作是通过一些虚拟设备(VxD)来实现的,这就是所谓的虚拟机(VM)。之所以称为虚拟机,是因为它有完整的内存空间、I/O端口,以及中断向量。每个DOS都是一个VM,而所有的Win32的进程都运行在一个叫System VM中。其中,VxD中的"x"代表任意的设备。例如,VDD表示虚拟显示设备,VDMAD表示虚拟DMA设备。对于熟悉DOS的人而言,可以把VxD看做是32位的DOS。

Windows是怎么实现一个多任务的操作系统呢?原理很简单,就是CPU把运算时间轮流地分给每个虚拟机。这样,在Windows 3.x里,Windows程序之间用的是合作多任务,虚拟机之间用的是优先级多任务。而管理所有VxD和时间调试策略的程序就是虚拟机管理器(VMM)。虚拟机管理器是Windows的核心,它控制着计算机的主存、CPU的执行时间和外围设备功能。

VMM是一个32位的保护模式程序。它的主要任务是建立和维护一个支持虚拟机的框架,并对每个VM提供服务。例如,它要创建、运行和结束一个虚拟机。VMM是众多的系统VxD程序之一,放在系统目录下的VMM32.VxD文件中。VMM是第一个被加载到内存的VxD程序。它创建系统虚拟机并初始化其他的VxD程序,也为这些VxD程序提供许多服务。

VMM和VxD的操作模式和真正的程序不同。在大多数时候,它们是潜伏的。当应用程序在系统中运行时,这些VxD程序没有被激活。 当某些需要它们处理的中断/错误/事件发生时,它们才被唤醒。

在DOS程序中,虚拟设备驱动程序能控制系统的一切资源。当它们在虚拟机中运行时,Windows需要为每一个设备建立一种虚拟的设备来模拟DOS对硬件的操作。例如,在DOS程序中按下键盘时,这个事件消息首先会通知VMM,VMM接到它感兴趣的消息后,会向所有的VxD发送这个消息。当键盘VxD接收到后,会把中断发送给VMs。一个VxD程序通常控制真正的硬件设备,并对该设备在各个虚拟机之间的共享进行管理。

尽管如此,并不是说每个VxD程序必须和一个硬件设备相联。虽然VxD程序是用来虚拟硬件设备的,但是我们也可以把VxD程序看做是在第0级别的DLL。如果需要编写一个在第0级别才能工作的程序,就可以编一个VxD程序来为你完成这个工作。这样,由于此VxD程序并没有虚拟任何设备,就可以把它仅仅看做是你的程序的扩展。

VxD是系统中权力最大的程序。由于它们可以对系统做任何事情,所以它们是极度危险的。一个恶意的或错误的VxD程序可以毁掉整个系统。操作系统对于恶意的、错误的VxD程序没有任何的保护措施。

VxD程序是Windows 3.1和Windows 9x特有的,在Windows NT下不能运行。现在Windows NT下的驱动程序已经改为WDM,它比VxD更规范,标准对系统的控制也有更严格的限制。

Windows 95下有两种VxD,静态VxD和动态VxD。静态VxD是那些从系统启动就被加载,在系统关闭之前一直存在于内存中的VxD程序。这种VxD是在Windows 3.x时产生的。动态VxD是在Windows 9x下才有的。动态VxD程序可以在需要的时候,通过程序本身加载或卸载。这些程序大多数都是用来控制设置管理器和输入输出监视器加载的即插即用设备的。

  1. 虚拟机管理器

虚拟机管理器(VMM)是Windows 9x操作系统的真正内核。它建立并维护起所有的虚拟机,同时为其他VxD程序提供许多重要的服务。VMM处在VM和VxD之间。所有在VM上运行的软件和VxD之间通过VMM接口连接起来。

VMM提供了一组服务例程,它们可以创建、撤销、运行、同步以及改变所有VM的状态。VMM还提供了调试服务例程、内存管理及I/O管理和截取软中断服务。

相关推荐
小此方20 小时前
Re:从零开始的 C++ 进阶篇(二)C++继承到底做了什么?从对象模型到底层内存布局彻底讲透
c语言·开发语言·c++
Briue7Rua20 小时前
关于使用Visual Studio编译时产生的编码问题与解决方案
c语言·ide·utf-8·学习·visual studio·gbk
zh路西法20 小时前
【C语言简明教程提纲】(三):字符串与编译预处理
c语言·开发语言
自信1504130575920 小时前
数据结构之队列的实现
c语言·数据结构·算法·链表
晚枫歌F20 小时前
跳表Skip List以及实现代码C语言
c语言·开发语言
人还是要有梦想的20 小时前
C语言写一个贪吃蛇游戏
c语言·单片机·游戏
RuoZoe9 天前
重塑WPF辉煌?基于DirectX 12的现代.NET UI框架Jalium
c语言
祈安_12 天前
C语言内存函数
c语言·后端
norlan_jame14 天前
C-PHY与D-PHY差异
c语言·开发语言
czy878747514 天前
除了结构体之外,C语言中还有哪些其他方式可以模拟C++的面向对象编程特性
c语言