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

相关推荐
捷瑞电子工坊19 小时前
C语言二维数组在内存中是如何存储的?
c语言·二维数组·内存存储·数组底层
lilili也20 小时前
visual studio add matlab
c语言·c++
阿米亚波1 天前
【C/C++包管理器】vcpkg(by microsoft)
c语言·c++·git·vscode·microsoft·github·vcpkg
SNAKEpc121381 天前
OpenGL(十一)- 变换管线
c语言·c++·算法·矩阵·图形渲染
小小龙学IT1 天前
Day 26-27 项目实战:从零构建一个高并发聊天室(epoll + 线程池)
linux·服务器·c语言·开发语言·网络
c238561 天前
MySQL 基础用法(下):查询进阶与核心特性
android·c语言·c++·mysql
十月的皮皮1 天前
STM32从零到量产开发:四路继电器工业控制模块开发 - 上位机操作说明书
c语言·stm32·单片机·stm32cubemx
小僧景贤1 天前
嵌入式C语言 第十一篇:成长路线|嵌入式C工程师完整进阶学习路径(从零到工程级落地|含周期+实战项目)
c语言·开发语言·学习
灵晔君1 天前
【Linux】进程(四)——进程虚拟地址空间
linux·c语言·开发语言
wengqidaifeng1 天前
2026 年电赛(TI 杯)控制类 H 题:8 路灰度循迹、直线/半圆分段控制与 S1/S2/S3 状态机
c语言·单片机·嵌入式硬件