第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就有很大的灵活性。

相关推荐
听风说ml10 小时前
socket编程 【C语言】
c语言·udp·tcp·socket编程
学逆向的12 小时前
C 局部静态变量
c语言·开发语言·网络安全
Zwawa19 小时前
从 printf 到曲线:把数据送上 VOFA+
c语言·单片机·嵌入式
二十七日秋1 天前
算法刷题笔记「Day 1|四道 OJ 入门题里的深坑」
c语言·汇编·数据结构·c++·笔记·python·算法
abc light1 天前
ARM 裸机开发(1)——ARM 体系结构
c语言·arm开发
Navigator_Z1 天前
LeetCode //C - 1309. Decrypt String from Alphabet to Integer Mapping
c语言·算法·leetcode
爱聊灵光的维C1 天前
C语言初阶:关于函数设计的详细讲解和注意事项
c语言·开发语言·青少年编程·蓝桥杯·学习方法
wuminyu1 天前
JVM规范学习总结:class执行性能差异
java·linux·c语言·jvm·c++
C++ 老炮儿的技术栈1 天前
Linux 动态库踩坑:明明重新编译了 .so,调用函数返回值却一直不变(libfjrobot.so 版本号异常排查实录)
linux·c语言·网络·c++·visual studio
小向是个Der1 天前
嵌入式进阶——MCU上电后的动作
c语言·单片机·mcu·学习·链接脚本