wxzself经验汇编 虚拟实现汉子系统 VVDOS 二、实现

0
(0)

1. VVDOS架构

VVDOS 是采用全新思想设计的系统软件,具体体现在高效率的内核与灵活的环境子系统上,如下图所示:

VVDOS 系统设计思想采用了客户/服务器模型。它的内核是一个通用的、多目标汉字系统,提供基本汉字系统机制,并容许环境子系统为其仿真的汉字系统建立策略和语义解释。环境子系统保证每个环境的性能和其模拟的汉字系统相类似。

2.VVDOS内核

VVDOS 内核的基本功能是实现直接写屏,虚拟硬件环境。由于系统设计技术的要求, VVDOS 的内核工作于 32 位保护模式下,以取得在实模式下无法达到的高性能。 VVDOS 的实模式内核仅是为了在 WINDOWS 下的 DOS 窗口中使用汉字系统而设的,它的技术性能与其它汉字系统相近。VVDOS 根据环境要求动态地切换内核。

3 VVDOS文本缓冲区

VVDOS 的文本缓冲区没有采用修改图形缓冲区段排列的办法,而是采用了虚拟分页技术,将扩展内存分页至所需要的地址。这样做有以下优点:

1)文本缓冲区可取任意大小。

2)文本缓冲区地址不限。

3)文本缓冲区可实现存取控制(缺页、特权、读写)。

4)文本缓冲区及其特性可动态设置。

5)不依赖于显示卡的内部细节。

由于文本缓冲区实质在扩展内存中,因此需修正 DMA 地址。

VVDOS 的内核根据环境子系统的要求动态设置文本缓冲区。

4 VVDOS直接写屏

VVDOS 直接写屏有两种方法:

1)中断法:

中断法实现的基本思想是在用户直接写屏时产生中断,就象用户调用 INT10H 一样,如下图所示:

问题是如何产生中断。在实模式下,用户读/写内存不会引起中断。因此,只能工作于保护模式下。在保护模式下,可以将虚拟分页得到的文本缓冲区标识为只读或系统以产生写保护页故障(读文本缓冲区指令可以正常执行),这个页故障中断正是所需要的。算法如下:

用户写入文本缓冲区引起页故障

内核处理页故障:
  保存用户单步标志

使此页可写并刷新页表快表

置用户程序单步标志

返回用户任务

用户此指令执行(成功)并引起单步中断

内核处理单步中断:

(显示处理)

使此页不可写并刷新页表快表

恢复用户程序单步标志

返回用户任务

用户程序继续执行

注: *1为避免与其它程序冲突,必须保存和恢复应用程序的单步标志。
     *2也可以在页故障处理程序中仿真用户指令将文本写入缓冲区。
2)查询法:

查询法是保存文本缓冲区的副本,定时比较文本缓冲区与副本的数据是否一致,然后重画有改动的部分,它与 UNIX 下的终端显示的虚实屏缓冲方式类似。若用户在一定时间内对文本缓冲区多次写入,系统仅对最终的变化有响应,所以具有批处理优化功能。而当用户写入很少或不写入时,大量时间花费在查询上,性能反而变差。它的主要缺点是实时性差,写入字符不能马上显示,缩短定时间隔虽然可以提高实时性,但查询开销变大且丧失优化功能。原理如下图所示:

第二代汉字系统就使用查询法,它挂接 INT8H 实现定时查询。

VVDOS 也使用查询法,但稍有不同。它定时查询的不是整个缓冲区(4K),而是文本缓冲区的页表的“脏”位,如果此页“脏”,则再查询整个缓冲区;如果此页“干净”(没有写入) 则不用查询整个缓冲区了。可见,当用户写入文本缓冲区时,两者效率相同;而用户没有写入文本缓冲区时,效率提高很多。算法如下:

若  页“脏”

循环  比较两个缓冲区

若  不一致

重画屏幕

刷新副本使两者一致

清  页表“脏”位

刷新页表快表

在实际应用中,两种方法灵活结合可以取得最好的效果。在一定时间内,若用户写入数量大,则采用查询法进行优化。反之,则使用中断法速度更快且具有实时响应能力。

在环境子系统没有特殊要求的情况下,VVDOS 使用多时钟写入计数器(对多个时间片进行统计,以使结果精确)平衡两种方案。当用户写入较少时,打开页故障陷阱,在此中断服务程序中显示字符,刷新副本缓冲区,清除页“脏”标志,使查询法失效,仅使用中断法。反之,取消页故障,禁止中断法,使用查询法,定时重画屏幕。当用户写入过多时,加长重画屏幕的时间间隔,甚至变成“隔行扫描”状态(在两个或多个周期才完整扫描一次屏幕),可以称其为“懒惰算法”。如下图所示:

     用户写屏次数—->多

  ┠────╂───────────────────┨

 中断法  查询法—->(时间间隔)长—->隔行扫描

以下几点,也提高了 VVDOS 的写屏速度。

1>汉字库在内核和驱动程序的数据段中,直接读取。

2>文本缓冲区在 RAM 而不是 VRAM。

VVDOS 高效的直接写屏方案使得在不优化滚屏操作、打开西文制表符识别的情况下,它的显示速度仍然与西文 BIOS 字符方式不相上下。下面的例子为一机器上的实测值:

(486 DX2/80 TVGA)

D:>TYPE README

系    统         时    间

西文 BIOS           6   秒

VVDOS 0.9(VGA MODE)      7   秒

UCDOS 3.0(VGA MODE)      54   秒

可以看到,VVDOS 达到了汉字系统前所未有的高性能。

5 VVDOS I/O仿真和虚拟BIOS

VVDOS 内核提供了可选的 I/O 仿真能力,以便更好的仿真汉字系统特别是硬汉字系统。由环境子系统提出请求,VVDOS 内核将控制指定地址的 I/O 口的读写能力。当应用程序进行读写时,将相应的消息传送到环境子系统,环境子系统完成处理,将结果送回应用程序。典型的例子如仿真一个并不存在的光标地址寄存器,屏蔽对某些口地址寄存器的访问等。
  同样,VVDOS 内核也提供了虚拟 BIOS 数据区的能力。将真正的 BIOS 数据区和显示卡 BIOS 虚拟分页至另一个虚拟 8086 任务空间,而给应用程序一个由环境子系统管理的虚拟 BIOS 数据区。将 ROM BIOS与用户程序完全隔绝,从而创建一个完全虚拟的 BIOS 环境,有了这两个能力,VVDOS 就可以虚拟出一个完全“真实”的特殊硬件环境。如下图所示:

环境子系统维护着虚拟
BIOS 数据区(如显示方式、光标位置、字符点阵地址等),而真实的 BIOS 数据区只有原始 ROMBIOS 才能看到,两者都是合理的、正确的。这样就不会出现因为 BIOS 状态与 BIOS 数据不一致而引起冲突的问题。

6 VVDOS驱动程序

VVDOS 的驱动程序直接控制系统硬件。VVDOS 提供标准的数种驱动程序 (如 HRC,CGA,EGA,VGA,SVGA,光标,提示行),而其它驱动程序需要环境子系统提供 (如 CEGA),内核可以将它们动态地装入/卸出系统。

VVDOS 的驱动程序是 16 位的实模式代码,它直接处理显示卡中的硬件细节,以满足环境子系统的特殊要求。如仿真长城 CEGA 需要将显示卡设置为非标准的显示模式(640*504)。置 CEGA 模式时,内核将消息传送至相应的驱动程序,内核并不了解 CEGA 模式,它仅是将驱动程序的结果送回环境子系统。

与其它汉字系统不同的是,VVDOS 的驱动程序仅负责控制硬件和在屏幕上显示汉字,即它仅了解特定的图形显示模式,而对文本BIOS 一无所知。传统意义上的文本 BIOS 实际上是由环境子系统维护。

注意:不论是用户程序直接写屏还是环境子系统写入文本缓冲区,均可能引起写屏中断。

VVDOS 系统汉字的写入与显示绝大部分是异步的。因此环境子系统对显示没有什么影响。VVDOS 的速度基本上是环境子系统写入文本缓冲区的速度,因此与西文状态相差不多。

VVDOS 的驱动程序既可以工作在实模式下,又可以工作在虚拟 8086 模式下,此时尽管驱动程序的特权级为 3,但操作系统容许其执行 I/O 指令。这样,不论内核是实模式还是保护模式,都使用同一驱动程序,简化了编程工作。

在驱动程序中,提示行驱动程序和光标驱动程序是特殊的驱动程序,光标驱动程序负责在指定的图形模式下画出光标,而图形模式、光标的位置、形状以及属性、闪烁速率由环境子系统决定。提示行驱动程序则负责画出提示行,而提示行的属性则由环境子系统控制。它们和其它驱动程序一样,也可以被环境子系统的新的驱动程序所取代。内核定时调用这两个驱动程序。

内核和设备驱动程序提供了汉字系统所需的基本机制,但这些机制怎样在应用程序中使用的策略则由环境子系统制定。因此,VVDOS 可以任意虚拟其它的汉字环境甚至硬汉卡。

7 VVDOS 实模式内核

VVDOS 的实模式内核与保护模式内核的区别在于:

1)仅使用查询法实现直接写屏。

2)没有 I/O 仿真和虚拟 BIOS 数据区的能力。

3)文本缓冲区不能自己分页得到。

4)无法降低内存占用(与第二代汉字系统相同)。

8 VVDOS 环境子系统

VVDOS 的设计目的就是兼容现有的汉字系统,但兼容性并不存在于真空之中,如果采用多种 API 来仿真多种汉字环境,具体汉字系统在设计中所要求的“细节导线”(chicken wire),和“巫术”(voodoo) 接口会使这样的设计目标几乎不可能实现。

1980 年,Mach 操作系统成功地解决了支持不同的、不相容的UNIX应用程序编程接口(API)的问题。它采用了客户/服务器模型,通过把不同的 API 作为用户态服务器进程加以实现从而达到这一目的。将每个 API 移到独立的服务器中避免与内核的冲突与重复,并允许容易地增加新的 API。1993 年,WINDOWS NT 采用这一设计思想,成功地实现了 WINDOWS、MS-DOS、OS/2 、LAN Manager的二进制兼容。采用客户/服务器模型,可以达到以下设计目标:

1)在保持基本系统代码(内核)简单、可维护的同时,提供多种应用程序编程接口(API)。

2)保护基本系统,使其不受 API 变化或扩展的影响。

3)合成每个 API 要求的全程数据,同时,将各个 API 要求的全程数据彼此分开。

4)保护每个 API 环境使其不受应用程序和彼此的影响,保护基本系统不受其它环境的影响。

5)允许基本系统将来能随新的 API 而扩展。

注:以上文字引自参考文献[1]。

VVDOS 采用客户/服务器模型,就是要达到以上设计目标。

VVDOS 的每个环境子系统可以看作是一个对象,在客户/服务器模型下,它既是内核的客户,又是用户程序的服务器。由于它独立与内核,因此环境子系统的设计自由度相当大。所有内核没有提供的功能都可以在这里实现。如支持其它点阵和矢量字体显示、打印服务、键盘与汉字输入、应用程序编程接口、汉字代码集等。

由于客户/服务器模型的优点,更换内核时无需更换环境子系统。当要仿真一个新的汉字系统时,只需安装一个新的环境子系统即可。甚至可以由别的厂商根据 VVDOS API 设计具体的环境子系统(汉字系统)。

环境子系统在初始化时请求内核和驱动程序虚拟一个硬件环境,而这个硬件环境与环境子系统所要仿真的汉字系统非常接近(图形模式、文本缓冲区地址、汉字尺寸、光标类性、I/O 控制)。在这个环境中,写入文本缓冲区的字符会自动显示在屏幕上。环境子系统就是在这个硬件环境之上建立具体的汉字系统。

环境子系统只是普通的 DOS 程序,它只是一个文本 BIOS,负责维护显示方式、光标及 BIOS 服务。如果用户调用 INT10H,它负责将字符写入文本缓冲区或移动光标。如果用户直接写屏,则它不用作任何事情,字符会自动显示。如果用户设置光标地址寄存器,内核会传送此消息,环境子系统修改自己维护的光标位置。VVDOS 的环境子系统完全可以使用高级语言来编写。

对象管理系统用来管理多个汉字系统对象。用户可以通过对象管理系统装入指定的汉字系统,也可以由对象管理系统自动装入正确的汉字系统,如下例所示:

C:>WPS

WPS 发出寻找 SPDOS 的消息

内核将此消息传送到对象管理系统

对象管理系统装入 SPDOS 汉字系统对象

SPDOS 汉字系统对象应答 WPS 的请求

内核将此消息传送到 WPS

WPS 正常执行,由 SPDOS 汉字系统对象提供服务

注:

1)如果没有用户所需的汉字系统,内核装入缺省的汉字系统。

2)如果用户程序没有发出寻找汉字系统的消息,则需要用户手工指定汉字系统对象。

3)环境子系统要在对象管理系统中注册自己的消息。

这篇文章有用吗?

点击星号为它评分!

平均评分 0 / 5. 投票数: 0

到目前为止还没有投票!成为第一位评论此文章。

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注