CSDN博客

img baisun

读书笔记 (3) (转^漂泊的猪^)

发表于2004/10/14 0:49:00  744人阅读

第三章 Windows运行机理

3.1 内核分析

 3.1.1 运行机理
 1. 概述
 VxD中的“x”代表任意的设备。可以把VxD看作是32位的DOS。Windows实现一个多任务的操作系统的方法是把运算时间轮流地分给每个虚拟器。
 VMM是一个32位的保护模式程序。它的主要任务是建立和维护一个支持虚拟机的框架,并对每个VM提供服务。VMM是第一个被加载到内存的VxD程序,放在系统目录下的VMM32.VxD中。
 在DOS程序中,虚拟设备驱动程序能控制系统的一切资源。当它们在虚拟机中运行时,Windows需要为每一个设备建立一种虚拟的设备来模拟DOS对硬件的操作。一个VxD程序通常控制真正的硬件设备,并对该设备在各个虚拟机之间的共享进行管理。尽管如此,并不是每个VxD程序必须和一个硬件设备相联。我们可以把VxD程序看做是在第0级别的DLL。
 Windows95下有两种VxD,静态VxD和动态VxD。静态VxD是那些从系统启动就被加载,在系统关闭前一直存在于内存中的VxD程序。动态VxD程序可以在需要的时候,通过程序本身加载或卸载。
 2. 虚拟机管理器
 虚拟机管理器(VMM)是Windows 9x的真正内核。VMM中使用了虚拟存储的技术,能够克服物理内存的限制。尽管再物理上不存在,但理论上4GB的空间是能被访问的。
 当一个Win32程序访问4MB空间内时,它其实访问的时映射的某物理空间。Windows中是按4KB的大小来对内存空间进行分页的。
 3. 虚拟设备
 静态VxD的加载过程:
 (1) 直接在system.ini中加入下一行代码:
  Device=VxD_NAME
 (2) 可以在Windows9x注册表中的HLM/System/CurrentControlSet/Services/VxD/key/StaticVxD子键下加入如下的VxD的路径和名字:VxD_NAME=PATHNAME
 3.1.2 LE文件的格式
 LE文件中代码和数据被存放在几类运行属性不同的段中:LCODE PCODE PDATA ICODE DBOCODE SCODE RCODE 16ICODE MCODE。
 总的说来,应该尽可能多地使用PCODE和PDATA,因为这样,VMM就可以在需要的时候把段调入调出内存。另外,硬件中断程序及其所用到的服务必须放在LCODE段里。
 在一个汇编的VxD项目中,段的定义是不必要的,段的定义主要用于C的VxD项目编写。
 3.1.3 VxD的设计实现
 系统消息Sys_Critical_Init:大多数VxD程序不要用到这个消息,除非VxD程序要接管一些其他VxD程序或者保护模式要用到的中断。
 在VMM加载VxD程序的时候,它是按照初始化顺序值小的VxD先加载的顺序加载的。
 动态VxD除了加载机制和接收到的初始化/结束消息跟静态VxD不通以外,它能做静态VxD所能做的一切。
 要在一个段里面定义函数,应该首先定义一个段,然后把函数放进去。
 VxD程序可以使用所有的寄存器,但是在改动段寄存器的时候一定要小心,一定不要改动CS和SS的内容,除非你对将发生的事情有绝对的把握。你可以使用DS和ES,但一定要记住在返回时恢复它们的初值。调用寄存器法服务函数时,通过各种寄存器来传递服务函数的参数。当调用堆栈服务函数时,你把要传递的参数压栈,在eax得到返回值。

3.2 消息的运行方式
 在16位时代,Windows的整个内核是32位的、分时的、抢占的。

阅读全文
0 0

相关文章推荐

img
取 消
img