实验9 保护模式编程基础

导读:
  新一篇: 实验10 硬盘DMA编程
   实验 9 保护模式编程基础
  在保护模式下,可寻址高达4GB(甚至更多)的物理地址空间;支持存储器分段管理机制和分页管理机制;支持多任务;支持4个特权级和配套的特权检查机制,区分不同级别的代码。操作系统(如Windows、Linux等)正是依赖于这些特性来实现虚拟内存、内核/用户模式、多任务等功能。
   9.1 虚拟机开发环境
  实模式与保护模式的切换,以及保护模式下的中断、DMA处理等程序必须在特权级0下执行,而Windows应用程序在特权级3环境中运行,只有系统内核和设备驱动程序才能运行在特权级0。因此,这些实验需要在DOS环境下进行。
  借助于虚拟机技术,可以在Windows环境下完成这些实验。图9-1就是在虚拟机中运行DOS操作系统和real2pro.exe的结果。
  
  
  图9-1 在虚拟机中完成保护模式实验
   1. 虚拟机
  虚拟机软件可在一台计算机(称为宿主机)上模拟出若干台计算机,模拟出的计算机(称为客户机)都有自己单独的硬件配置,可以安装单独的操作系统。例如,宿主计算机运行Windows操作系统,在上面运行虚拟机软件,虚拟出的计算机可以运行Linux操作系统。这2个操作系统各自独立运行,互不干扰。
  VirtualBox是德国InnoTek公司开发的虚拟机软件,可以运行在Windows和Linux上,客户机上可以安装Windows、DOS、Linux、OpenBSD等操作系统。除了VirtualBox软件以外,常用的虚拟机软件还有VMWare、Virtual PC等。
   2. 建立虚拟软驱
  在保护模式实验中,宿主机运行Windows,客户机运行DOS。DOS和Windows之间的共享采用虚拟软驱来完成。
  VFD是一个虚拟软驱软件。运行vfdwin.exe(在C:/asm/tools/vfd21目录下),如图9-2所示,按以下步骤在计算机上虚拟出一个软驱(B:):
  (1) 在“Driver”页中,按“Browse…”选择C:/asm/tools/vfd21/vfd.sys;
  (2) 按“Install”按钮安装驱动程序;
  (3) 按“Start”按钮启动驱动程序;
  (4) 在“Drive 0”页中,按“Change…”选择B:;
  (5) 按“Open”按钮,再按“Browse…”选择C:/asm/tools/vfd21/ floppyA.img;Disk Type选择为FILE。
  
  
  
  图9-2 建立虚拟软驱
  这样,计算机上就增加了一个虚拟软驱B:了。
   3. 创建 DOS 虚拟机
  安装VirtualBox软件,启动VirtualBox后,点击工具栏上的“新建”按钮。按以下步骤在计算机上创建一个虚拟机:
  (1) 如图9-3所示,虚拟机名称为“DOS”,在系统类型种选择“DOS”,按“下一步”;
  (2) 提示系统内存容量,缺省为32MB,直接按“下一步”;
  (3) 图9-4中,提示选择虚拟硬盘时,按“现有”按钮,出现图9-5所示对话框;
  (4) 在虚拟硬盘管理器中,按“注册”按钮,指定虚拟硬盘映像文件为C:/asm/tools/vbox/ HDD0.VDI,如图9-6所示。在图9-5的虚拟硬盘管理器,按“选择”按钮;
  (5) 一直按“下一步”按钮,直到“完成”为止。
  
  
  
  图9-3 设置虚拟机名称
  
  
  图9-4 选择虚拟硬盘
  
  
  图9-5 虚拟硬盘管理器
  
  
  图9-6 指定虚拟硬盘映像
  在图9-7的VirtualBox窗口左边选中DOS客户机,点击工具栏中的“设置”按钮,选择软驱,选中“加载软驱”,主机上的软驱设为“B:”。
  
  
  图9-7 VirtualBox主窗口界面
  
  
  图9-8 设置DOS虚拟机的软驱
  在VirtualBox窗口(图9-7)中选择DOS客户机,点击工具栏中的“启动”按钮,启动进入DOS界面。此时,DOS客户机显示为“A>”,这里驱动器A中的文件系统和宿主机B:中完全一致。可以在Windows中编辑修改程序、编译连接,如图9-1所示。
  
  
  图9-9 在Windows中编译、连接real2pro.asm
  程序编译通过后,用鼠标左键点击DOS客户机窗口,在DOS客户机中执行real2pro.exe,结果如图9-1所示。
  程序出现错误时,可执行菜单“虚拟电脑”→“重启”,重新启动DOS客户机。
  需要切换到Windows环境时,按键盘右边的Ctrl键即可。
  要关闭DOS客户机,选择菜单“虚拟电脑”→“关闭”,再在对话框中选择“强制关机”。
   9.2 实模式与保护模式的切换
  程序中定义了两个缓冲区:Buffer和Buffer2,从实模式切换到保护模式,将Buffer中的全部64个字节复制到Buffer2中,再回到实模式下,将Buffer2中的内容显示出来。
  在程序的数据段DSEG中,定义了一个GDT,其中包括4个段描述符:空、代码段、数据段D、数据段E。VGDTR 占6个字节,用于存放GDTR的值。
  Buffer和Buffer2分别位于数据段DSEG和ESEG中。
  程序首先在实模式下执行,执行过程为:
  (1) 设置3个段描述符(代码段、数据段D、数据段E)的基地址,这些段描述符的其他字段(限长、属性等)已经在定义时进行了赋值。
  (2) 加载GDTR,使CPU在保护模式下能够访问GDT。
  (3) 在实模式时,A20门处于关闭状态。调用EnableA20宏将A20门打开,A20门打开时,CPU产生的A20地址有效,A20门关闭时,A20地址线总是为0。
  (4) 将CR0的第0位置1,跳转到保护模式的Virtual标号,进入保护模式下执行。
  在保护模式下,执行过程为:
  (1) 为DS、ES赋值。DS=0010H,SS=0018H,分别指向数据段DSEG和ESEG。
  (2) 将数据段DSEG的Buffer复制到ESEG的Buffer2。
  (3) 将CR0的第0位清0,跳转到实模式的Real标号,回到实模式下执行。
  在实模式下,显示出Buffer2的内容。
  程序清单: real2pro.asm(实模式与保护方式之间的切换)
  .386P
  存储段描述符结构类型定义
  Desc STRUC
  LimitL DW 0 ;段界限(BIT0-15)
  BaseL DW 0 ;段基地址(BIT0-15)
  BaseM DB 0 ;段基地址(BIT16-23)
  Attributes DB 0
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值