|
|
要成为一个真正的BIOS工程师,最基本的必需熟悉整个80X86体系,PCI规范,ACPI规范,如果对PCIE,VESA,SATA,USB,ISA,PNP,AGP等均全面深入,那你应该是一个真正的高手了.
% ]3 H8 m M; r2 g8 j/ q今天开始, 本人班门弄斧, 不定期写一些基本的计算机体系方面的知识, 希望对刚刚踏入BIOS这一领域的同行有所帮助! 以下所有文字除特殊说明外, 所有的均属本人原创!
6 e6 d2 z `3 N- V* ]8 @. n5 e8 m' P4 P2 a
o+ J- t2 I( }! D* JBIOS入门之一: 8086模式
% Q1 B f1 r) b6 p
/ ~( q- x$ \ d0 r* v1 F 我们目前几乎所有的计算机使用的都是 Intel X86 兼容的CPU体系, 至少你眼前现用的电脑就是, (当然,也有其它的, 如Apple使用的是另外的架构 , Intel最成功的CPU是8086的推出, 拥有20条地址线, 最大寻址为1MB, 之后再推出的一系列 186/286/386/486...为了兼容已经成形的计算机革命, 均向下支持所有的8086程序和 OS, 当然真成功的是80386的推出, 提供32位4GB的空间寻址,基于段方式的保护模式管理和先进的虚拟页管理, 之后再推出的都是基于80386架构, 只是增加了新的一些多媒体指令, 如MMX, SSE等, 当然, 其中, 不得不提到AMD所做的贡献... 越说越远了, 回到主题上来, 先了解一下8086的东西, 80386以后的东西会在下一篇文章中写.
) Y$ e. E. g/ K " O' X- z# ?6 r' h+ q
先说一下目前的CPU的工作模式:7 k& N; Q& j" ?& r0 L) o
1. Real Mode (实模式): DOS系统就是在这个模式下运行的,也就是8086兼容模式,所有的操作与8086 CPU完全一样.+ h) K5 h! |; g/ N
2. Protect Mode (保护模式):Windows系统就是在这个模式下运行的.等下一篇....
$ I( |. L3 D" J 3. VM86 Mode (虚拟86模式):RealMode和ProectMode不能同时运行的,因此,在Porect下,可以在这个模式下运行基于16位的8086程序, 下下一篇会讲到....
4 [7 q, d9 K$ K6 k/ }5 F2 ^. u2 n' o 3. SMM Mode (系统管理模式): 提供给 BIOS 最底层的 CPU 的一个管理模式,再等下一篇...7 W' p4 r0 h2 v! e7 D
4. Long Mode : 64位 CPU的保护模式, 再再下一篇...1 J* m' D4 c+ {5 Y, y
1 K# w! B- L, t: u 今天说说Real Mode 8086 寻址模式:2 w- ?4 `, I7 E6 z- P
7 R/ b9 x9 M4 l0 m/ K% l 8086全是16位工作模式,为了访问整个1M空间,使用了<段:偏移>的方式来实现,目标地址=(段<<4)+偏移 + s7 ]( m8 J! G7 T8 f V- Y' m# a
段寄存器: CS, DS, ES, SS, FS, GS 来定位以16Byte为单位的基地址,
+ F' j( U8 n9 C! w& f t- q2 o: e, ^ 寄存器: AX, BX, CX, DX, SI, DI, BP, SP 则作为偏移.5 H( b* H7 _# v7 q7 L
& e5 O9 x7 X) }9 B: R" W 当CPU上电后,CS=0F000h, IP=0FFF0h, 指向 0FFFF0h 也就是1MB - 10h Byte的地方, 最多只有16字节的空间,放不了什么代码了,因此,这里一般放的是一条 JMP 指令,4 g; g8 l2 T" C( K
试试在DOS下运行Debug:
' ~. \' G/ P) O7 ]-u F000:FFF0
3 V. c- Y# I* G- |8 dF000:FFF0 EA5BE000F0 JMP F000:E05B
% B3 V9 }! n8 l* ~F000:FFF5 3130 XOR [BX+SI],SI- c0 B: |2 Q* w* l4 ~
F000:FFF7 2F DAS
! P+ x3 L8 J9 p% }$ y, ZF000:FFF8 3130 XOR [BX+SI],SI; s& `$ Y" m0 ^/ r4 g4 [( q& C. [( ^
F000:FFFA 2F DAS
' h+ A& a8 E$ I, N8 S8 D0 V" Q6 P2 F$ ]$ FF000:FFFB 3037 XOR [BX],DH8 S0 u3 O" l r
F000:FFFD 00FC ADD AH,BH) U( G ?8 l' |1 ?. F
F000:FFFF 57 PUSH DI' r( F0 g, Y2 p3 T) K5 F
# ]! v. m9 n) \) J9 d4 |5 M# b) s# y对于Award BIOS来说, F000:FFF0的指令一定是 JMP F000:E05B ,其它的厂商BIOS可能不是E05B.
8 R) T' I" U# _: Z! ?
! g8 ~0 J/ s# k! B试一下,) T* s+ x5 f' [4 e7 Z/ d/ n3 d
-G=F000:FFF0; i+ {/ ~0 L3 q/ p
看看会什么样 3 ]8 {, |$ [: b
8 V$ \/ M) B- }以上的操作在真正的的DOS下运行,不要在Windows下的 DOS Command 下!!!那个是VM86 Mode.." n6 A$ n0 B& |3 L
' \/ I5 h' n: }% u7 ~, @) V 我们可以以多种方式来对8086寻址, 下面列出的是常的:) p, W; U2 U& d0 l9 g) C5 N
! i3 m( a/ y0 U% d. P/ G5 y& F, D
MOV ES:[SI], AX ;把AX的内容复制到 (ES<<4)+SI 地址所指向的内存
1 `$ ~& n, ?2 P/ r& l& U2 N& }* X MOV DS:[SI+1234], AX ;把AX的内容复制到 (DS<<4)+SI+1234 地址所指向的内存, M8 X8 H* }! X! N# H0 o" t
MOV [SI], AX ;把AX的内容复制到 (DS<<4)+SI+1234 地址所指向的内存, 6 o* g: C+ H: V$ h
;通常,没有指定段,则 SI 使用 DS, DI 使用 ES, SP/BP使用SS
; ? Y- @" g, ]. E9 Y, o MOV CS:[1234] ;把AX的内容复制到 (CS<<4)+1234 地址所指向的内存
0 m/ B5 _3 }' y& ]
, }: y' B1 H- |' z7 e JMP 1234h ;跳转到 CS:1234的地方, 之后 IP = 1234h, CS不变
" p* _" k4 K9 O9 w6 t# J3 x JMP 5678:1234 ;跳转到 5678:1234的地方, 之后 IP = 1234h, CS = 5678
1 h1 A( ~- X* w JMP BX ;跳转到 BX 指向的地方, 之后 IP = BX, CS不变! K/ n: x+ o% o. h
JMP word ptr [BX] ;跳转到 DS:[BX]的内容指向的地方, 之后 IP=DS:[BX], CS不变
/ W3 ^. k& V9 R! I" U JMP dword ptr [BX] ;跳转到 DS:[BX]的内容指向的地方, 之后 IP=DS:[BX], CS=DS:[BX+2]( M8 a& l3 n8 ?5 e, @# B u
) J! V$ \3 d& f; }$ t7 Q知道了什么寻址,我们来试试, 同样,运行Debug, 8 K9 n8 D; R0 L' A4 \7 Q
=F B800:0 1000 55 17 ;填充 B800:0, 填1000h个字节, 使用55, 17, 你别告诉我debug使用不熟.
! ]( d E* W( Q/ N- t1 B6 f! W. x+ p/ h; {; L. @* V) U6 \
看看什么现象再说.
0 f- K8 n5 B+ S1 n- p
- v2 `3 h5 {. L+ g2 ^ j% ^ 现在你应该知道了 DOS 1M 的空间, 实际上有些区域是已经固定给一些硬件使用的了,
8 I) v1 V: \0 c9 S 经常提到的640K基本内存, 就是00000-9FFFF, 这部分是可用内存, A0000-BFFFF 给VGA显存使用, 而你刚才填# }: D, j$ @! Y+ z" A% B- `1 w
B8000则是文本缓冲区, 向该地址写任何东西, 均会立即反应在显示器上(记得是在文本模式下), C0000-CFFFF: |, G# ^! C& i- n. T5 C# p7 V
一般是给VGA BIOS占用, D0000-DFFFF给一些其它ROM使用, E0000-FFFFF一般给BIOS占用, 提供BIOS相关的服务, E4 ?* Q& U2 b: @$ L% E) i
3 Z4 |/ I7 q- a9 c
在基本内存中, 0-3FF共256*4, 存放INT0~FF的入口地址, 400-4FF存放BIOS的数据, 看一下吧!; p' \3 ]( X( L1 _' l$ g1 z
-D 0:400
3 z$ V1 i. O# c* p3 o- b" _0000:0400 F8 03 F8 02 E8 03 E8 02-BC 03 78 03 78 02 80 9F ..........x.x...
# p# o0 K. w7 R3 p+ A' ~$ d0000:0410 23 C8 00 80 02 00 00 00-00 00 24 00 24 00 30 0B #.........$.$.0.
# |" z/ C7 w) ~' ~0000:0420 30 0B 0D 1C 20 39 30 0B-3A 27 34 05 30 0B 0D 1C 0... 90.:'4.0...' ?( C# q* D! B2 l8 ]
0000:0430 44 20 20 39 34 05 08 0E-30 0B 3A 27 34 05 00 00 D 94...0.:'4...
1 i5 X% g- p) J, ^7 I* T5 I0000:0440 E0 00 C3 00 00 00 00 00-4D 03 50 00 40 1F 00 00 ........M.P.@...
6 ]4 T) ^+ l+ O' B/ b% H, a/ K6 v6 G0000:0450 00 31 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .1..............
- P3 h( n$ H# y* F. M. x0000:0460 07 06 00 D4 03 29 30 F6-03 00 F0 FF D1 C4 0C 00 .....)0.........
( j0 M2 z; _, w8 o0000:0470 00 00 00 00 00 00 00 00-14 14 14 14 01 01 01 01 ................# g" l7 u: G b8 f* Z, [9 J
' [- W, G8 Q1 t2 S. f- T& f" P
第1,2,3,4个字:03F8, 02F8, 03E8, 02E8, 原来是COM1/COM2/COM3/COM4的地址..
6 R$ \6 c" l' X5 m8 u9 R .... |
|