|
|
要成为一个真正的BIOS工程师,最基本的必需熟悉整个80X86体系,PCI规范,ACPI规范,如果对PCIE,VESA,SATA,USB,ISA,PNP,AGP等均全面深入,那你应该是一个真正的高手了. $ H& Z! Q0 l2 W. S2 {4 e
今天开始, 本人班门弄斧, 不定期写一些基本的计算机体系方面的知识, 希望对刚刚踏入BIOS这一领域的同行有所帮助! 以下所有文字除特殊说明外, 所有的均属本人原创!
. S) C% d5 {1 D# Z
9 \1 ~& s1 o' {# k- r
9 `% F& Y3 M. t3 nBIOS入门之一: 8086模式2 u" f! ?' S* R$ r" `, Y
; I) R4 v7 H9 N2 x
我们目前几乎所有的计算机使用的都是 Intel X86 兼容的CPU体系, 至少你眼前现用的电脑就是, (当然,也有其它的, 如Apple使用的是另外的架构 , Intel最成功的CPU是8086的推出, 拥有20条地址线, 最大寻址为1MB, 之后再推出的一系列 186/286/386/486...为了兼容已经成形的计算机革命, 均向下支持所有的8086程序和 OS, 当然真成功的是80386的推出, 提供32位4GB的空间寻址,基于段方式的保护模式管理和先进的虚拟页管理, 之后再推出的都是基于80386架构, 只是增加了新的一些多媒体指令, 如MMX, SSE等, 当然, 其中, 不得不提到AMD所做的贡献... 越说越远了, 回到主题上来, 先了解一下8086的东西, 80386以后的东西会在下一篇文章中写.
, N. ]7 n$ ?0 X/ F" D + k O/ Y8 O/ B' H4 R
先说一下目前的CPU的工作模式:
, w0 P! V6 n- q( r V9 x5 k 1. Real Mode (实模式): DOS系统就是在这个模式下运行的,也就是8086兼容模式,所有的操作与8086 CPU完全一样.
; E4 m2 s6 L* B% t; J6 y 2. Protect Mode (保护模式):Windows系统就是在这个模式下运行的.等下一篇....$ W8 r p( {# i2 c: v$ t
3. VM86 Mode (虚拟86模式):RealMode和ProectMode不能同时运行的,因此,在Porect下,可以在这个模式下运行基于16位的8086程序, 下下一篇会讲到....
' |( ~/ R7 b7 u I. f& d5 \ 3. SMM Mode (系统管理模式): 提供给 BIOS 最底层的 CPU 的一个管理模式,再等下一篇..." F V! _! [2 J4 b k
4. Long Mode : 64位 CPU的保护模式, 再再下一篇...7 h. R$ t6 ]5 G/ Y2 K! f
+ V0 u2 {; z. f0 ]; S 今天说说Real Mode 8086 寻址模式:+ L% D7 f9 [" n
4 e v- C2 _5 V& k! a, Q' | 8086全是16位工作模式,为了访问整个1M空间,使用了<段:偏移>的方式来实现,目标地址=(段<<4)+偏移 ! a8 v; ~+ @. `6 H. r m% w5 o/ U
段寄存器: CS, DS, ES, SS, FS, GS 来定位以16Byte为单位的基地址,* u$ l0 `' ]" J# |7 ~
寄存器: AX, BX, CX, DX, SI, DI, BP, SP 则作为偏移.
H- a! W. \3 ^, z7 T5 @# e
4 Q. a3 |8 b, t" v 当CPU上电后,CS=0F000h, IP=0FFF0h, 指向 0FFFF0h 也就是1MB - 10h Byte的地方, 最多只有16字节的空间,放不了什么代码了,因此,这里一般放的是一条 JMP 指令,
6 c8 U1 k7 ]' h$ A' ~) N 试试在DOS下运行Debug:
# U9 ?* U5 w$ `; c-u F000:FFF0- E2 W/ \' E+ N; P K5 R/ X& m% A
F000:FFF0 EA5BE000F0 JMP F000:E05B+ B( s& I* h0 ^% O
F000:FFF5 3130 XOR [BX+SI],SI
$ _* c Q }: d5 MF000:FFF7 2F DAS6 _) S t- W* h0 i$ b
F000:FFF8 3130 XOR [BX+SI],SI" h' V4 Q4 u6 R6 T& L: n
F000:FFFA 2F DAS
) D$ I2 R4 z+ \F000:FFFB 3037 XOR [BX],DH
: k8 p5 Q! x0 o$ u+ T# VF000:FFFD 00FC ADD AH,BH
9 X, C3 X5 V6 Y4 M5 E4 AF000:FFFF 57 PUSH DI
4 w9 H- {* W8 m; @3 {0 k" V* {' D9 `: z2 O3 }
对于Award BIOS来说, F000:FFF0的指令一定是 JMP F000:E05B ,其它的厂商BIOS可能不是E05B.+ U# ]' N. |, o$ c* E) A
% l. l- ~: F; \( {" }- n( K
试一下,
7 ?" ^" q# }" U& c @2 G. n7 N. u-G=F000:FFF0
0 I# ~$ ^6 k! d( Q看看会什么样 / x" e, p; Y' ?* u- T' h; k1 |
% f7 x9 N5 l5 |/ B0 u
以上的操作在真正的的DOS下运行,不要在Windows下的 DOS Command 下!!!那个是VM86 Mode..
+ }8 L0 Z& }: R6 n( G6 p' r' b T* P2 D- R$ r0 u
我们可以以多种方式来对8086寻址, 下面列出的是常的:
. ?& q& F; b7 H. ~
) ^1 P9 H+ x0 I/ [, F5 y! M; K MOV ES:[SI], AX ;把AX的内容复制到 (ES<<4)+SI 地址所指向的内存1 T5 c) A5 l1 x P
MOV DS:[SI+1234], AX ;把AX的内容复制到 (DS<<4)+SI+1234 地址所指向的内存
! a: I' G; a8 }& ?: X MOV [SI], AX ;把AX的内容复制到 (DS<<4)+SI+1234 地址所指向的内存, $ ?, y$ B- s, X( C0 M
;通常,没有指定段,则 SI 使用 DS, DI 使用 ES, SP/BP使用SS) \) N/ U# V" Y5 a6 H5 E
MOV CS:[1234] ;把AX的内容复制到 (CS<<4)+1234 地址所指向的内存
2 P f# u w- ~) I* e
1 M" q" t: P( F# U2 v9 K* A1 j JMP 1234h ;跳转到 CS:1234的地方, 之后 IP = 1234h, CS不变& B j D; p( r+ y& C" H1 B
JMP 5678:1234 ;跳转到 5678:1234的地方, 之后 IP = 1234h, CS = 5678
$ F# [2 X( L. N4 F. c JMP BX ;跳转到 BX 指向的地方, 之后 IP = BX, CS不变
, v- E1 M, g% K7 s2 } JMP word ptr [BX] ;跳转到 DS:[BX]的内容指向的地方, 之后 IP=DS:[BX], CS不变
& J$ s0 w4 {8 P) B: c JMP dword ptr [BX] ;跳转到 DS:[BX]的内容指向的地方, 之后 IP=DS:[BX], CS=DS:[BX+2]# `% R! d) [3 a! V' i! E# Q: L3 `; E% L0 `
. H6 s1 s0 v9 Q+ Y( C
知道了什么寻址,我们来试试, 同样,运行Debug,
# R8 g q3 W' g! ~8 I=F B800:0 1000 55 17 ;填充 B800:0, 填1000h个字节, 使用55, 17, 你别告诉我debug使用不熟.
/ s9 t" l7 e3 W7 d# Y
' W. ]4 {& y) ^& L8 o看看什么现象再说./ c0 }* s, X* K, u0 L
! Q) P) x9 k) r Z: t. ?
现在你应该知道了 DOS 1M 的空间, 实际上有些区域是已经固定给一些硬件使用的了,
1 C8 \4 w& U5 [4 A! g& Z$ a; N8 a 经常提到的640K基本内存, 就是00000-9FFFF, 这部分是可用内存, A0000-BFFFF 给VGA显存使用, 而你刚才填) {( R2 n' z+ E# U5 U3 o) M8 H
B8000则是文本缓冲区, 向该地址写任何东西, 均会立即反应在显示器上(记得是在文本模式下), C0000-CFFFF! z" u! U: P3 F8 j' k. G
一般是给VGA BIOS占用, D0000-DFFFF给一些其它ROM使用, E0000-FFFFF一般给BIOS占用, 提供BIOS相关的服务
5 G, u9 T2 R* i3 I5 M m6 c: t0 z- k
% ]7 n* p+ m8 }6 X 在基本内存中, 0-3FF共256*4, 存放INT0~FF的入口地址, 400-4FF存放BIOS的数据, 看一下吧!
! O; ~( X2 L% Q3 r -D 0:400
9 U4 E' V5 s& \: h0000:0400 F8 03 F8 02 E8 03 E8 02-BC 03 78 03 78 02 80 9F ..........x.x...
0 A; ^. q' x2 L! x+ F' H. |; b0000:0410 23 C8 00 80 02 00 00 00-00 00 24 00 24 00 30 0B #.........$.$.0.5 t9 l; o0 s9 R
0000:0420 30 0B 0D 1C 20 39 30 0B-3A 27 34 05 30 0B 0D 1C 0... 90.:'4.0...1 v; i7 h$ \3 f/ _8 {3 {2 t
0000:0430 44 20 20 39 34 05 08 0E-30 0B 3A 27 34 05 00 00 D 94...0.:'4...
A# p# v8 X: e2 `- w0000:0440 E0 00 C3 00 00 00 00 00-4D 03 50 00 40 1F 00 00 ........M.P.@...
1 K- o; C( I) B8 E# {/ J& X: ], Y' U0000:0450 00 31 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .1..............
5 e# L* [2 q7 O3 M+ A# C0000:0460 07 06 00 D4 03 29 30 F6-03 00 F0 FF D1 C4 0C 00 .....)0.........6 m {* {3 i" @3 a# [1 t0 I" o
0000:0470 00 00 00 00 00 00 00 00-14 14 14 14 01 01 01 01 ................3 w; h- o! m! v
/ Q% E0 \4 \9 w1 b6 j5 N 第1,2,3,4个字:03F8, 02F8, 03E8, 02E8, 原来是COM1/COM2/COM3/COM4的地址..
4 M5 q% j( A9 Z% x .... |
|