找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 55482|回复: 45

[原创]BIOS 入门之一: 8086 模式

[复制链接]
发表于 2008-8-30 12:48:45 | 显示全部楼层 |阅读模式
要成为一个真正的BIOS工程师,最基本的必需熟悉整个80X86体系,PCI规范,ACPI规范,如果对PCIE,VESA,SATA,USB,ISA,PNP,AGP等均全面深入,那你应该是一个真正的高手了. , K/ }. D" \( {1 s  N
今天开始, 本人班门弄斧, 不定期写一些基本的计算机体系方面的知识, 希望对刚刚踏入BIOS这一领域的同行有所帮助! 以下所有文字除特殊说明外, 所有的均属本人原创!   p2 ]7 E3 \: e: c7 v

# B. N$ n! G% o5 K9 O9 f  |! r
9 v$ h( K; y7 l: H! m! g7 ZBIOS入门之一: 8086模式
# B4 [2 _! D% O( `
1 y: o3 p' 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以后的东西会在下一篇文章中写.
! w9 L# \, j6 |, b4 e+ m   , t( V+ W# \" d; P+ h* z
  先说一下目前的CPU的工作模式:. v7 A% g3 s9 `7 z
1. Real Mode (实模式): DOS系统就是在这个模式下运行的,也就是8086兼容模式,所有的操作与8086 CPU完全一样.& [  m* e4 ]" m2 Z# X( c  ]
2. Protect Mode (保护模式):Windows系统就是在这个模式下运行的.等下一篇....
" z' ]' W' T% o4 `5 M9 ~4 ~% ` 3. VM86 Mode (虚拟86模式):RealMode和ProectMode不能同时运行的,因此,在Porect下,可以在这个模式下运行基于16位的8086程序, 下下一篇会讲到....
! G8 r8 V7 U# j# F 3. SMM Mode (系统管理模式): 提供给 BIOS 最底层的 CPU 的一个管理模式,再等下一篇...% a2 K; s$ s) @1 t4 Q: l
4. Long Mode : 64位 CPU的保护模式, 再再下一篇...2 C4 d: }$ u. a2 J; ~0 z
  1 {  [; D" h6 `- R3 |
  今天说说Real Mode 8086 寻址模式:
; D- [0 Y# `) F( ?. J% E5 H3 V" [7 p
 8086全是16位工作模式,为了访问整个1M空间,使用了<段:偏移>的方式来实现,目标地址=(段<<4)+偏移 / q( w% @* s& P6 Y6 }$ J2 |
  段寄存器: CS, DS, ES, SS, FS, GS 来定位以16Byte为单位的基地址," ^. Q/ _7 u, p6 C/ ?( D
   寄存器: AX, BX, CX, DX, SI, DI, BP, SP 则作为偏移.
0 p  {9 t9 Q; W6 C5 V, m; \  
. T" r9 V" q- c" a$ G( }" i; M  当CPU上电后,CS=0F000h, IP=0FFF0h, 指向 0FFFF0h 也就是1MB - 10h Byte的地方, 最多只有16字节的空间,放不了什么代码了,因此,这里一般放的是一条 JMP 指令,
0 ]$ S1 N0 E! l2 L7 L3 |" X 试试在DOS下运行Debug:( ?3 U6 X8 V$ Y+ U5 T6 S
-u F000:FFF0) ]" w  u. P  H2 A; K
F000:FFF0 EA5BE000F0    JMP     F000:E05B/ S, y  D  H, F7 f1 ^$ S, H
F000:FFF5 3130          XOR     [BX+SI],SI
& e: g4 ]' s/ w5 |7 RF000:FFF7 2F            DAS. ?* g" q$ W2 N/ R
F000:FFF8 3130          XOR     [BX+SI],SI. N! w1 i6 E  Z- f# x1 Y$ k& c
F000:FFFA 2F            DAS, j6 Y# y! e% g! v# l: Z8 C
F000:FFFB 3037          XOR     [BX],DH. [" L7 }6 R1 f: K0 m. K) F- f7 u# h8 H
F000:FFFD 00FC          ADD     AH,BH
8 H: i# s, Q; q5 Y( z* vF000:FFFF 57            PUSH    DI$ H* ~1 {% t/ w. m$ B
# {1 I7 `" ~- A( M7 C
对于Award BIOS来说, F000:FFF0的指令一定是 JMP F000:E05B ,其它的厂商BIOS可能不是E05B.
0 }$ ?3 T3 P5 s
6 o0 |- q9 a  V& r) o6 h试一下,
  T8 _( |% y/ u0 v" Z! ?" Y-G=F000:FFF0
: _* {$ P2 O. v/ d1 ^/ e3 @看看会什么样 7 W* Z8 }* W7 `9 k; d! B! p( N

! E/ j; n( x" t' }1 _0 v以上的操作在真正的的DOS下运行,不要在Windows下的 DOS Command 下!!!那个是VM86 Mode..: ^8 c7 d: v2 \$ C9 Y
. u- t' D4 l/ @9 X
  我们可以以多种方式来对8086寻址, 下面列出的是常的:# o4 p* O. P3 [( I( j& }
  
! h7 D9 {5 Z; T" y  MOV   ES:[SI], AX                 ;把AX的内容复制到 (ES<<4)+SI 地址所指向的内存' K3 a8 j4 Q! l9 Z% Q, L( s( c
  MOV   DS:[SI+1234], AX            ;把AX的内容复制到 (DS<<4)+SI+1234 地址所指向的内存" _9 H9 L$ a: Q: d
  MOV   [SI], AX                    ;把AX的内容复制到 (DS<<4)+SI+1234 地址所指向的内存,
' ~$ Y* e3 C( G) I6 C5 M                                    ;通常,没有指定段,则 SI 使用 DS, DI 使用 ES, SP/BP使用SS
. i4 y' @% E7 b0 v# N& G  MOV   CS:[1234]                   ;把AX的内容复制到 (CS<<4)+1234 地址所指向的内存
0 _. I3 V% [# S
  D! `( W) g$ z  JMP   1234h                       ;跳转到 CS:1234的地方, 之后 IP = 1234h, CS不变
- a$ R* g$ X! c/ j  JMP   5678:1234                   ;跳转到 5678:1234的地方, 之后 IP = 1234h, CS = 5678
" a& _; U2 t' z8 s4 k  JMP   BX                          ;跳转到 BX 指向的地方, 之后 IP = BX, CS不变6 U, C" k5 l% d* |6 B8 N% d! j2 K
  JMP   word ptr [BX]               ;跳转到 DS:[BX]的内容指向的地方, 之后 IP=DS:[BX], CS不变
5 z- m1 [" w6 z, n0 C  JMP   dword ptr [BX]              ;跳转到 DS:[BX]的内容指向的地方, 之后 IP=DS:[BX], CS=DS:[BX+2]+ f# d: S1 F, P; f6 D  t
  
! k% X( B7 @( m0 p知道了什么寻址,我们来试试, 同样,运行Debug,
- H& g9 X/ b# ]4 g1 q=F B800:0 1000 55 17                ;填充 B800:0, 填1000h个字节, 使用55, 17, 你别告诉我debug使用不熟.5 i8 ]) n% @: N' [4 l/ j: `) j

% n+ T0 ?# z, C看看什么现象再说.
! T9 S8 x. n: Q% m  U8 a8 N
7 |0 h' d) R) t7 h! `  现在你应该知道了 DOS 1M 的空间, 实际上有些区域是已经固定给一些硬件使用的了,
+ W( ]( Q; w/ f& i) p7 O( k  经常提到的640K基本内存, 就是00000-9FFFF, 这部分是可用内存, A0000-BFFFF 给VGA显存使用, 而你刚才填4 A- [* G- q- @( N% c. i0 G
  B8000则是文本缓冲区, 向该地址写任何东西, 均会立即反应在显示器上(记得是在文本模式下), C0000-CFFFF
3 i4 q, J$ a( V7 v& K  一般是给VGA BIOS占用, D0000-DFFFF给一些其它ROM使用, E0000-FFFFF一般给BIOS占用, 提供BIOS相关的服务
! {, l; a6 o/ \" }  $ A) G$ C: E+ R
  在基本内存中, 0-3FF共256*4, 存放INT0~FF的入口地址, 400-4FF存放BIOS的数据, 看一下吧!
4 P- q. |- j2 l9 U+ x -D 0:400
! w' g: F8 g( l2 J0 c0000:0400  F8 03 F8 02 E8 03 E8 02-BC 03 78 03 78 02 80 9F   ..........x.x...
* X6 r/ b& b' a5 B! M% t0000:0410  23 C8 00 80 02 00 00 00-00 00 24 00 24 00 30 0B   #.........$.$.0.) B' W3 m% E+ i0 V6 k$ S
0000:0420  30 0B 0D 1C 20 39 30 0B-3A 27 34 05 30 0B 0D 1C   0... 90.:'4.0...  b' N% V5 j* E
0000:0430  44 20 20 39 34 05 08 0E-30 0B 3A 27 34 05 00 00   D  94...0.:'4..." p  A" @% ?: O0 k
0000:0440  E0 00 C3 00 00 00 00 00-4D 03 50 00 40 1F 00 00   ........M.P.@...) L/ o, z# r7 G- v4 R: j9 d
0000:0450  00 31 00 00 00 00 00 00-00 00 00 00 00 00 00 00   .1..............
0 ~" ?% p. b6 Q% U8 P% r, k0000:0460  07 06 00 D4 03 29 30 F6-03 00 F0 FF D1 C4 0C 00   .....)0.........
/ }/ h8 p8 a: M8 S3 |6 A* B0000:0470  00 00 00 00 00 00 00 00-14 14 14 14 01 01 01 01   ................! w) `4 O* I/ I- b1 D) K
" D% k9 Q1 {: {9 Q$ Q$ Z
第1,2,3,4个字:03F8, 02F8, 03E8, 02E8, 原来是COM1/COM2/COM3/COM4的地址..
" j+ L- @* O2 P3 @ ....
 楼主| 发表于 2008-8-30 13:08:18 | 显示全部楼层
继续...
6 t6 U. z7 h4 v0 Z( D了解了一些东西, 我们试试什么调用BIOS提供的服务, 启动到DOS, 注意,以下提到的,均是在真正的DOS环境,不是在WINDOWS下的Command窗口./ Z- ~" F- F' Y# T
运行Debug:
4 a0 N1 e# l' r7 W0 m. }-A
" @( w. \) X# q9 `' _0B62:0100     MOV     AX,0013, m$ u6 U" z- ~  [
0B62:0103     INT     10
/ i- c/ v1 g& H0 [7 [4 r0B62:0105     MOV     AX,A0002 f) V0 o5 u* a
0B62:0108     MOV     ES,AX+ m( S( `; t/ K6 L& `* I( a# a) ~& _
0B62:010A     XOR     DI,DI) }- s  ]( F. E( M, k$ T
0B62:010C     MOV     BL,C8
% G8 b9 q2 h/ G2 z; T0B62:010E     DEC     BL2 O6 ~0 a1 C2 J
0B62:0110     JZ      011B
% L4 @, A5 ]1 s4 G3 G. Z0B62:0112     MOV     CX,0140
: ~* V0 {5 o" \# f& N' V, S0B62:0115     MOV     AL,BL0 z; }) ?% x; C$ M
0B62:0117     REPZ, X' \# s9 X' w3 ^" k' E$ Q
0B62:0118     STOSB
) [% n* E" ~4 j4 S! I9 W8 D: |( ~0B62:0119     JMP     010E
3 K) f: M$ g8 c0B62:011B     XOR     AX,AX
. ~" j, o6 ]5 C% M4 |0B62:011D     INT     16. E, }1 _! Z( D. l
0B62:011F     MOV     AX,0003
  `+ ^' Z9 |% P' O" Z& a: ]! g$ f0B62:0122     INT     10
* g" _5 s# j. w" h, L" J0B62:0124     INT     3
1 f6 Y7 @# r$ {% y% Q" j% W- L! x% e-G
9 Q0 W6 f0 {' K- a" t$ w- C-Q
1 ~  [* I4 r! X& A3 Z) O
- t5 g& D4 M+ l: oINT10 VGA BIOS服务, 上面开始设置为320*200*256色模式, 最后恢复为文本模式,  INT 16 键盘服务, 找找看, 把在学校学的计算机书看看, 你会找到答案的.
7 o& ~- \5 A+ T: v  t再来一个,
' m, I; k1 S9 U5 C1 {' {2 P! ?-A
5 O  i8 M6 u$ m7 R0B62:0100    INT  19; p* o! Z% ~- B# c* H+ f
-G
# w5 @# z; G6 @  O5 N' i' x: n) M) [9 T2 U- ?
看看出现了什么, 都是BIOS提供的东西!! 如果你已经是一个BIOS工程师了, 有机会接触到BIOS Code, 那就到里面找找答案吧!!!7 S: N  e2 T& x: L7 T0 h

- h5 y! F8 D3 C2 @5 ^我们再来看看IO的访问, 8086提供0000-FFFF共64K的IO Space的访问, 其中部分地址已经固定, 00-1F给我DMA, 20-23给了中断, 60/64给了KBC/MS, 70/71给了RTC, 那80给谁了, 就是debug卡了, 如果你板上插有debug卡, 试试在debug下:
0 W+ p/ p8 e- @, V- D9 `-O 80 AA
3 ~% @3 o6 r% ~# W0 H- m3 ^看是不是显示AA了.) U% E# K1 u! G! L9 i1 w3 ]
对于IO的访问,需要使用AL, 或AX, 或EAX (用到了386寄存器),和DX
- u  {. c8 r4 {$ \( P8 K. L' F00-FF的访问, 可以直接寻址7 U7 A# o( B+ ?/ G  I
OUT 80h, AL          ;向80端口输出一BYTE, 必需通过AL实现
- x  y$ A7 Y4 m; lIN    AL, 80h           ;从80端口读入一Byte, 也要通过 AL% Y9 T/ j1 ~8 }1 L
对于WORD, 则为 # p2 ~+ V9 f( [' w
OUT 80h, AX
  K; O) Y' M6 o- PIN    AX, 80h8 m# ^$ S; g5 }& I- _  C
那DWORD呢, 得用上了386的32位寄存器了.5 v& O% H. O' ~. g5 ?
OUT  80h, EAX
* x. Z* [5 C( q2 ^: S" CIN    EAX, 80h,  
0 M) O6 S: s$ B8 r/ ~2 e$ Y8 M当端口地址>=100h后,则必需要通过 DX来寻址了.
3 R0 \  p* p# ~4 ?3 Z, d7 b9 W如:  d2 x7 Z$ m  e! @3 E& d7 n9 ?
MOV  DX, 3F8h
% R' w- }1 e' A3 a2 ^0 y4 y: KMOV  AL, 55h
6 Q$ l' @7 N8 V3 b! vOUT  DX, AL4 }: ]3 \+ R' i$ ~8 y
知道了IO的访问,我们来试试,debug+ x8 H2 j# V7 w8 N  h
-A
) m& _9 g  T' v- {) R& N' o0B62:0100 MOV AL,FE8 Z# R- X0 h* X  |
0B62:0102 OUT 64,AL
8 g6 C! F- X; }9 G4 Z6 l! F& i2 T' t0B62:0104 INT 3
6 V- w; U! G1 M; S/ j0B62:0105
& C! w6 y+ A9 ~8 x-G6 z: W" {" Y6 k) L9 K9 B" S- Q( F
5 J8 [9 P7 S2 O
出现了什么,你现在应该知道了reboot.com是什么实现的了,上面提供了两种方法!( X& G% o) \. ]( B5 d0 ~
2 n& O, Y" c0 M. q
因 IO Space 只有64K的地址空间,对于一个需要比较多的IO地址分配的系统来说,会不够用,因此,对于IO设备的访问,还有一种方式,就是一个端口作为Index,另外一个端口作为Data, 如RTC CMOS的访问.使用70来选择Index, 71来输入或输出数据,只通过两个端口就可以以访问到256个数据(在此不提NMI),试试访问RTC的时间(Index=0):
1 Y; Y3 |" J: z' o4 X-a! F8 d% y$ J" {
0B62:0100 mov al,00
" P+ N( `5 Y+ m0B62:0102 out 70,al: \' F! L  I4 O( x4 y
0B62:0104 in  al,71
  s4 N8 z7 f8 ^0 _, `* ], |% m0B62:0106 int 3& g, A8 M/ S- Z/ K; W6 a
0B62:0107% G6 M6 Q* K$ R; Y2 y) g: x  L
-g=1006 _2 V3 J: ^5 p
. r* W6 ^4 T* D3 T6 l
AX=0042  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
, I9 |- h0 j, _6 w5 \) ZDS=0B62  ES=0B62  SS=0B62  CS=0B62  IP=0106   NV UP EI PL NZ NA PO NC& Q9 n! `3 w5 `# g. @" r
0B62:0106 CC            INT     3
. U# S9 T* `# y9 P8 ]0 J-g=1001 Y% p! m: |. `
1 j" J! [2 [. l8 K* x' X2 ~& C
AX=0044  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
$ [; g3 k/ \; [  v$ U9 n' q/ V: LDS=0B62  ES=0B62  SS=0B62  CS=0B62  IP=0106   NV UP EI PL NZ NA PO NC$ q2 @8 B$ t$ H: y# e
0B62:0106 CC            INT     3
; X& L5 v/ a; `1 z2 }$ p5 X6 L$ Z-g=100
! J+ D1 }' I: b% t8 f+ ^( ]3 h( w( |6 ]- F/ j
AX=0048  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
: B3 M5 v8 z' x$ wDS=0B62  ES=0B62  SS=0B62  CS=0B62  IP=0106   NV UP EI PL NZ NA PO NC
; Q5 M' k  k# L2 X4 J2 l0B62:0106 CC            INT     35 z  ^# [( q' C
-A
6 P/ K2 x' m$ d# h3 h# v. d
2 S) J$ M1 E4 |% P$ f! @9 _; H运行了三次,AL就是当前的秒数,是不是一直在变?
7 R  L0 v# s! v现在如果是访问Super IO,你应该知道什么访问了.
回复

使用道具 举报

 楼主| 发表于 2008-8-30 13:08:29 | 显示全部楼层
......: x+ r; g( Q) |2 }
8086 入门相关的东西就简单地说到这里, 借花献佛, 送给大家一个好工具:
) ?: o' B) O/ a一个由 David Jurgens 写的一个非常牛的工具 HelpPC, * n$ ~8 r& r- D1 F5 |1 B
释放后, 进入 helppc21 目录运行 helppc.com, 你想知道的东西就在里面
  @; ?- p1 ^& Q/ B' h( |
, H( a, `* d) n1 E helppc21-c.rar (220.9 KB, 下载次数: 1359)
; B, t1 N! M$ E% @4 i
. [% d/ P" V$ `
2 }6 A! i' o2 _+ z8 }/ ?1 q.....
回复

使用道具 举报

发表于 2008-8-31 08:04:00 | 显示全部楼层
能总结就是牛人呀!7 {* x( }, {; D" ~. P' u, y+ a% J
要像楼主学习。
回复

使用道具 举报

发表于 2008-8-31 13:36:10 | 显示全部楼层
顶,, T# c+ p7 H3 `1 c6 N
. t# ^& [+ w  l5 T
好的开头,期待!!!
回复

使用道具 举报

发表于 2008-8-31 14:12:40 | 显示全部楼层
看牛人的总结,总是能获得收获。支持lz。5 o( O: Y+ k4 C# F! K- m, r: [
lz速度更新啊
回复

使用道具 举报

发表于 2008-9-2 14:57:58 | 显示全部楼层
期待david老大尽快更新!讲得易懂,好!
回复

使用道具 举报

发表于 2008-9-2 22:02:33 | 显示全部楼层
真是让人茅舍顿开啊,呵呵,期待david的后作!
回复

使用道具 举报

发表于 2008-9-3 14:04:28 | 显示全部楼层
好东西,学习中!谢谢!
回复

使用道具 举报

发表于 2008-9-12 12:22:35 | 显示全部楼层
现在的CPU上电第一条指令都是FFFFFFF0而不是FFFF0了,这段地址译码为Flash ROM芯片,应该是BIOS的Bootblock区域,进行一些初始化后BIOS在1M内存顶端建立所谓的影射内存,把BIOS内部模块解压到E段F段等,然后跳到FFFF0h开始接下来的初始化工作。
% L/ j7 G# P& v. d& W" u% N* P+ e6 L) i, r
所以F0000段读出的BIOS内容并非真正的BIOS,而只是其中一个模块,真正的BIOS在物理地址4GB-1向下的区域
回复

使用道具 举报

发表于 2008-9-16 10:13:36 | 显示全部楼层
coodkey说的对,楼主是犯了一点小错误
回复

使用道具 举报

发表于 2008-9-16 10:30:39 | 显示全部楼层
to 楼上的两位:
4 t# n5 t6 d, |$ Z楼主开头就讲了,他讲的是8086的东西,而非80386。
回复

使用道具 举报

发表于 2008-9-16 19:59:55 | 显示全部楼层
学习了,期待连载
回复

使用道具 举报

 楼主| 发表于 2008-9-17 13:00:46 | 显示全部楼层
这个疑问, 大家可以看一下Intel的北桥的EDS, 如果有仔细看完过, 一定找到相关的答案.3 U) [+ _0 O; d' L$ n' k; ]
2 V8 E7 ^/ I) q( D- B& ]' x% u
可以肯定的是, CPU的上电第一条指令地址一定是 Real Mode 的 F000:FFF0, 而不是FFFF_FFF0, 不管是8086 还是386, 这个是一定不会错的.6 s9 h9 P2 l/ X" I

" F$ i# y$ J6 ~1 B. T3 K2 o. HFlash ROM 是放在 4G 位置, 但北桥上电RESET后, 是把 对F_0000- F_FFFFh 的访问都映射到 FFFF_0000-FFFF_FFFF的,
. N' m2 `1 j- R0 ?因此, CPU 一定是在F_000-F_FFFF中运行, 当Memory Size 完成后, 会Shadow F_0000 到 RAM,  访问该区时, 就会访问到RAM, 而不是访问到 FFFF_0000 的BIOS ROM 区了, 这区域r的内容需要填入其它的内容, 通常是BIOS的Rontine服务程序(已经不是Bootblock的内容了), 具体的可以看看你的CODE.
: N% A2 D1 Y( G! O7 @3 R2 I" {
* x$ Q* S# g2 K1 Y+ l: v/ |附上一些相关的NorthBridge 信息, 可以参考一下, 更具体的只能看SPEC了, 希望对大家有所帮助:
5 ^6 o9 a. D; Y+ C! f" m& R. m* G# |* ^1 M) O2 m8 Q
System BIOS Area (F_0000h–F_FFFFh):2 K6 e" H2 M; S9 H7 z* R
This area is a single 64 KB segment (000F_0000h – 000F_FFFFh). This segment can be2 E2 c, g7 g6 \: a  N
assigned read and write attributes. It is by default (after reset) Read/Write disabled1 d' ^5 x8 ]7 c5 m
and cycles are forwarded to DMI Interface. By manipulating the Read/Write attributes,3 x+ h( r6 J" a/ m( J4 A7 ~2 D: r7 r
the GMCH can “shadow” BIOS into the main DRAM. When disabled, this segment is not
4 j  r6 w1 p3 S( p6 H3 T$ u( \remapped.6 o4 p2 ^0 L, e" u9 o5 v
/ I% v0 {4 I& ?
PAM0 定义:
& |8 X* B; L: p1 r7 C BIT 5:4  Core 0F0000-0FFFFF Attribute (HIENABLE):
: j" k. b, {0 u$ b5 M* e            This field controls the steering of read and write cycles
6 }& B  \8 u5 q( Y, L  P             that address the BIOS area from 0F0000 to 0FFFFF.
) l/ t3 B9 p8 p
+ g& A6 x; b  X6 g0 \/ i! z    Defalut = 00b,   即所有的访问指向DMI, 也就是Flash ROM的最后64K的区域.+ c# p/ L  ]  j' l: j. Q
00:        DRAM Disabled: All accesses are directed to DMI.8 o0 m, v' E, X; r. Z6 `( G
01:        Read Only: All reads are sent to DRAM. All writes
5 E1 b7 h6 {) e- V( n- U1 q7 S            are forwarded to DMI.- y+ g: G4 w+ p
10:        Write Only: All writes are sent to DRAM. Reads- j' A( t) @3 M9 q8 R
            are serviced by DMI.
8 b9 o) G( F1 V% S" Z11:         Normal DRAM Operation: All reads and writes are
. k8 J2 U) L' ]: n  L; x            serviced by DRAM.This register is locked by LT.
回复

使用道具 举报

发表于 2008-9-17 16:19:15 | 显示全部楼层
谢谢david大哥的回答,小弟我也是新手刚入门,不过还是有一些疑问,《Intel® 64 and IA-32 Architectures! H- u8 R) O: F/ x! E! L
Software Developer’s Manual》上是这么说的
" I3 ]# b6 l$ X+ \8 h1 ^
) b0 [# r! `: g# L) [. x8.1.4 First Instruction Executed
+ F# }7 J7 J( i+ l- \The first instruction that is fetched and executed following a hardware reset is located at physical address FFFFFFF0H. This address is 16 bytes below the processor’s uppermost physical address. The EPROM containing the software-& b8 O! ?5 Q0 c: M5 \; L% d  B& C
initialization code must be located at this address.
$ G# ^/ `. W' `4 _The address FFFFFFF0H is beyond the 1-MByte addressable range of the processor while in real-address mode. The processor is initialized to this starting address as follows. The CS register has two parts: the visible segment selector part and the hidden base address part. In real-address mode, the base address is normally formed by shifting the 16-bit segment selector value 4 bits to the left to produce a 20-bit base address. However, during a hardware reset, the segment selector in the CS register is loaded with F000H and the base address is loaded with FFFF0000H. The starting address is thus formed by adding the base address to the value in the EIP register (that is, FFFF0000 + FFF0H = FFFFFFF0H).
- I9 n7 y; f. s* iThe first time the CS register is loaded with a new value after a hardware reset, the processor will follow the normal rule for address translation in real-address mode (that is, [CS base address = CS segment selector * 16]). To insure that the base address in the CS register remains unchanged until the EPROM based software-initialization code is completed, the code must not contain a far jump or far call or allow an interrupt to occur (which would cause the CS selector value to be changed).
8 `3 w1 y- B& w  v& a% ]4 E- U9 R1 ~# C+ v' ^$ x3 X
系统第一条指令在哪,取决于CPU而不是北桥,地址由CPU地址线发出。386以后的CPU上电第一条指令虽然是实模式,但是CS寄存器的隐藏基址部分是FFFF_0000,因此第一条指令确实是FFFF_FFF0,这有点类似实模式下访问4GB内存的方法。而且文档里特别注明,此时不能用长跳转,以免CS寄存器被重新装载,导致CPU跳到1M内存里去。/ ]0 k- G, _* r  F& U  t
. @+ r( ^% I4 C2 q3 q0 |; I8 O
Intel北桥把F_0000-F_FFFFh 的访问都映射到 FFFF_0000-FFFF_FFFF,这是没错的,但我们不能保证所有北桥都会这样做,如果有的北桥需要手动打开映射呢?
, p8 I' p5 ?- V! r$ ]; q. E; {
/ A$ t# E4 b/ E( k9 Y0 z9 x9 d
小弟的一些愚见,欢迎拍砖。
回复

使用道具 举报

 楼主| 发表于 2008-9-17 17:34:45 | 显示全部楼层
coodkey 是个有心人, 你说的没有错!  赞扬一个 , 看来下一个主题 386 保护模式你是少不了了.
% v$ L4 |+ w- R
5 [( f# |. p+ D, c本来我是想在写完下一篇386 保护模式之后谈到这个问题的. 因为在8086过程中谈到这个会涉及到比较多的保护模式的东西, " z9 ^7 H0 ~& _
现今的CPU都是像你说的, 的确是第一条指令会寻址在在FFFF_FFF0,  但是CS:IP 还是为 F000:FFF0, 只不过CPU在使用 Base=FFFF_0000 Base 的选择子, 因此, 对外产生的地址就为 FFFF_FFF0了,  不过, 我们现在的Lagecy BIOS 的第一条指令就是 JMP F000:E05B, 因此, 也就立即跑到 1M 以下的地方去了, 因此就跟8086实模式没有什么区别了.
回复

使用道具 举报

发表于 2008-9-19 12:25:55 | 显示全部楼层
呵呵,让david大哥见笑了,期待你的下一篇文章
回复

使用道具 举报

发表于 2008-9-29 11:32:41 | 显示全部楼层
针对Reboot 来讲,CPU 运行的第一条指令F000:FFF0 实际就是Fooo 段的内容。BIOS 只做简单的初始化的动作,并没有对系统的资源重新分配。
回复

使用道具 举报

发表于 2008-10-8 20:06:26 | 显示全部楼层
积累每一块铺往成功之路的基石,期待下一篇!
回复

使用道具 举报

发表于 2008-10-13 15:01:51 | 显示全部楼层
辛苦了,继续呀!好好学习,经验之谈。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2024-11-15 20:53 , Processed in 0.041704 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表