`
insertyou
  • 浏览: 867755 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

【我所認知的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)

Basem db 0 ;段基地址(16~23)

Attributes dw 0 ;段属性

Baseh db 0 ;段基地址(24~31)

DESCRIPTOR ENDS

;伪描述符结果类型的定义

PDESC struc

Limit dw 0 ;16界限

Base dd 0 ;基地址

PDESC ENDS

;-------------结构体定义区域结束---------------------------------

;常量定义

ATDW = 92H ;存在的可读写数据段属性值

ATCE = 98H ;存在的只执行代码段属性值

AT4G = 0CF92H ;

.386P

;--------------实模式下数据段定义开始----------------------------

dseg segment use16

align 16 ;16位段

GDT label byte ;全局描述符表GDT标志

DUMMY DESCRIPTOR <> ;空描述符

Seg4GSelector DESCRIPTOR <0FFFFH,0h,0h,AT4G,0>;FS&GS的描述符

Seg4G_sel = Seg4GSelector - GDT

GDTLEN = $ - GDT ;全局描述符表长度

;

VGDTR PDESC <GDTLEN-1,> ;①伪描述符

;

BUFFERLEN = 256 ;缓冲区字节长度

BUFFER DB BUFFERLEN DUP(0);缓冲区

dseg ends

;---------------实模式下数据段定义结束---------------------------

;---------------实模式下代码段定义开始---------------------------

cseg segment use16 ;16位段

assume cs:cseg,ds:dseg ;声明代码段和数据段

start:

mov ax,dseg

mov ds,ax ;初始化数据段

;准备要加载到GDTR的伪描述符

mov bx,16 ;乘数为16,是为了在实模式中计算地址

mul bx ;计算并设置GDT基地址

add ax,offset GDT ;此时AX中为GDT在实模式中的地址,界限在已定义时设置妥当

adc dx,0 ;如果有进位那么ADC加上

mov word ptr VGDTR.Base,ax ;填入GDT的实际地址的低word到伪描述符结构体中

mov word ptr VGDTR.Base+2,dx ;填入GDT的实际地址的高word到伪描述符结构体中

;加载GDTR

DB 66H ; execute a 32 bit LGDT

LGDT VGDTR ;命令不熟悉的话去查查

cli ;关中断

call EnableA20 ;打开地址线A20

;切换到保护模式

mov eax,cr0

or eax,1

mov cr0,eax

;清指令预取队列,并真正进入保护方式

jmp VIRTUAL ;整个过程没有改变CS的值,那么存在于hidden部分的值也没有被改变

;CPU取指令时不管在实模式还是保护模式下都取到的是实模式下的指令

;这个jmp在这里只是起个形式而已,实质上没有做任何动作

VIRTUAL:

;--------设置可以访问4G的段选择子-------

mov ax,Seg4G_sel ;准备要加载的段选择子(for 4G)

mov fs,ax ;显示修改fs,使得fs在保护模式下重新加载

mov gs,ax

;--------设置完成,只要不修改fsgs的值,那么返回real mode后,仍然可以用fsgs来访问1M以上4G以下的内存

;切回到实方式

mov eax,cr0

and eax,0fffffffeh

mov cr0,eax

;清指令预取队列,进入实方式

jmp REAL ;整个过程没有改变CS的值,那么存在于hidden部分的值也没有被改变

;CPU取指令时不管在实模式还是保护模式下都取到的是实模式下的指令

;这个jmp在这里只是起个形式而已,实质上没有做任何动作

REAL: ;现在又回到实方式

sti ;开中断

mov esi,208each ;源数据pointer

mov di,offset BUFFER

cld ;显示缓冲区内容

mov bp,BUFFERLEN/16 ;bp作为显示的行数的计数器

Nextline:

mov cx,16 ;每行只显示16*2个字符

NextCH:

mov al,fs:[esi]

inc esi

mov ds:[di],al

inc di ;存到buffer中去

push ax ;保存ax

shr al,4 ;准备显示高4bit中的值

call ToASCII ;al中的值转换成ASCII

ECHOCH al ;显示之

pop ax ;回复ax

call ToASCII

ECHOCH al

ECHOCH ' ' ;在字符于字符之间显示空格

loop NextCH ;处理下一个字符

ECHOCH 0dh

ECHOCH 0ah ;显示这两个ASCII回车+换行

dec bp ;显示完了否?

jnz Nextline ;bp = 0显示完了

mov ax,4c00h ;结束

int 21h

;---------------实模式下代码段定义结束--------------------------

;---------------子程式定义开始----------------------------------

;***************************************************************

;子程序名 HtoASC

; :十六进制数转换成 ASCII

;入口参数 al=8位二进制数

;出口参数 :无

; :无

;***************************************************************

toASCII proc

and al,0fh ;屏蔽al的高4 bits

cmp al,9 ;compare 9

jbe toASCII1 ;小于9,直接+30H

add al,37h ;否则,al+37H

ret

toASCII1:

add al,30h

ret

toASCII endp

;***************************************************************

;打开a20地址线

;***************************************************************

EnableA20 proc

push ax

in al,92h

or al,00000010b

out 92h,al

pop ax

ret

EnableA20 endp

;***************************************************************

;关闭a20地址线

;***************************************************************

DisableA20 proc

push ax

in al,92h

and al,11111101b

out 92h,al

pop ax

ret

DisableA20 endp

;---------------子程式定义结束----------------------------------

cseg ends

;---------------实模式下代码段定义结束--------------------------

end start ;指明程序入口

对于这个程序,我要说三点。

①这个程序其实我是把上一章的那个实例修改了一下,就成了可以用FSGS两个段寄存器(其实准确地说应该叫做段选择子)来访问高于1M的内存了。但是我做了很多的简化。比如说我没有在进入实模式前加载CS,只单单加载了GDT(因为GDT是保护模式下必须要用的)。然而,不改变CS是因为我们在保护模式下也还想继续执行实模式下的那三句指令

mov ax,Seg4G_sel

mov fs,ax

mov gs,ax

所以我只用了一个段跳跃(只是形式上看上去像是一个实际进入实模式的过程。其实连jmp这句都是可以省略的。留在这里只是为了让大家容易理解而已。)

②大家肯定都会发现,当我返回实模式的时候没有关A20。这是因为我要在实模式下通过FSGS去访问1M以上的空间,所以我必须要让A20一直都处于打开状态。

③于是我们也可以很清楚地看到,看到big real mode其实是介于实模式和保护模式之间的一种模式。如图1

1 实模式,big real mode,保护模式的比较

至此关于实模式和保护模式的切换,以及big real mode的探讨就暂时告一段落了。如果有兴趣的话,还可以把上面的程序精简。(笔者:比如说去掉其中的量个短jmp,因为他们在程序没有任何的存在的意义,笔者把他们注掉后编译连接仍然是可以访问到4G内存的。)好像csdn论坛里面就有人摆擂台用最短的语句来实现big real mode。不过如果有人和我一章懒的话,其实直接用上一章实例加上一个描述符,再在保护模式下加上两句话就可是实现big real mode了。

分享到:
评论

相关推荐

    bios程序设计参考资料

    Places the CPU in Big Real Mode (Flat Mode). This routine goes to FLAT protected mode and sets DS, ES with 4GB limit starting at physical address 00000000 and comes back to real mode with DS, ES ...

    【我所认知的BIOS】系列blog整理 1.23.2016.zip

    这几年来,蛮多小伙伴都给我发邮件拿PDF版本。几年前写的文章格式什么的实在是太粗糙。最近我把所有的文章都整理了一下。其实该想法已经早就有了,只是最近才开始空闲。现在我把所有的文章整理好了以后上传到了CSDN...

    IBM PC早期计算机BIOS及其汇编源代码

    This is a reconstruction of the IBM PC, PC XT, PC AT and PC XT 286 BIOS source code using scanning and transcription of the BIOS listings found in the IBM Technical Reference manuals. This ...

    【我所认知的 BIOS 】实模式&保护模式切换实例

    实模式&保护模式切换实例,对于想写实模式和保护模式切换时很有帮助的哦。。。

    bios中断详细手册

    INT 1A - System and Real Time Clock BIOS Services For more informations, see the following topics: INT 1A,0 Read system clock counter INT 1A,1 Set system clock counter INT 1A,2 Read real time ...

    The Art of Assembly Language Programming

    The 80x86 MOV Instruction&lt;br&gt;4.8 - Some Final Comments on the MOV Instructions&lt;br&gt;&lt;br&gt;4.9 Laboratory Exercises&lt;br&gt;4.9.1 The UCR Standard Library for 80x86 Assembly Language Programmers&lt;br&gt;4.9.2 ...

    Beyond.BIOS.Developing.with.the.Unified.Extensible.Firmware.Interface.3rd.EPUB

    Beyond BIOS 第三版 Beyond.BIOS.Developing.with.the.Unified.Extensible.Firmware.Interface.3rd.Editio

    系统之家整理 BIOS全攻略 bios手册

    跟我来升级BIOS——实战篇 跟我来升级BIOS——资源篇 更改能源之星的图标.htm 华硕主板 BIOS 的升级与管理 华碩 BIOS设定方式說明 免跳线主板CPU的BIOS设置 浅谈CMOS 如何使用CBLOGO 如何修改 BIOS 里...

    Lenovo Z400/Z500/P500 BIOS官方固件v1.21

    7. If the hot key not work without Fn key after flash BIOS, this SOP describes how to enable hot key mode Step 1: Press power button to boot, then press F2 key enter BIOS setup. Step 2: Select sub ...

    TI SYS/BIOS v6.34 Real-time Operating System User's Guide

    TI SYS_BIOS v6.34 Real-time Operating System User's Guide TI的实时操作系统用户手册。

    HP BIOS惠普BIOS

    HP BIOS惠普BIOS

    神舟MODE主板HA-LM3 LM4 修改版bios

    神舟MODE主板HA-LM3 LM4 修改版bios,添加了slic 2.4,能激活windows server 2016 DC oem

    bios模拟器BIOS练习器

    BIOS练习器是一款专门针对电脑初学者的BIOS设置学习软件,软件只有一个文件,下载解压后直接双击即可运行。软件全真模拟AWARD BIOS的设置界面,采用与AWARD BIOS设置完全相同的操作方法和快捷按键,任何对AWARD BIOS...

    支持SW7主板的SATA工具

    设置方法: 在BIOS内&gt;Advanced BIOS -&gt;ATA Control Mode: 默认情况下为"Enhanced"(ACHI为Enabled),即支持Robson卡,要装XP系统,必须手动把ATA Control Mode的选项改为"Compatible"(同时ACHI就变为Disabled)。...

    联想Y570BIOS2.06版本,最稳定的BIOS

    更新方法:请关闭无线硬件开关,在系统界面下以管理员身份运行IQY0206AX64.exe应用程序,按照提示操作,直到自动重启,电脑需要有电池和处于插电状态下,电池的作用是防突然停电的,如果电池坏了,可找我要跳过电池...

    华硕B365M-V魔改BIOS

    开机按del进BIOS,在高级(advanced)——pch-fw configuration——me operation mode下选择temporary disabled,会自动黑屏重启。 进入系统后,打开bios fpt文件夹,以管理员身份运行FLASH,出现命令行窗口自动刷...

    SYS-Bios Operating System User Guide

    TI SYS/BIOS v6.35 Real-time Operating System User's Guide

    DELL Optiplex 7050 BIOS 20181217

    This package contains the Dell system BIOS update for Dell OptiPlex 7050 Tower, OptiPlex 7050 Small Form Factor and OptiPlex 7050 Micro that runs the Windows operating system. BIOS is a firmware that ...

    BIOS Configuration for HP ProtectTools

    This package contains BIOS Configuration for HP ProtectTools for the supported desktop models and operating systems.

    经典BIOS手册 经典BIOS手册

    经典BIOS手册经典BIOS手册经典BIOS手册经典BIOS手册经典BIOS手册经典BIOS手册经典BIOS手册经典BIOS手册经典BIOS手册经典BIOS手册

Global site tag (gtag.js) - Google Analytics