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

① 内存的物理地址空间

VMM使用80386的保护模式管理内存。从认识CPU一章中,我们知道,在80386以后,系统能提供4GB的32位的虚拟空间。

 私有区

 共享区

 系统区

 DOS区

私有区地址是从4MB到2GB。这是Win32应用程序运行的空间。每个Win32的进程都有它自己的2GB(要减去4MB)的空间,被Win32应用系统用来存放自己的代码和资源。这块区域是私有的,因为每个Win32程序映射到不同的物理空间上。当一个Win32程序访问4MB空间内时,它其实访问的是映射的某物理空间。

共享区地址是从2GB到3GB。这个区域是被虚拟机内的所有应用程序共享的。系统DLL(user32,kernel32,gid32)和Win16进程(由于Win16要求在共享空间运行)都驻存在这里。

系统区地址是从3GB到4GB的线性空间的顶端。这里是Win9x为第0级的超级进程VMM和VxD专门开辟的区域,并且此空间也是共享的。

DOS区地址是从0到4MB的空间内,这个空间是专为DOS的应用程序留下的,另外,Win16应用程序堆栈的一小部分也放在这里。

② 内存的服务程序

VMM中使用了虚拟存储的技术,能够克服物理内存的限制。尽管在物理上不存在,但理论上4GB的空间是能被访问的。通过从RAM和次级存储器设备上交换(分页)代码和数据以及将代码和数据交换到RAM和次级存储器设备上以实现虚拟技术。因为VxD驻留在32位的保护模式部分,所以它应该可以直接访问所有的内存空间,但内存的管理是通过VMM来完成的,所以它只能通过存储器管理服务获得的内存空间。

Windows决定实际有效的虚拟存储器的数量和有效的磁盘空间的数量。实际有效的虚拟存储器的数量基于系统物理上的总量,可以手工指定。

存储器管理程序在外部程序需要时,会一直分配物理空间,直到物理存储器已经用尽。然后,它会从物理存储器移动4KB的代码或数据页到磁盘上,以使附加的物理存储器有效。Windows中是按4KB的大小来对内存空间进行分页的。这种分页对程序来说是透明的。如果程序企图访问某部分已交换到磁盘上的数据,则会产生一个页错中断。然后存储器管理程序将其页换出存储器,并恢复该程序所需要的那些页。

下面列出了Windows存储器管理服务。列出的服务构成了公共使用子集。

 系统目标管理

Alloacte_Device_Cb_Area

 设备虚拟V86页管理

Assign_Device_V86_Pages

 系统页分配程序

HeapAllocate

HeapFree

 系统页分配程序

CopyPageTable

MapIntoV86

ModifyPage bits

PageAllocate

PageLock

PageUnlock

PageGetAllocInfo

PhyIntoV86

 查看保护方式中的物理设备存储器

MapehysToLiner

DataAccessServices

GetFristV86Page

 对保护方式API的专用服务

实例数据管理

查看V86空间

中断处理程序

线程调度程序

  1. 虚拟设备

VxD的功能十分强大,它不但能"虚拟"某种设备,还能给别的VxD或应用程序提供服务。

VxD可以和VMM一起被静态地装入系统,也可以由应用程序主动地装入系统。因为VxD就在第0级工作,并且有极高的权限,所以VxD能访问任何的硬件,不仅可以访问任何的物理空间,还可以捕获软件中断和I/O端口以及其他程序对内存的访问,就连硬件中断也可以被它捕获。

① VxD的组成

安装一个VxD的过程有下面几个部分,如图3.3所示。

 实模式的初始化代码和数据在完成以下4部分后,被系统销毁。

 保护模式(PM)初始化代码部分,完成后销毁。

 保护模式(PM)初始化代码数据,完成后销毁。

 PM代码,包括设备过程、API和回调过程,以及服务例程。

 PM数据,包括设备描述符块、服务表,以及全局数据。

② VxD的加载过程

Windows 9x支持静态加载和动态加载两种加载方式。静态加载的VxD是在Windows初始化时被自动加载的,只有当Windows结束运行后,它才会卸载。Windows 9x中可以通过两种方法来加载静态的VxD。

 直接在SYSTEM.INI中加入如下一行代码:

Device =VxD_NAME

 可以在Windows 9x注册表中的HKEY_LOCAL_MACHINE\ System\CurrentControlSet\Services\VxD\key\StaticVxD子键下加入如下的VxD的路径和名字:

VxD_NAME=PATHNAME

这种动态加载的VxD不是和VMM一起在Windows启动时一起装入内存的,而由应用程序或另外的VxD装入,并且也可以通过VxD或其他应用程序动态地删除,所以,动态的VxD就有很大的灵活性。

相关推荐
91刘仁德4 小时前
C++ 继承和多态 设计模式
c语言·c++·笔记
码行山野赴时序归途4 小时前
链表家族收官篇:循环链表
c语言·开发语言·数据结构·链表
库玛西5 小时前
哈夫曼树与前缀编码:数据压缩的贪心核心
c语言·c++·笔记·考研
雷✘6 小时前
C 语言预处理中的宏展开、条件编译与头文件保护
c语言
aramae6 小时前
模拟实现memset()(C语言)
c语言·开发语言·后端
phltxy7 小时前
C语言结构体
c语言
库玛西7 小时前
数据结构与算法之美:树、森林与二叉树全解析
c语言·数据结构·笔记·考研·算法·学习方法
2601_955518187 小时前
如何学好C语言:从入门到精通,掌握编程基石
c语言·指针·项目实战·调试技巧·编程基础
是隼人7 小时前
buuctf-pwn ciscn_2019_sw_1(32位只有一次格式化机会)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
点纭7 小时前
C 语言 第七章 常用函数(3)
c语言·开发语言·算法·oracle·c#