【我所認知的BIOS】—>The Big Real Mode

【我所認知的BIOS—>The Big Real Mode

LightSeed     

2009-6-23

前面两篇,我们对实模式和保护模式做了比较详细地探讨,说了那么多其实都是为这篇文章服务的。因为在BIOS POST的过程中经常要用到1M以上的内存。但是BIOS本身的code却又都是在实模式中运行的。当然我们可以进入保护模式去访问内存,然后再切会实模式。如此反复我们是可以做到的,但是这样必定是比较麻烦的。有没有一种模式,我们在实模式下就可以直接访问到4G的内存呢?答案是肯定的。它的名字就叫做“Big Real Mode”。

1Big Real Mode原理

在上一篇文章的far jmp说明段中,我详细说明了一下CPU取段寄存器的值(在保护模式下应该叫做取段选择子的值),然后会改变相应的hidden部分(高速缓冲)。倘若再有程序显示地修改某个段寄存器(段选择子),那么也随之会更新相应的hidden部分。反之,CPU只会从高速缓冲中去取段值(段基地址)。所以当我们在保护模式下加载了FSGS两个段选择子后,只要不再显示修改FSGS,那么返回实模式后用FSesi的形式就访问到1M以上的内存了。其实原理还是用FS已经在保护模式下就加载好了的hidden部分(FS的段基地址)+esi=线性地址来访问的。

2、程序实例

;-------------这段代码从<80X86汇编语言程序设计教程>修改而来-------

;-------------只是一个比较简单的big real mode设置程序-------------

;-------------原理还是进入保护模式显示修改FSGS返回实模式--------

;-------------切忌,本程序编译连接后生成的exe文件在纯DOS--------

;-------------才能够执行LGDT这个命令,才能顺利进入保护模式--------

 

;-------------宏定义区域开始--------------------------------------

;16位偏移的段间直接转移指令的宏定义

JUMP macro selector,offsetv

   db 0eah                 ;操作码 jmp

   dw offsetv              ;16位偏移

   dw selector            ;段值(real mode)或者选择子(protect mode)

   endm

 

 

;字符显示宏指令的定义

ECHOCH macro ascii

   mov ah, 2          ;选功能号

   mov dl, ascii           ;填将要显示的ASCII码给DL

   int 21h                  ;调用DOS中断来显示ASCII

   endm

;-------------宏定义区域结束-------------------------------------

 

;-------------结构体定义区域开始---------------------------------

 

;存储段描述符结构类型的定义     

DESCRIPTOR     struc

   Limitl      dw 0   ;段界限(0~15)

   Basel       dw 0   ;段基地址(0~15)

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值