|
|
要成为一个真正的BIOS工程师,最基本的必需熟悉整个80X86体系,PCI规范,ACPI规范,如果对PCIE,VESA,SATA,USB,ISA,PNP,AGP等均全面深入,那你应该是一个真正的高手了. & E5 d% p, ~' j
今天开始, 本人班门弄斧, 不定期写一些基本的计算机体系方面的知识, 希望对刚刚踏入BIOS这一领域的同行有所帮助! 以下所有文字除特殊说明外, 所有的均属本人原创!
0 H: Q0 p; F/ d; [: U7 { p9 A& l# A/ Y& h2 I! E
! L: n6 E3 U& C& H1 ]0 j% U, FBIOS入门之一: 8086模式
6 t7 Y h" `6 r7 J, q0 {: n" J U+ X; c3 W z9 x' x. r
我们目前几乎所有的计算机使用的都是 Intel X86 兼容的CPU体系, 至少你眼前现用的电脑就是, (当然,也有其它的, 如Apple使用的是另外的架构 , Intel最成功的CPU是8086的推出, 拥有20条地址线, 最大寻址为1MB, 之后再推出的一系列 186/286/386/486...为了兼容已经成形的计算机革命, 均向下支持所有的8086程序和 OS, 当然真成功的是80386的推出, 提供32位4GB的空间寻址,基于段方式的保护模式管理和先进的虚拟页管理, 之后再推出的都是基于80386架构, 只是增加了新的一些多媒体指令, 如MMX, SSE等, 当然, 其中, 不得不提到AMD所做的贡献... 越说越远了, 回到主题上来, 先了解一下8086的东西, 80386以后的东西会在下一篇文章中写.3 B+ _$ l! J2 T5 n* X" |
1 N( D+ R# B/ F* z* U9 C
先说一下目前的CPU的工作模式:
* \& Y9 z' W7 ^# j7 x9 Q 1. Real Mode (实模式): DOS系统就是在这个模式下运行的,也就是8086兼容模式,所有的操作与8086 CPU完全一样./ P9 k; S/ z/ n8 J" X* _! ]- |
2. Protect Mode (保护模式):Windows系统就是在这个模式下运行的.等下一篇....
# ?- D E7 {1 t8 j0 ?+ s' ] 3. VM86 Mode (虚拟86模式):RealMode和ProectMode不能同时运行的,因此,在Porect下,可以在这个模式下运行基于16位的8086程序, 下下一篇会讲到....
7 i( Q- q: S9 W4 v# m3 R& F 3. SMM Mode (系统管理模式): 提供给 BIOS 最底层的 CPU 的一个管理模式,再等下一篇...; L( R: x) p, ^7 g+ T q' |
4. Long Mode : 64位 CPU的保护模式, 再再下一篇...
k6 a+ y3 ~( G7 w' J5 s
; z# G, p( r: A* [+ q+ k% v 今天说说Real Mode 8086 寻址模式:3 u. O3 V# n# }' g( c$ d5 r; P
; y% x. S% K4 t# ]+ i( \ 8086全是16位工作模式,为了访问整个1M空间,使用了<段:偏移>的方式来实现,目标地址=(段<<4)+偏移 5 s& z$ v# H+ _* D+ N7 Z
段寄存器: CS, DS, ES, SS, FS, GS 来定位以16Byte为单位的基地址,
4 }% [# G/ y, e9 ] 寄存器: AX, BX, CX, DX, SI, DI, BP, SP 则作为偏移.
$ H" ~* j: R o2 r) S 4 H2 N! y; e! i
当CPU上电后,CS=0F000h, IP=0FFF0h, 指向 0FFFF0h 也就是1MB - 10h Byte的地方, 最多只有16字节的空间,放不了什么代码了,因此,这里一般放的是一条 JMP 指令,
$ z. R- m( p& M+ c1 g3 L 试试在DOS下运行Debug:
1 f, c$ U* V9 M' ~-u F000:FFF04 L( B3 r3 U" M! g' x+ J6 A
F000:FFF0 EA5BE000F0 JMP F000:E05B8 X: F+ P; U2 n) ~: l) H2 N- b
F000:FFF5 3130 XOR [BX+SI],SI
, Z) K1 l! e+ M% J. M6 X' AF000:FFF7 2F DAS
9 h2 W& L2 g$ Y9 y$ O9 K, bF000:FFF8 3130 XOR [BX+SI],SI1 @; o6 P- c2 u9 O& A: _& N
F000:FFFA 2F DAS+ Q& g- ^" [) i9 p! k4 n
F000:FFFB 3037 XOR [BX],DH
8 T; Z# N+ d; |! XF000:FFFD 00FC ADD AH,BH
9 }1 e5 Z5 M+ xF000:FFFF 57 PUSH DI$ `0 S6 }0 J! k, q9 m( t. [
& }" b$ c4 U" m) p8 B# y对于Award BIOS来说, F000:FFF0的指令一定是 JMP F000:E05B ,其它的厂商BIOS可能不是E05B.- X3 _ w9 d! s1 i9 H3 V, [
# m# S4 [; x4 a7 Y b
试一下," e' c0 _" \# M; O: a, ~
-G=F000:FFF0' Z0 Y7 e' b8 c, z
看看会什么样
9 `; ]5 n6 t& q( Z+ g, J$ D: b. A8 U" c+ Q& I' S& ?
以上的操作在真正的的DOS下运行,不要在Windows下的 DOS Command 下!!!那个是VM86 Mode..1 ]' h/ T }/ ~# l# G2 k6 s0 @
' \" r" W% `# f d5 f l 我们可以以多种方式来对8086寻址, 下面列出的是常的:
7 l$ [% u, t4 z9 Y9 V; n# G
8 N' ^4 X5 A) W; {+ x MOV ES:[SI], AX ;把AX的内容复制到 (ES<<4)+SI 地址所指向的内存+ o# S! j; Y) F# A
MOV DS:[SI+1234], AX ;把AX的内容复制到 (DS<<4)+SI+1234 地址所指向的内存0 g# N! x. K* a9 U5 W
MOV [SI], AX ;把AX的内容复制到 (DS<<4)+SI+1234 地址所指向的内存, 8 K) ^: s- D3 Q
;通常,没有指定段,则 SI 使用 DS, DI 使用 ES, SP/BP使用SS
. ?+ x8 a( G Z$ Q4 w# O) X MOV CS:[1234] ;把AX的内容复制到 (CS<<4)+1234 地址所指向的内存
! A5 S" `8 J# Y- W
4 f! A+ C' |! v( s) R7 W# C* [ JMP 1234h ;跳转到 CS:1234的地方, 之后 IP = 1234h, CS不变
& Q& n8 b1 a6 r, j" I/ } JMP 5678:1234 ;跳转到 5678:1234的地方, 之后 IP = 1234h, CS = 56786 V7 b0 h$ t r8 K% _; V, u( t/ A
JMP BX ;跳转到 BX 指向的地方, 之后 IP = BX, CS不变
! @! \; F+ B b$ r' B" ]9 Y JMP word ptr [BX] ;跳转到 DS:[BX]的内容指向的地方, 之后 IP=DS:[BX], CS不变3 X& L. p2 v# c0 [- h5 ?$ R
JMP dword ptr [BX] ;跳转到 DS:[BX]的内容指向的地方, 之后 IP=DS:[BX], CS=DS:[BX+2]- m @- l& t( j0 c# I: S$ b5 i/ c
: l1 K1 ]/ p5 C2 S [知道了什么寻址,我们来试试, 同样,运行Debug, * |8 |) o2 |* {4 M! b
=F B800:0 1000 55 17 ;填充 B800:0, 填1000h个字节, 使用55, 17, 你别告诉我debug使用不熟.9 k. J( F3 t v
1 v1 y& p1 N1 `1 S; u
看看什么现象再说.
8 t3 T }" ?3 v7 a) V2 H0 X, U# |" `2 n9 a, W
现在你应该知道了 DOS 1M 的空间, 实际上有些区域是已经固定给一些硬件使用的了,
: |0 M, `* Z! Q' i9 ]" P 经常提到的640K基本内存, 就是00000-9FFFF, 这部分是可用内存, A0000-BFFFF 给VGA显存使用, 而你刚才填
+ P) y5 O3 ]4 p- Y B8000则是文本缓冲区, 向该地址写任何东西, 均会立即反应在显示器上(记得是在文本模式下), C0000-CFFFF
/ H- f/ u' W1 N 一般是给VGA BIOS占用, D0000-DFFFF给一些其它ROM使用, E0000-FFFFF一般给BIOS占用, 提供BIOS相关的服务
% E3 k1 K/ R' E6 Q& e
0 ~- E" o; D ?+ j& j 在基本内存中, 0-3FF共256*4, 存放INT0~FF的入口地址, 400-4FF存放BIOS的数据, 看一下吧!/ k' N; y0 [ C
-D 0:4002 A# S; W9 \+ u3 W7 F5 f
0000:0400 F8 03 F8 02 E8 03 E8 02-BC 03 78 03 78 02 80 9F ..........x.x...
; G. w7 a/ u x0000:0410 23 C8 00 80 02 00 00 00-00 00 24 00 24 00 30 0B #.........$.$.0.
0 m# l/ Y& e. `. w- m8 a0000:0420 30 0B 0D 1C 20 39 30 0B-3A 27 34 05 30 0B 0D 1C 0... 90.:'4.0...7 S1 m# {& w7 E- W% R' ^: K! w4 h
0000:0430 44 20 20 39 34 05 08 0E-30 0B 3A 27 34 05 00 00 D 94...0.:'4...
. R& n5 M' ]2 x" b8 I2 d9 ^- t0000:0440 E0 00 C3 00 00 00 00 00-4D 03 50 00 40 1F 00 00 ........M.P.@.../ \, B# C- D h( ^6 _
0000:0450 00 31 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .1..............9 [* |, M) ?+ E! b
0000:0460 07 06 00 D4 03 29 30 F6-03 00 F0 FF D1 C4 0C 00 .....)0.........
$ A" D* L4 e% v1 \9 b6 N2 h9 |0000:0470 00 00 00 00 00 00 00 00-14 14 14 14 01 01 01 01 ................
( q2 c. E2 O. [6 u
C/ t0 O$ E# r) z% F# D 第1,2,3,4个字:03F8, 02F8, 03E8, 02E8, 原来是COM1/COM2/COM3/COM4的地址..' g4 U: A: _- O' P- X; D0 i1 d
.... |
|