|
|
要成为一个真正的BIOS工程师,最基本的必需熟悉整个80X86体系,PCI规范,ACPI规范,如果对PCIE,VESA,SATA,USB,ISA,PNP,AGP等均全面深入,那你应该是一个真正的高手了.
. }: _9 O- g6 X1 m今天开始, 本人班门弄斧, 不定期写一些基本的计算机体系方面的知识, 希望对刚刚踏入BIOS这一领域的同行有所帮助! 以下所有文字除特殊说明外, 所有的均属本人原创! " I9 K- u' X$ _$ d% e6 h9 d1 n3 q# A, E
5 |, P: C% y7 l. a* V( V
( E' [1 F. F( Z* @+ J- S$ P tBIOS入门之一: 8086模式( C$ s( d4 V7 @' y2 E$ ~9 x9 ]! d d
: S8 P$ K' R9 C. Q; ?% o5 Z
我们目前几乎所有的计算机使用的都是 Intel X86 兼容的CPU体系, 至少你眼前现用的电脑就是, (当然,也有其它的, 如Apple使用的是另外的架构 , Intel最成功的CPU是8086的推出, 拥有20条地址线, 最大寻址为1MB, 之后再推出的一系列 186/286/386/486...为了兼容已经成形的计算机革命, 均向下支持所有的8086程序和 OS, 当然真成功的是80386的推出, 提供32位4GB的空间寻址,基于段方式的保护模式管理和先进的虚拟页管理, 之后再推出的都是基于80386架构, 只是增加了新的一些多媒体指令, 如MMX, SSE等, 当然, 其中, 不得不提到AMD所做的贡献... 越说越远了, 回到主题上来, 先了解一下8086的东西, 80386以后的东西会在下一篇文章中写.
0 m. Q7 S1 H4 a- R n& {, C3 Y( _
9 T+ ~% q/ m: z0 r 先说一下目前的CPU的工作模式:! t" R% D7 B' i
1. Real Mode (实模式): DOS系统就是在这个模式下运行的,也就是8086兼容模式,所有的操作与8086 CPU完全一样.% q M6 o& R; {0 A
2. Protect Mode (保护模式):Windows系统就是在这个模式下运行的.等下一篇....
% U& s U" z& B! p6 V4 F 3. VM86 Mode (虚拟86模式):RealMode和ProectMode不能同时运行的,因此,在Porect下,可以在这个模式下运行基于16位的8086程序, 下下一篇会讲到..... r- Z3 ~5 t& t$ M2 K/ a
3. SMM Mode (系统管理模式): 提供给 BIOS 最底层的 CPU 的一个管理模式,再等下一篇...; E7 c3 Z; C( O, w* N' P* K7 \
4. Long Mode : 64位 CPU的保护模式, 再再下一篇...
8 u; C& Q; |. b8 p & N9 i; p2 T5 _1 v7 d& ?0 i
今天说说Real Mode 8086 寻址模式:3 B9 o( \' F: m6 a
. ]0 o' N0 ^+ W/ U/ c+ ]
8086全是16位工作模式,为了访问整个1M空间,使用了<段:偏移>的方式来实现,目标地址=(段<<4)+偏移
& F5 P/ @! m, y6 v% a7 I5 G& e2 a 段寄存器: CS, DS, ES, SS, FS, GS 来定位以16Byte为单位的基地址,0 s3 p6 M' @8 r* Z. \2 F, |
寄存器: AX, BX, CX, DX, SI, DI, BP, SP 则作为偏移.
* ?, _! U$ }- _( u# H: h
: G6 \& W# y H/ q3 x3 u3 [% Z 当CPU上电后,CS=0F000h, IP=0FFF0h, 指向 0FFFF0h 也就是1MB - 10h Byte的地方, 最多只有16字节的空间,放不了什么代码了,因此,这里一般放的是一条 JMP 指令,! C6 B& u5 z7 z
试试在DOS下运行Debug:4 h+ A. E O4 D* p* ]* P0 i0 I
-u F000:FFF0
/ a1 P: ]6 b1 p6 q# |9 SF000:FFF0 EA5BE000F0 JMP F000:E05B
! |+ K9 c0 C% dF000:FFF5 3130 XOR [BX+SI],SI" |9 ~+ ^0 |$ O% S8 V
F000:FFF7 2F DAS
+ c6 D. J& A1 d. Q9 S2 t( ]F000:FFF8 3130 XOR [BX+SI],SI% i6 q1 E! ~5 u: O/ O
F000:FFFA 2F DAS
" `/ ?6 m. D- ~, |2 |) S# m* KF000:FFFB 3037 XOR [BX],DH c" C* m, v# v2 r# L
F000:FFFD 00FC ADD AH,BH
: u3 \8 C2 o/ X$ v' |4 [F000:FFFF 57 PUSH DI/ `5 M: V! x" z( B& ~' K' c2 Q
; y8 o2 n" Y7 J2 r4 V& U
对于Award BIOS来说, F000:FFF0的指令一定是 JMP F000:E05B ,其它的厂商BIOS可能不是E05B.) B9 ?6 X0 o& ?' C/ x6 H
! n7 Y6 N# I; v9 V+ v6 R6 T
试一下,0 @( S9 J( x& P' ]7 o: x7 w; ?, s
-G=F000:FFF0. N- W! s4 Q9 @2 M
看看会什么样 3 M3 g7 k8 {( l- ^
8 h3 l* J; S2 B以上的操作在真正的的DOS下运行,不要在Windows下的 DOS Command 下!!!那个是VM86 Mode..
; t+ n: j9 G- L
4 T. n) \; c9 P/ Z" _ 我们可以以多种方式来对8086寻址, 下面列出的是常的:5 y( _5 v: P- V/ p+ S) F* I
; g( g- `8 V4 x* R: O
MOV ES:[SI], AX ;把AX的内容复制到 (ES<<4)+SI 地址所指向的内存
( P# d2 P+ `2 o2 ~/ O; K: N9 c" s MOV DS:[SI+1234], AX ;把AX的内容复制到 (DS<<4)+SI+1234 地址所指向的内存
, ^. f! k7 x* K: G0 Z, j: t( H% B7 B MOV [SI], AX ;把AX的内容复制到 (DS<<4)+SI+1234 地址所指向的内存,
" _# F# T* E& j3 u0 z ;通常,没有指定段,则 SI 使用 DS, DI 使用 ES, SP/BP使用SS
- v o4 ]: w% ~# a# X: o6 K5 @ MOV CS:[1234] ;把AX的内容复制到 (CS<<4)+1234 地址所指向的内存7 z) U- O- g) L
8 l: z3 W" J) c# ?; K JMP 1234h ;跳转到 CS:1234的地方, 之后 IP = 1234h, CS不变
% o0 @5 f0 r% K' E JMP 5678:1234 ;跳转到 5678:1234的地方, 之后 IP = 1234h, CS = 5678% y8 r7 ^6 ~* k. O7 |
JMP BX ;跳转到 BX 指向的地方, 之后 IP = BX, CS不变
1 N( L9 ?, v& _# D$ Q- S JMP word ptr [BX] ;跳转到 DS:[BX]的内容指向的地方, 之后 IP=DS:[BX], CS不变+ Q I9 A$ U3 q! T
JMP dword ptr [BX] ;跳转到 DS:[BX]的内容指向的地方, 之后 IP=DS:[BX], CS=DS:[BX+2]
* Y: q+ ~" x/ M2 v5 B 1 {& D) Z. s3 n+ w
知道了什么寻址,我们来试试, 同样,运行Debug,
& f( B" y/ y: n6 Y; s. ~=F B800:0 1000 55 17 ;填充 B800:0, 填1000h个字节, 使用55, 17, 你别告诉我debug使用不熟.
+ O/ u2 S) W! ]- E% @# c9 M# C7 {1 ^) F4 d! A g1 q- n
看看什么现象再说.- x! H5 G; G! `# @! C& b7 v
- j8 f# \" i; i. Z4 p% G5 S 现在你应该知道了 DOS 1M 的空间, 实际上有些区域是已经固定给一些硬件使用的了,
' v7 U/ K' e/ d# x 经常提到的640K基本内存, 就是00000-9FFFF, 这部分是可用内存, A0000-BFFFF 给VGA显存使用, 而你刚才填
2 Y4 U$ B' o) A6 u B8000则是文本缓冲区, 向该地址写任何东西, 均会立即反应在显示器上(记得是在文本模式下), C0000-CFFFF
- @5 k& X c7 w& ]4 b3 S" V, \* s) Q 一般是给VGA BIOS占用, D0000-DFFFF给一些其它ROM使用, E0000-FFFFF一般给BIOS占用, 提供BIOS相关的服务
6 Z) \/ c% L/ O* u7 @! ~
+ f7 N* w! y6 r 在基本内存中, 0-3FF共256*4, 存放INT0~FF的入口地址, 400-4FF存放BIOS的数据, 看一下吧!6 o- p6 H$ {! z2 M9 h' b C3 p
-D 0:400% Q0 p7 @- l6 o& b- ]5 X) e
0000:0400 F8 03 F8 02 E8 03 E8 02-BC 03 78 03 78 02 80 9F ..........x.x...
+ j, X8 ?6 l5 C2 S! K7 L. j( o0000:0410 23 C8 00 80 02 00 00 00-00 00 24 00 24 00 30 0B #.........$.$.0./ ^- V7 \* O% x
0000:0420 30 0B 0D 1C 20 39 30 0B-3A 27 34 05 30 0B 0D 1C 0... 90.:'4.0.... O, j e+ T! F, f+ ^
0000:0430 44 20 20 39 34 05 08 0E-30 0B 3A 27 34 05 00 00 D 94...0.:'4...
+ ^7 ?7 Y9 N5 F! j+ C/ H! I$ b0000:0440 E0 00 C3 00 00 00 00 00-4D 03 50 00 40 1F 00 00 ........M.P.@...) P g4 ~) S! J8 O" W5 W
0000:0450 00 31 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .1..............5 Z' U/ p, x* g# u* P
0000:0460 07 06 00 D4 03 29 30 F6-03 00 F0 FF D1 C4 0C 00 .....)0.........& }# X5 ]7 ^& E$ G5 S
0000:0470 00 00 00 00 00 00 00 00-14 14 14 14 01 01 01 01 ................, _$ q. u( [' V5 f
5 h/ q! G+ ^. j- S7 ~: K
第1,2,3,4个字:03F8, 02F8, 03E8, 02E8, 原来是COM1/COM2/COM3/COM4的地址..
2 \7 f# G) d& ]3 I4 e .... |
|