Programming 版 (精华区)
发信人: Sun (大灯泡), 信区: Programming
标 题: VxD世界——Win95 的线性地址分配
发信站: 哈工大紫丁香 (Tue Aug 31 12:36:32 1999), 转信
孙喜明
图1是一张描述Win95线性地址空间的图。下面我们对这张图加以详细说明。
图1 Windows 95线性地址分配图
0~4MB:
这部分在图上标的是DOS内存区,其实这是不确切的。我们知道16位的DOS应用程
序只能存取0~1MB的内存空间,那为什么还要把1MB~4MB的3MB内存也算作
DOS内存区呢?答案就在我们前面讲过的分页机制中。我们再温习一下:一个页面
(Page)是4kB,一个页面表(Page Talbe)有1024个页面,一个页面表目录(
Page Table Directory)有1024个页面表。那么一个页面表目录项就可以映射1024×
4k=4MB的线性地址。其实DOS只能利用到0MB~1MB的内存空间,那1MB~4MB
的地址空间留给谁了呢?关于这个问题,笔者曾经问过Karen Hazzah、Walter
Oney和Geoff Chappell,他们的回答是:这一部分是空的。Win95为了图省事,就
把1MB~4MB的线性地址空间也当作DOS内存区,这样Win95在DOS VM之间切换
时,就可以页面表目录项(Page Table Directory Entry)为单位来进行。这样虽说
浪费了3MB的地址,却换来了DOS VM切换的高效率。
那图1中标出的①又是指的什么呢?呵呵,Win95有趣得很,为了使系统、Win16应
用程序能与DOS应用程序互相协作,于是在0~1MB之间,其实是紧挨着1MB的下
面,放了一个Win16全局堆(其实是Win16全局堆很小的一部分)。说到这里,笔者
想起了一个深受大家喜爱的DOS下的编辑器Quick Edit 4.0,这个编辑器有一个非常
有趣的功能:能与Windows共享剪贴板。当时我们猜想它一定用到了未公开的DPMI
调用,现在从图1来看,肯定是①部分的Win16全局堆帮了它的忙啦。
同时请注意图1中还有一个②,这部分我们称作Win16全局堆的高端部分。为什么要
在这里安置一个Win16的全局堆?它是用来作什么的呢?
这个问题的答案是:为了高效率地切换DOS VM。
每一个DOS VM在大于3GB的地址空间都有一个备份,Win95在DOS VM之间进行
切换时,只是简单切换一下页面表目录的第一项就可以了。所以说,如果一个VxD
想访问某个DOS VM,没有必要一定要等到该DOS VM成为当前VM才能访问,它可
以直接去②访问那个DOS VM的备份。这个DOS VM备份的地址我们称作High-
linear address。
后面的文章中,我们将详细讲到如何在VxD中访问DOS VM。
--
〖小糊涂虫2000灌水机〗
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: sun@hope.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.010毫秒