现在的位置: 首页 > 综合 > 正文

虚拟实现汉字系统—-VVDOS (1995-8)

2014年10月21日 ⁄ 综合 ⁄ 共 16037字 ⁄ 字号 评论关闭

                    引    言

     汉字系统已有十余年的发展历史,现在还能设计出更好的汉字系统吗?本文在这方面进行了有益的探索。

一.对现有汉字系统的分析

1.第一代汉字系统:
     在汉字系统的发展过程中,CCDOS 基本上代表了八十年代中期的设计思想,即挂接 INT10H 中断向量,实现汉字显示;挂接 INT17H 实现汉字打印;挂接 INT9H 实现汉字输入。随着显示卡的技术进步,汉字系统也由 11 行汉字显示改为 25 行,同时,汉字输入模块的挂接也逐渐标准化。
     这一代汉字系统可在 BIOS 级处理汉字,它们支持了众多的中文软件及 DBASE、FOXBASE 等西文软件。同时,由于使用 EMS 及 XMS,内存占用也由近 300K 降到 50K 左右。
     八十年代中后期,大量外国优秀软件传入国内,出于性能上的考虑,这些软件大多采用直接写屏方式,这就使第一代汉字系统遇到了无法克服的困难。这些软件的汉化大多采用修改软件代码的方式,即将直接写屏改为调用 BIOS 中断。这样不但引起一系列问题,而且必须对软件的每一个版本都进行汉化,汉字系统成为软件进步的绊脚石。同时,汉字系统互不通用,“方言严重”,影响了汉字系统本身的发展。

2.硬汉字系统:
     八十年代中后期,出现了一批硬汉字系统,典型的如长城汉卡等,这些汉卡可实现汉字的直接写屏。相应的,许多用户也在这些汉字平台上开发了大量的应用软件。

3.第二代汉字系统:
     九十年代初期出现的第二代汉字系统,以 UCDOS 作为代表。它首先解决的就是汉字的直接写屏问题。这是汉字系统设计思想的一次飞跃,它使得绝大多数西文软件无须汉化即可使用。
     它的实现思路是定时将用户写入文本缓冲区的内容“画”到图形屏幕上去,这样在用户眼中则是“直接写屏”,同时对西文软件的兼容性也比较好。由于显示卡在图形方式下并没有什么“文本缓冲区”,所以必须修改图形缓冲区的段排列,使它覆盖文本缓冲区。
     第二代汉字系统的性能已与汉卡接近,所以汉卡被逐渐淘汰。
     需要指出的是,第二代汉字系统还有以下优点,但却被许多人忽视了:
     1)显示速度提高,实现字符闪烁特性,光标仿真好。
     2)辨别西文制表符。
     3)使用 UMB 及HMA,做到了“零内存占用”。
     4)提供应用程序编程接口。
     5)字库日趋完善。
     6)开始注意避免与 WINDOWS 相冲突。
     第二代汉字系统遇到的最大的问题还是“方言问题”,这个问题随着时间的推移而变得更加严重。不但与第一代汉字系统难于兼容,与硬汉卡难于兼容,而且第二代汉字系统本身之间也难于兼容,建立在某种系统上的应用程序难于移植到其它汉字系统之上。以至于谁也无法打破“诸候割据”的局面。
     可见,汉字系统最重要的是软件兼容性,即在其它汉字系统下设计的软件不用修改即可正常运行。哪个汉字系统解决了这个问题,就可以使自己成为标准,进而建立新的汉字系统市场。

4.VVDOS简介:
     VVDOS 的设计思想体现在三个方面:
          1)兼容性:VVDOS 不但兼容第一、第二代软汉字系统,而且兼容硬汉字系统,兼容不同地区的汉字系统(大陆、台湾)。这是目前其它的汉字系统所不能做到的。
          2)性能:VVDOS 实现了高效的直接写屏、虚拟多汉字系统、其它性能与现有汉字系统相近。
          3)与 WINDOWS 相容:VVDOS 与 WINDOWS 可以很好的互相配合工作。
                    二.VVDOS分析
     VVDOS 是采用全新思想设计的系统软件,具体体现在高效率的内核与灵活的环境子系统上,如下图所示:
     ┌───┐  ┌───┐  ┌───┐  ┌───┐
     │对象    │  │VVDOS │  UCDOS     │长城   │
     │管理    │  │汉字    │  │汉字    │  │硬汉卡│
     │系统    │  │系统    │  │系统    │  │系统    │
     └─┬─┘  └─┬─┘  └─┬─┘  └─┬─┘
             └───┴──┬──┴─────┘ 环境子系统
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   ┌──────────┐  ┌──────────┐ 内核
   │ VVDOS 保护模式内核│   │  VVDOS 实模式内核   │
   └────┬─────┘  └─────┬────┘
                       └──────┬──────┘
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
         ┌────┬────┼────┬────┐ 驱动程序
     ┌┴─┐  ┌┴─┐  ┌┴─┐  ┌┴─┐  ┌┴─┐
     │VGA│  │SVGA││CEGA││提示│ │光标│
     │驱动│  │驱动│  │驱动│  │行   │  │驱动│
     │程序│  │程序│  │程序│  │驱动│  │程序│
     └┬─┘  └┬─┘  └┬─┘  └┬─┘  └┬─┘
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┌───────────────────────┐硬件
    │                  图形缓冲区                                                      │
    └───────────────────────┘
                       VVDOS系统简图
     VVDOS 系统设计思想采用了客户/服务器模型。它的内核是一个通用的、多目标汉字系统,提供基本汉字系统机制,并容许环境子系统为其仿真的汉字系统建立策略和语义解释。环境子系统保证每个环境的性能和其模拟的汉字系统相类似。
注:以上文字引自参考文献[1]。

1.VVDOS 的内核:
     VVDOS 内核的基本功能是实现直接写屏,虚拟硬件环境。由于系统设计技术的要求, VVDOS 的内核工作于 32 位保护模式下,以取得在实模式下无法达到的高性能。 VVDOS 的实模式内核仅是为了在 WINDOWS 下的 DOS 窗口中使用汉字系统而设的,它的技术性能与其它汉字系统相近。VVDOS 根据环境要求动态地切换内核。
     1.VVDOS 的文本缓冲区:
          VVDOS 的文本缓冲区没有采用修改图形缓冲区段排列的办法,而是采用了虚拟分页技术,将扩展内存分页至所需要的地址。这样做有以下优点:
          1)文本缓冲区可取任意大小。
          2)文本缓冲区地址不限。
          3)文本缓冲区可实现存取控制(缺页、特权、读写)。
          4)文本缓冲区及其特性可动态设置。
          5)不依赖于显示卡的内部细节。
          由于文本缓冲区实质在扩展内存中,因此需修正 DMA 地址。
          VVDOS 的内核根据环境子系统的要求动态设置文本缓冲区。

     2.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 达到了汉字系统前所未有的高性能。

     3.VVDOS 的 I/O 仿真和虚拟 BIOS 数据区:
          VVDOS 内核提供了可选的 I/O 仿真能力,以便更好的仿真汉字系统特别是硬汉字系统。由环境子系统提出请求,VVDOS 内核将控制指定地址的 I/O 口的读写能力。当应用程序进行读写时,将相应的消息传送到环境子系统,环境子系统完成处理,将结果送回应用程序。典型的例子如仿真一个并不存在的光标地址寄存器,屏蔽对某些口地址寄存器的访问等。
          同样,VVDOS 内核也提供了虚拟 BIOS 数据区的能力。将真正的 BIOS 数据区和显示卡 BIOS 虚拟分页至另一个虚拟 8086 任务空间,而给应用程序一个由环境子系统管理的虚拟 BIOS 数据区。将 ROM BIOS与用户程序完全隔绝,从而创建一个完全虚拟的 BIOS 环境,有了这两个能力,VVDOS 就可以虚拟出一个完全“真实”的特殊硬件环境。如下图所示:
             1M┌───┐                                    1M┌───┐
                       ───┤VIRTUAL                         ├───┤REAL
 0C000:0H   ───┤ROMBIOS     0C000:0H├───┤ROMBIOS
                   │           │                                           │            │
                   │           │                                           │            │
                   │           │                                           │            │
                   ├───┤VIRTUAL ROMBIOS       ├───┤REAL ROMBIOS
   0:0040H└───┘DATA AREAS  0:0040H └───┘DATA AREAS
     用户程序看到的,由环境        原始 ROMBIOS 看到的 BIOS 数据,
     子系统维护的虚拟 BIOS 数据    代表显示卡的真正状态。
     环境子系统维护着虚拟 BIOS 数据区(如显示方式、光标位置、字符点阵地址等),而真实的 BIOS 数据区只有原始 ROMBIOS 才能看到,两者都是合理的、正确的。这样就不会出现因为 BIOS 状态与 BIOS 数据不一致而引起冲突的问题。

     4.VVDOS 的驱动程序:
          VVDOS 的驱动程序直接控制系统硬件。VVDOS 提供标准的数种驱动程序 (如 HRC,CGA,EGA,VGA,SVGA,光标,提示行),而其它驱动程序需要环境子系统提供 (如 CEGA),内核可以将它们动态地装入/卸出系统。
          VVDOS 的驱动程序是 16 位的实模式代码,它直接处理显示卡中的硬件细节,以满足环境子系统的特殊要求。如仿真长城 CEGA 需要将显示卡设置为非标准的显示模式(640*504)。置 CEGA 模式时,内核将消息传送至相应的驱动程序,内核并不了解 CEGA 模式,它仅是将驱动程序的结果送回环境子系统。
          与其它汉字系统不同的是,VVDOS 的驱动程序仅负责控制硬件和在屏幕上显示汉字,即它仅了解特定的图形显示模式,而对文本BIOS 一无所知。传统意义上的文本 BIOS 实际上是由环境子系统维护。如下图所示:
       直接写屏                                 写屏中断消息
       ─────────┐        ┌──────────
           INT10H 写字符     │        │        重画消息
             ─────┐      │        │┌───────── 
                ┌─┴─┐       │    ┌┴┴─┐         ┌───┐
                │环境    │       │    │  驱      │         │  图       │
                │            │       │    │  动      │ 画出│  形       │
                │子系统│       │    │  程      ├───┤  屏    │
                │(BIOS)│       │    │  序      │          │  幕      │
                └─┬─┘       │    └─┬─┘          └───┘
                        │写入       │            │读出        0A0000H
                ┌─┴───┴───┴─────────┐
                │       文本缓冲区 (0B8000H)                           │
                └───────────────────┘
注意:不论是用户程序直接写屏还是环境子系统写入文本缓冲区,均可能引起写屏中断。
     VVDOS 系统汉字的写入与显示绝大部分是异步的。因此环境子系统对显示没有什么影响。VVDOS 的速度基本上是环境子系统写入文本缓冲区的速度,因此与西文状态相差不多。
          VVDOS 的驱动程序既可以工作在实模式下,又可以工作在虚拟 8086 模式下,此时尽管驱动程序的特权级为 3,但操作系统容许其执行 I/O 指令。这样,不论内核是实模式还是保护模式,都使用同一驱动程序,简化了编程工作。
          在驱动程序中,提示行驱动程序和光标驱动程序是特殊的驱动程序,光标驱动程序负责在指定的图形模式下画出光标,而图形模式、光标的位置、形状以及属性、闪烁速率由环境子系统决定。提示行驱动程序则负责画出提示行,而提示行的属性则由环境子系统控制。它们和其它驱动程序一样,也可以被环境子系统的新的驱动程序所取代。内核定时调用这两个驱动程序。
          内核和设备驱动程序提供了汉字系统所需的基本机制,但这些机制怎样在应用程序中使用的策略则由环境子系统制定。因此,VVDOS 可以任意虚拟其它的汉字环境甚至硬汉卡。

     5.VVDOS 的实模式内核:
          VVDOS 的实模式内核与保护模式内核的区别在于:
               1)仅使用查询法实现直接写屏。
               2)没有 I/O 仿真和虚拟 BIOS 数据区的能力。
               3)文本缓冲区不能自己分页得到。
               4)无法降低内存占用(与第二代汉字系统相同)。

2.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)环境子系统要在对象管理系统中注册自己的消息。
                  三.VVDOS的其它特点
     下面从其它的角度来分析 VVDOS,以给出 VVDOS 的全貌。

1.VVDOS 的工作环境:
     VVDOS 要求 386 以上 CPU,1M 以上内存,显示卡不限。在 PC 和286 上 VVDOS 只能以实模式工作,但它仍然尽量努力仿真好其它汉字系统。
     VVDOS 在工作时进入保护模式,此时 DOS 变成 VVDOS 的一个虚拟8086 任务,由 VVDOS 内核支持 DOS 的正常运行。当 VVDOS 无法进入保护模式时,VVDOS 进入实模式内核。
     VVDOS 占用内存的次序是:
          1) XMS
          2) UMB
          3) HMA
          4) 常规内存
     VVDOS 工作时,系统原有的 XMS、EMS 服务不变。

2.VVDOS 的内存映象:
     在保护模式内核的控制之下,VVDOS的各个模块在系统内存中的分布如下:
     1)环境子系统,驱动程序:
          环境子系统和驱动程序作为一个虚拟 8086 任务运行,它在保护模式的扩展内存空间中。图形缓冲区和文本缓冲区的虚地址不变。对于环境子系统和驱动程序来说,保护模式与实模式没有区别,因此可以不占用常规内存。
     2)内核:
          内核工作在 32 位保护模式下,除了实模式/保护模式切换代码外,均在扩展内存中。而实模式/保护模式切换代码仅占 10K--20K,可以在常规内存或 HMA 中。
     可见,在理想情况下,仅占用常规内存或 HMA 10K--20K,是常规内存占用最少的汉字系统,系统内存映象见下图:
              V8086                   P32              V8086
          ┌───┐             ┌───┐      1M┌───┐
   1M  ├───┤HMA    │           │             │            │
           │           │             │           │             ├───┤0B8000H
           │           │UMB    │           │             ├───┤0A0000H
 640K├───┤            │           │XMS     │            │
           │           │常规                    │             │            │
           │           │内存    │            │             │            │
           │           │            │            │             │            │
        0└───┘            └───┘          0└───┘
                 DOS                  VVDOS           环境子系统
                                              和驱动程序
      如果使用负内存占用技术(见后),VVDOS 可实现 -80K 或 -180K左右的内存占用。
     在实模式下,VVDOS 努力将所有模块放入 UMB 和 HMA 中。

3.VVDOS 的中断挂接:
     以用户调用 INT10H 显示字符为例,说明 VVDOS 的中断挂接:当用户发出 INT10H 的调用时,内核将这一调用传送到环境子系统,环境子系统将字符写入文本缓冲区,修改光标位置,然后返回用户程序。因为无需在屏幕上显示字符、光标,所以速度与西文 BIOS 相同。
     比较复杂的中断挂接以用户调用 INT10H 设置图形显示模式为例,如下所示:
     ┌─────┐①请求 BIOS 服务       ┌──────┐
     │   DOS        ├──────────┤                        │
     │ 应用程序  ├──────────┤                        │
     └─────┘⑧返回应用程序            │                        │
                                                                         │                        │
     ┌─────┐②转发请求                    │    内                │
     │ 环    境       ├──────────┤                        │
     │ 子 系 统   ├──────────┤                        │
     └─────┘③调用驱动程序            │                        │
                                                                         │                        │
     ┌─────┐④转发请求                    │                        │
     │ 驱    动       ├──────────┤                        │
     │ 程    序       ├──────────┤                        │
     └─────┘⑤调用原始 BIOS         │    核                │
                                                                         │                        │
     ┌─────┐⑥转发请求                    │                        │
     │ 显 示 卡  ├──────────┤                        │
     │   BIOS        ├──────────┤                        │
     └─────┘⑦完成返回                    └──────┘
     当用户发出设置图形模式功能调用时,内核将这一调用传送到环境子系统。如果环境子系统支持这一图形模式,则调用设备驱动程序进行设置。内核将此调用传送到驱动程序。驱动程序既可以自行设置,也可以调用显示卡 BIOS 进行设置。如果是调用显示卡 BIOS ,内核再次将调用传送到显示卡 BIOS。由显示卡 BIOS 完成最终的设置工作。这种多层驱动程模型可以达到相当的灵活性。

4.VVDOS 的负内存占用:                                    
     VVDOS 提供了可选的负内存占用技术,采用此技术可以使常规内存由 640K 增加到 730K 或 830K 左右。
     增大常规内存的唯一方法是虚拟分页,如 UMB。由于 0A0000 为图形缓冲区,0B0000 为文本缓冲区,0C0000 为显示卡 BIOS,这些地址无法利用。因此 UMB 与常规内存不连续。这一点限制了 UMB 的使用。
     VVDOS 的内存扩充方案,是将这些地址分页引入扩展内存。这样从0--0D0000H 将成为一个地址连续的空间,然后提供这些空间给 DOS 使用。而原来的地址不变移入环境子系统和驱动程序的虚拟 8086 空间中,以使它们正常工作。而 BIOS 服务(如获取 ROM 8*8 点阵地址)则被重新定位在 0D0000H--1M 之间的空闲地址中。
     很明显,这种方案要求用户仅使用 INT10H 显示字符,不能直接写屏,不能使用图形缓冲区。如果用户直接写屏,地址只能是 0--0B8000H或 0--0B0000H,即内存只能增大 96K 或 64K。如果用户使用图形缓冲区,内存无法增大,只能提供 UMB。
     由于此方案有可能引起冲突,因此只有在用户的主动设定或请求下,VVDOS 才提供此服务。
     对于标准的应用程序(如 FOXBASE),地址空间可达 0--0D0000H,即800K 以上,对于那些直接写屏的应用程序(如 TC),地址空间可达 0--0B8000H,即 700K 以上。

5.VVDOS 的图文同屏:
     VVDOS 的一个突出优点就是图文同屏,无论用户程序是在文本还是图形方式下,都可以做到图形、直接写屏字符(标准点阵)、其它的点阵字体同时显示。用户可以在图形缓冲区作图,在文本缓冲区直接写屏,调用 INT10H 显示其它点阵字体(由环境子系统提供服务)。在图形方式下做到文本直接写屏,这在其它汉字系统下是不可想象的。
6.VVDOS 与其它程序交互的处理:
     1) VVDOS 根据环境可用以下方式工作:
          1> 实模式:VVDOS 进入保护模式,自己虚拟分页。
          2> WINDOWS:VVDOS 使用实模式内核,请求 EMS。
          3> EMM386等:VVDOS 进入保护模式,自己虚拟分页并继续提供 EMS 服务。
          4> 其它:VVDOS 使用实模式内核,修改图形缓冲区段排列,不使用 EMS。
     2) VVDOS 在保护模式内核加载时自动支持 XMS (HIMEM.SYS),而EMS(EMM386.EXE) 则在保护模式内核加载时退出,保护模式内核接管 EMS 并继续提供服务。从用户的角度来看,XMS 和 EMS 系统服务没有变化。
     3)当 WINDOWS 启动时若 VVDOS 已经装入,则 VVDOS 退出保护模式内核,加载实模式内核,WINDOWS 则将 VVDOS 拷入每一个虚拟 DOS 空间,接管 EMS 服务。这样,VVDOS 可在每一个虚拟 DOS 正常空间工作。当 WINDOWS 退出时,VVDOS 重新加载保护模式内核,接管 EMS 服务。而当在 WINDOWS 的 DOS提示符下加载 VVDOS 时,VVDOS 仅在当前虚拟 DOS 空间加载实模式内核。也就是说,只要在 DOS 方式下,就可以任意加载 VVDOS,并且 VVDOS 可以和 WINDOWS 透明切换。
     4) VVDOS 不影响后台通信程序,VVDOS 在保护模式内核中的时间极少。汉字系统中最费时间的是显示过程(即调用驱动程序),而驱动程序是工作在虚拟 8086 模式下,内核可以响应中断(这也是驱动程序没有工作在 32 位保护模式下的一个理由)。
     5) VVDOS 支持实模式下的调试器,但不支持虚拟调试器,此时将 VVDOS 改用实模式内核即可。
     6) VVDOS 可在网络下正常工作。
     7) VVDOS 的虚拟 DOS 环境与 WINDOWS 的虚拟 DOS 环境并不完全相同。由于 VVDOS 可以赋予虚拟 DOS 任务相当的特权,因此,它与实模式 DOS 环境相差无几,这一点是 WINDOWS 所难以做到的。
     8) VVDOS 不支持 WINDOWS 应用程序的汉化,不支持图形软件的汉化。

 7.VVDOS 的未实现性能:多任务。 VVDOS 内核和环境子系统更适应多任务环境,但目前实现一个多任务汉字环境 (VV VISUAL) 没有意义。

8.VVDOS 的市场分析:
     开发软件,最终的目的是市场角度而不是技术上的优越性。这两点不是并肩进行的。这不是一件简单地屈从于愚蠢的市场的奇想,而是市场产生标准化,而标准带来现实的好处,比毫无生气的技术特点更重要。
     “如果有人认为我们没有追随 Lotus、WordPerfect 和 Borland,那么他们搞错了。我的工作就是力图在软件应用市场上获得合理的份额,就我个人而言,这个份额应当是 100%。”
      -Mike Maples,Microsoft 应用领域负责人,资深副总裁,1991
注:以上文字引自参考文献[2]。
     VVDOS 是一个标准,一个可以与旧的标准兼容的新标准,在此之上可以建立一个新的汉字系统市场,这个基于 DOS 的市场能够延长 DOS 的生命期。它的性能优秀,并且兼容现在的汉字系统,给现有应用程序以兼容性交叉升级的可能。因此具有广阔的市场前景。

参考文献:

1)[美] HELEN CUSTER 著:<<INSIDE WINDOWS NT>>,清华大学出版社,1993
2)[美] ANDREW SCHULMAN 著:<<UNAUTHORIZED WINDOWS 95>>,电子工业出版社,1995
3)[美] RALF BROWN 著:<<PC INTERRUPTS>>,电子工业出版社,1993
4)周明德 著:<<保护方式下的 80386 编程>>,清华大学出版社,1993

TROUBLE SHOOTING:
     1.INT 10 处理程序似乎不对,似乎 MOV EBP,ESP 不在那里.
     2.INT 15H 87H 88H 扩展内存拷贝程序工作正常,但地址拷错了.使用 RAMDRIVE 时发现数据被冲毁.
     3.HLT 指令仿真不正常.
     4.GP 故障时用户程序退出正常,但 V27 还在内存中,应将 V27 的两块内存释放(同 TASK PLUS 一样,没有关文件).不要使用修改 INT22H 来退出用户程序和 V27,太麻烦.
     5.仿真 BIOS 向上滚屏不对,向下正常.

作者后记:
    386 保护模式编程是一项复杂繁重的工作, 设计 VVDOS 的目的就是力求自己在这方面有所进步。
我的最初灵感是在看完 Inside Windows NT (一本好书,只能看第一版)后,有了一个强烈的编写保护系统的愿望。在接下来的过程中,我进入了保护方式,编写了有关的异常处理程序,也写出了一个小小的保护模式程序载入器。但结果是什么呢?没有程序可以载入,我不得不面对编写编译器(第一次遇到Watcom C 是97年)。一个月后,编译器只实现了错误处理和词法分析。最后也就做罢。
    收获还是有的,我用最少代码写出了进入保护模式、清屏、退出保护模式的例子(在《从8086到80386》一书中写了三、四百行):


mov ax,b800h
push ax
pop es
mov eax,cr0
or al,1
mov cr0,eax
mov di,0
mov cx,1000
mov ax,7
rep stosw
mov eax,cr0
and al,feh
mov cr0,eax
…(好久不写汇编代码了,可能有错,也没法调试,不好意思啦。)

    注意:这里既没有全局描述符表也没有局部描述符表。es 必须在进入保护模式前装入。
    另一个收获是即使在实模式下(当然包括保护模式),通过修改 IDT 的基地址(不要修改长度),也可以迁移中断向量表到指定内存地址,这就叫做中断向量表搬迁技术吧。
一个程序员说过:“欢迎来到保护模式,这里的一切都是挂羊头卖狗肉。”。大家可以从虚拟内存、保护模式中断处理等得到体会。
    我自己对于发表文章,比较谨慎,以免制造垃圾太多。今天回过头来,这篇文章虽然很旧,还可以略看一看(想自己编写OS的人则必须看)。于是又整理出来放在这里,借光借光。
代码在后面,大家可以学习引用(环境必须是Dos3.31-6.22、没有Emm386,TASM 2.5-3.0)(请注意:论文和代码是有分别的,我们的老祖宗一直在教导言行一致,但总不能一致,宋朝又有一些人瞎折腾,也是想要解决言行一致的问题,但到现在,还是不能一致。我从十年前就希望自己眼手一样高度,直到现在还是有区别。95年那时正年轻,眼很高手很低,大家见谅)。

抱歉!评论已关闭.