|
|
要成为一个真正的BIOS工程师,最基本的必需熟悉整个80X86体系,PCI规范,ACPI规范,如果对PCIE,VESA,SATA,USB,ISA,PNP,AGP等均全面深入,那你应该是一个真正的高手了.
7 u7 R! S/ Y4 L' _. R今天开始, 本人班门弄斧, 不定期写一些基本的计算机体系方面的知识, 希望对刚刚踏入BIOS这一领域的同行有所帮助! 以下所有文字除特殊说明外, 所有的均属本人原创! ' V+ o$ n4 e* y' g: m0 h7 ]7 o
6 G, P2 s/ x H) u9 ~* b& F
( x/ C& i" G h; ~% y, t
BIOS入门之一: 8086模式3 @: C# s) w2 D u$ o
0 h' ^2 g7 `' q% L 我们目前几乎所有的计算机使用的都是 Intel X86 兼容的CPU体系, 至少你眼前现用的电脑就是, (当然,也有其它的, 如Apple使用的是另外的架构 , Intel最成功的CPU是8086的推出, 拥有20条地址线, 最大寻址为1MB, 之后再推出的一系列 186/286/386/486...为了兼容已经成形的计算机革命, 均向下支持所有的8086程序和 OS, 当然真成功的是80386的推出, 提供32位4GB的空间寻址,基于段方式的保护模式管理和先进的虚拟页管理, 之后再推出的都是基于80386架构, 只是增加了新的一些多媒体指令, 如MMX, SSE等, 当然, 其中, 不得不提到AMD所做的贡献... 越说越远了, 回到主题上来, 先了解一下8086的东西, 80386以后的东西会在下一篇文章中写.( K+ R. N1 \& @; o! T
& j! c! w# x- {. i$ Y: H) D0 j5 j3 B+ o
先说一下目前的CPU的工作模式:2 ]7 f! J m% I2 j9 B
1. Real Mode (实模式): DOS系统就是在这个模式下运行的,也就是8086兼容模式,所有的操作与8086 CPU完全一样.8 N3 `5 r; z. o, }3 E$ e
2. Protect Mode (保护模式):Windows系统就是在这个模式下运行的.等下一篇....2 o0 o' {$ ~* x
3. VM86 Mode (虚拟86模式):RealMode和ProectMode不能同时运行的,因此,在Porect下,可以在这个模式下运行基于16位的8086程序, 下下一篇会讲到....
+ b- p0 z+ _* p0 Y* l( k) L 3. SMM Mode (系统管理模式): 提供给 BIOS 最底层的 CPU 的一个管理模式,再等下一篇...
& Q7 n1 w) n4 X" I# _' N# r8 e 4. Long Mode : 64位 CPU的保护模式, 再再下一篇...
0 q6 A/ {( L9 b8 t1 l% h j 3 K0 B8 H6 s. I+ n+ h
今天说说Real Mode 8086 寻址模式:! J3 m8 V+ B" @6 C7 ^+ F' p" B; M
7 {' F2 K. w# X, e* Y2 @9 M% L9 i 8086全是16位工作模式,为了访问整个1M空间,使用了<段:偏移>的方式来实现,目标地址=(段<<4)+偏移 " i5 C0 A0 N7 K% k( ]2 ~3 K
段寄存器: CS, DS, ES, SS, FS, GS 来定位以16Byte为单位的基地址,
# V; e# v* {' S: e+ }& o: X 寄存器: AX, BX, CX, DX, SI, DI, BP, SP 则作为偏移.' R2 k0 ~! ^$ ~* l/ c6 {
+ j# g8 q/ }$ t% ?! K 当CPU上电后,CS=0F000h, IP=0FFF0h, 指向 0FFFF0h 也就是1MB - 10h Byte的地方, 最多只有16字节的空间,放不了什么代码了,因此,这里一般放的是一条 JMP 指令,1 R8 r, s# Z% `0 P# C) ?
试试在DOS下运行Debug:
& O* q0 Q/ z) M1 M+ l2 G-u F000:FFF0
" x9 s# ?2 G O( y) VF000:FFF0 EA5BE000F0 JMP F000:E05B
( J: \6 ` ?1 H/ \0 h0 MF000:FFF5 3130 XOR [BX+SI],SI
6 B' O$ X. w: EF000:FFF7 2F DAS
( x& D& K7 T/ UF000:FFF8 3130 XOR [BX+SI],SI8 h U' v6 `: t" g5 Z) Y
F000:FFFA 2F DAS
% ~. O/ ]" E5 C+ ?; |F000:FFFB 3037 XOR [BX],DH# ~! H* y0 R4 `) U$ H' c
F000:FFFD 00FC ADD AH,BH- v9 {8 ?: F# I: W( M- ?, \
F000:FFFF 57 PUSH DI
( K3 _+ W& T% J+ g5 K* ~
7 c2 F% }, T( _( E6 ~对于Award BIOS来说, F000:FFF0的指令一定是 JMP F000:E05B ,其它的厂商BIOS可能不是E05B.! A; m) N4 H8 E
2 A4 ?( v7 q) t试一下,( ]/ ]) ]5 g! L! U4 [! c
-G=F000:FFF0
& O4 d: [; @$ R5 q1 Q* {看看会什么样
0 i" ]4 L7 h( L
# W2 S) [( z% d: ]' @以上的操作在真正的的DOS下运行,不要在Windows下的 DOS Command 下!!!那个是VM86 Mode..
; b& x5 L C J' x4 }; {1 L1 C. \7 G& @& {" C; \
我们可以以多种方式来对8086寻址, 下面列出的是常的:
# {! F' q- f! R& Y0 [ * H8 ?4 L( G+ |, v
MOV ES:[SI], AX ;把AX的内容复制到 (ES<<4)+SI 地址所指向的内存" x! S4 l$ V' l9 n, f5 b0 Y" k: Y
MOV DS:[SI+1234], AX ;把AX的内容复制到 (DS<<4)+SI+1234 地址所指向的内存/ M2 L, g+ y7 ^7 t( R* l% ]( H$ F9 H
MOV [SI], AX ;把AX的内容复制到 (DS<<4)+SI+1234 地址所指向的内存, _3 p' r- ~8 o9 @" w6 Y. h
;通常,没有指定段,则 SI 使用 DS, DI 使用 ES, SP/BP使用SS
I% M$ d/ w4 i* P3 } MOV CS:[1234] ;把AX的内容复制到 (CS<<4)+1234 地址所指向的内存; y8 K$ }, ?2 A
0 t# J4 ^+ Q/ J$ @ JMP 1234h ;跳转到 CS:1234的地方, 之后 IP = 1234h, CS不变
f' w3 }/ d( N+ t JMP 5678:1234 ;跳转到 5678:1234的地方, 之后 IP = 1234h, CS = 5678& w C& N5 b6 e4 z3 |6 \: W
JMP BX ;跳转到 BX 指向的地方, 之后 IP = BX, CS不变% j1 U5 {2 a6 R5 I
JMP word ptr [BX] ;跳转到 DS:[BX]的内容指向的地方, 之后 IP=DS:[BX], CS不变
7 l# m! X; S5 e7 U7 d4 B JMP dword ptr [BX] ;跳转到 DS:[BX]的内容指向的地方, 之后 IP=DS:[BX], CS=DS:[BX+2]
+ V0 Q$ o8 ^* Q7 A6 `& ^ 1 w1 l3 _' F& K) h' L
知道了什么寻址,我们来试试, 同样,运行Debug,
" P5 ~9 N* W/ X) m9 t! E=F B800:0 1000 55 17 ;填充 B800:0, 填1000h个字节, 使用55, 17, 你别告诉我debug使用不熟.+ q R2 p7 L0 ?8 L
* k" s2 i9 @1 b- g: [" n6 w$ c看看什么现象再说.
! H9 [" x8 ?* R5 Y& _) Q3 l. Z$ F+ H- v3 ?; N0 F/ s
现在你应该知道了 DOS 1M 的空间, 实际上有些区域是已经固定给一些硬件使用的了, 6 Y2 O8 M) S" e
经常提到的640K基本内存, 就是00000-9FFFF, 这部分是可用内存, A0000-BFFFF 给VGA显存使用, 而你刚才填
; C* a6 T$ |; H' p1 y) a B8000则是文本缓冲区, 向该地址写任何东西, 均会立即反应在显示器上(记得是在文本模式下), C0000-CFFFF7 l2 d* V }* } E W* P
一般是给VGA BIOS占用, D0000-DFFFF给一些其它ROM使用, E0000-FFFFF一般给BIOS占用, 提供BIOS相关的服务- a$ O9 K. u) B
7 `# P# L' B1 b. t' @
在基本内存中, 0-3FF共256*4, 存放INT0~FF的入口地址, 400-4FF存放BIOS的数据, 看一下吧!
) K; L2 w9 N3 |3 z, h# p -D 0:400
4 f( g3 g' o% O# y0000:0400 F8 03 F8 02 E8 03 E8 02-BC 03 78 03 78 02 80 9F ..........x.x...4 R9 F$ b, ?- x( U; Q
0000:0410 23 C8 00 80 02 00 00 00-00 00 24 00 24 00 30 0B #.........$.$.0.
! G7 Y& R a; }* \/ k, m* o4 U# D2 j( m0000:0420 30 0B 0D 1C 20 39 30 0B-3A 27 34 05 30 0B 0D 1C 0... 90.:'4.0...1 g% n8 Z3 x8 K* r1 v
0000:0430 44 20 20 39 34 05 08 0E-30 0B 3A 27 34 05 00 00 D 94...0.:'4...
& }6 ]. v) c( v$ V0000:0440 E0 00 C3 00 00 00 00 00-4D 03 50 00 40 1F 00 00 ........M.P.@...
' N: l1 y/ L( m5 L0000:0450 00 31 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .1..............
1 J8 H8 t. J3 S3 t9 q: g9 {* K6 c0000:0460 07 06 00 D4 03 29 30 F6-03 00 F0 FF D1 C4 0C 00 .....)0.........
9 k: t; h# V7 M n u0000:0470 00 00 00 00 00 00 00 00-14 14 14 14 01 01 01 01 ................
7 _& A0 Y5 o0 P% H) I6 s& I! o8 E `5 K' z
第1,2,3,4个字:03F8, 02F8, 03E8, 02E8, 原来是COM1/COM2/COM3/COM4的地址..# E2 @& W5 Z) X$ a7 x7 O
.... |
|