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

[原创]BIOS知识点滴Follow Bini系列之---系统重启

[复制链接]
发表于 2007-12-11 15:23:54 | 显示全部楼层 |阅读模式
在和朋友聊天时,你是否碰到突然弹出一个重启?哈哈,也许你是中毒了,也许是系统更新.但重启,大家是否了解呢?本文将介绍几种重启行为,希望对大家有所帮助.5 ~  Z& I1 u* p
1 W  A1 X2 y$ R9 D
1、KBC Reset5 s: N# l$ G1 l% _0 V3 o7 r; i6 Y( |5 ?
这是软件实现的一种重启方法,是AT系统的遗产。此种重启工作顺序为:软件发送0xFE至KBC,KBC收到后发送信息给南桥,南桥下拉CPU INIT# 大约16个PCI Clock让系统重启。代码如下:
  1. ;----------------------------------------------- g/ @& |, M9 o, s
  2. ; 文件名:KBCReset.asm
    / f# }( ^4 q6 g) `( q0 _7 j0 {
  3. ;----------------------------------------------
    & |5 O: _$ v" H+ p  Y) C
  4. ;    2007-12-11    bini.Yi/易祝兵    For teaching! [  r# _# ~0 w- G
  5. ;----------------------------------------------% @- S: b" K0 M4 b
  6.     .386/ z& h: m. [* g" J
  7.     .model tiny) q9 D3 B  l& L/ R8 W
  8.     .code
    ) h1 ~" _# c9 j* Y2 ~1 T! C' {
  9.     org     100h; m8 Z7 ^% a: z% ~: F
  10.    
    7 o1 L" G/ I( L
  11. ;; 如下代码参照 《PC技术内幕》第8章 键盘系统
    9 |0 R0 {4 J" w8 E' @" F
  12. & Y4 I; d8 Y1 H5 D4 ~5 F
  13. START:& r) w7 i9 C: P# f
  14.     mov     bl, 0FEh                ; KBC Reset命令9 x9 P% F( O# m/ q; L; x
  15.     call    keyboard_cmd            ; 不应该有返回" z9 z0 K% k7 W6 c8 d( Y7 r
  16.     hlt$ [  E8 w( S& V  t- L; ~

  17. ( d0 U" L$ U$ D4 }" w( k# d
  18. IODELAY MACRO
      v) U2 L1 p- p4 I0 l# ]
  19.     out    0EDh, al
    % g# b" D% t1 m) o5 R
  20. ENDM
    + d* I6 e! E4 M( ?; n9 _3 [3 N

  21. 9 ~, |& w6 ^/ }2 I" `
  22. ;----------------------------------------------3 Z# y! F4 g0 u- X7 ~2 z! H" t
  23. ;    keyboard_cmd()
    ! v8 F3 @% i/ R4 D9 `
  24. ;----------------------------------------------5 l$ U0 Y. T. @8 m, \- d
  25. ;    如果由于缓冲区满超时,则 ah 返回非零/ ]5 Z- h5 `" j) b! {' z$ `/ w. D: U7 v
  26. / w* H! |4 z* e
  27. ;    调用    bl = 命令字节! I+ t. Y( ^- ]5 F! y
  28. ;            ds = cs; b4 w1 v1 w" o  X
  29. ;3 [- X" c* }4 N# A. q2 B( {2 v! x. K6 _
  30. ;    返回    如果 ah =0,则成功& m0 Z3 ~6 h" C  j+ ~( c
  31. ;            如果 ah =1,则失败
    " ]# a! o4 e$ @9 ?
  32. ;----------------------------------------------
    " ]3 b1 i! Q' D! k2 r
  33. : Y6 v  q- f! k- {& a0 u, l! i
  34. keyboard_cmd    PROC    NEAR
    ; j( D  B! d( G2 X" V
  35.     xor     cx, cx                  ; 超时计数器(64K)& x1 E' V. s* l
  36. ( a8 T" F/ I7 K: f" h/ D
  37. cmd_wait:1 R& w9 f2 v+ P5 j! Z: S
  38.     in      al, 64h                 ; 获取控制器状态. G$ u+ g/ K& K6 J
  39.     IODELAY
    $ Z' G/ Z6 j! a$ ^9 u2 q
  40.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完), w4 |4 P. f! ?% ]
  41.     jz      cmd_send                ; 缓冲区空,准备接收命令.
    9 l& S: j0 b$ t+ \3 A) B9 @% h
  42.     loop    cmd_wait                ; 缓冲区满,重试
    & `# |& C# M. p7 W7 y. n6 U& }
  43.     , P  r4 A! g( X' D  {! \& _+ j
  44.     jmp     cmd_error               ; 超时,失败/ j2 V9 Z( k$ R( Y4 r# r' j
  45.     6 ~, g1 R6 A2 a% M9 j
  46. cmd_send:% G% }9 |! f# {1 c# r, ?8 x! U
  47.     mov     al, bl                  ; 取 bl 中的命令字节
    " D, t8 A- l0 J
  48.     out     64h, al                 ; 发送命令字节% D* K9 W7 g' [2 }% F& c" v
  49.     IODELAY
    $ f5 V+ E8 B/ B2 }+ X) h0 m" U
  50. / u2 o. t& ?; E+ a  c
  51.     xor     cx, cx                  ; 超时计数器(64K)
    2 }* P# [3 N$ f! ]/ |/ N
  52. cmd_accept:
    * S" O: l  o& e( ^7 B6 M1 e. M
  53.     in      al, 64h                 ; 获取控制器状态- {# D$ h0 u% ?+ y: E* q/ L# `
  54.     IODELAY  C9 A9 L) v4 b! L
  55.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完)0 J  m/ g& V( \& k' k
  56.     jz      cmd_ok                  ; 缓冲区空,处理完
    9 B* w- M8 {* I9 ~. Q
  57.     loop    cmd_accept              ; 缓冲区满,重试# G" W( H- e' o; S0 _
  58.     - N5 o$ s) s. H0 N/ v2 s( P$ B. I
  59. cmd_error:                          ; 超时失败- h- _) M2 B4 M3 Q- A0 ?6 R
  60.     mov     ah, 1                   ; 失败返回状态非零
    4 i$ i  @, `9 Q3 t+ _; b1 y
  61.     jmp     cmd_exit
    : Z. @1 ?  ?# i! X$ |; Y
  62. : x* N2 _! v& c4 r5 G3 d
  63. cmd_ok:- y: h( Z4 w: w/ r- R6 g7 l% Z
  64.     xor     ah, ah                  ; 成功返回零
      S5 B/ B5 Z, T- u! k& U1 i
  65.    
    3 n7 N. x& d6 K. _' }2 l
  66. cmd_exit:1 }; |& b+ k! U# G  m
  67.     ret9 z8 n' [! O% i! _1 i% o
  68. keyboard_cmd    ENDP
    / x& b* K8 K2 @. \  h- h( {
  69. 3 g  w: O  N7 c& L
  70.     END    START
复制代码
2、PORT 92h
# n4 Q4 U' g4 |6 S 从EISA系统之后,系统控制端口定义了一位用来快速重启的寄存器,就是在PORT 92h的Bit0,这种方式最终结果是和KBC一样的,HOST会拉CPU的INIT#以让系统重启。但这种方式不通过KBC,所以速度更快一点,代码如下:
  1. in al, 92h
    $ N, i  R( F$ u3 i& Y+ X  l1 d
  2. IODELAY
    # t4 w  x& T6 o- f
  3. or al, 1& K2 w7 k! F1 q# {0 w
  4. out 92h, al
    ( P. M1 _2 \, o, w) ^7 v
  5. hlt
    : N0 R+ |0 F7 v% [2 p  z
复制代码
3、Reset Control Register(Port CF9h)5 h8 l% p4 Y$ x+ \% ]( R
用此方法控制Reset,各Chip极有可能各芯片产商的做法会不同。( k  o* E0 Z. n, c. y
这里大家可以认识几种Reset的名词: Platform Reset, PCI Reset, System Reset, Reset CPU.我们来看Intel的文档,如下图:, `% J) i6 ?% O5 c3 v% Y
          1.GIF
  s# ^' Z4 K& i# Y
1 L5 m0 N) _: }0 U4 p1 D3 G# H 大家注意看,如果System Reset bit位为1,那么如果Reset CPU bit从0变为1时,系统就会产生Platform Reset(包括产生PCI、FWH、SIO、LPC、MCH Reset),即称为Hard Reset;如System Reset bit位为0,那么系统就会产生Soft Reset,即:和KBC/PORT 92h Bit0一样,下拉CPU INIT# 16个PCI Clock。/ X6 Y- r% Z3 ~3 k  X

5 G- S4 K' ^( Q& u  w 因此你可以用下如代码Hard Reset:
  1. mov al, 6& l$ w( Q' C. ~0 s! e  e7 \) S3 V* V
  2. mov dx, 0CF9h6 n3 |5 [  \/ m8 `* J/ F
  3. out dx, al
    4 o2 x- I9 w! h  H! g* B
  4. jmp $
    8 C# V$ a) X  L6 c
复制代码
也可以用如下代码“关机”(看你的机器的做法,也就是对SLP_S3#,SLP_S4#,SLP_S5#的处理):
  1. mov al, 0Eh8 o5 q9 J  E5 A  m& }$ w
  2. mov dx, 0CF9h
    5 `9 G( K% `4 y/ x. h$ V0 b) S
  3. out dx, al
    / i8 H  K; z2 d3 P' r
  4. jmp $
    & n* E, ~& ~$ r% X( f
复制代码
4、Ctrl+Alt+Del/ O+ L; ?% {: l# B3 N; w
    这种方法“基本”是在“DOS”下有效,教课书上常称为"热启"。键盘中断会hook住你的按键,Hook就是BIOS的INT 09h软中断,当你按下这三个键时,就相当于Far jmp到 F000:FFF0处。用如下代码在DOS可实现热启动。
  1.     jmp     F000:FFF0
    * K  E, X3 R$ l; n, E2 x
  2.    
复制代码
OK,你对系统重启是否又清楚了一些呢?
发表于 2007-12-12 09:19:53 | 显示全部楼层

不错啊
回复

使用道具 举报

发表于 2007-12-12 16:10:17 | 显示全部楼层
不错,学习了。$ e; ^; P1 A  n1 q2 W0 A
还有人这样写:7 @' |0 _! o7 u
mov     dx, 64h  
+ R2 n  g; J. q; \3 ?! z7 pmov     al, 0FEh . _0 E' e: S  J, e
out     dx, al            I  z* c  f& s* A  R6 _
in      al, 92h
( n" G- A5 T5 v% E6 D5 J3 Mor      al, 1
( d( ?* i- o* n" k  t1 bout     92h, al* Q. G/ h7 D/ H) P
mov     dx, 0CF9h
8 }& @8 L. D- l7 \' i' x# _& ]in      al, dx8 l7 J$ m4 q# m; W  g5 w. h
or      al, 61 S4 i0 U% y; L' z
out     dx, al
回复

使用道具 举报

发表于 2008-1-14 16:15:03 | 显示全部楼层
不错,各种方法都说了,谢谢。
回复

使用道具 举报

发表于 2008-2-19 16:12:50 | 显示全部楼层
CPU reset 好像不如Rci Reset彻底,经常不能完全Reset
回复

使用道具 举报

发表于 2008-4-17 10:11:09 | 显示全部楼层
请教各位下   g% s( [8 k) u% Y
经常看到 “reset with power cycle”。当powercycle时,看到板子跑了一段又再重启。在代码中powercycle具体是做了什么呢?是否跑完了Bootblock?powercycle的作用又是什么呢?请各位大虾指点。
回复

使用道具 举报

 楼主| 发表于 2008-4-17 10:39:08 | 显示全部楼层
可能是特定平台的BIOS与KBC的system flag的问题,启动时,KBC标识System flag为warm reset时,可能BIOS还会发一次System reset。(也许是为了解决一些BUG而设的重启吧)
回复

使用道具 举报

发表于 2008-4-23 13:56:08 | 显示全部楼层
谢谢分享,学习了,收藏了。
回复

使用道具 举报

发表于 2008-7-28 16:36:54 | 显示全部楼层
好像对重启有些了解了
回复

使用道具 举报

发表于 2008-10-14 09:50:55 | 显示全部楼层
学习了,挺全面的,收藏了
回复

使用道具 举报

发表于 2008-10-31 10:39:18 | 显示全部楼层
最近研究了一下Windows 2003 reboot flow:
% G. D  u  Q" I: tIf(BIOS报告的ACPI Tabler版本>=2.0 && FADT中RESET_REG_SUP标志设置 && 系统中没有8042键盘控制器) {
  Q9 W6 m+ ^, ?  通过FADT报的RESET REGister和REset value reboot;
; d- P) C# o% [; s7 q7 T! |} else {
9 u1 O: _- e: e8 r) E  port(64h)=0feh // 这种reset不是整个系统范围的reset,BIOS一般会检测到这种reset,并转换为RESET REG reset
% Y5 o3 l" ]& |8 M0 b}
9 D/ s/ {- l" M& y. z% T& z7 K4 s9 U
如果是UEFI的Windows,可能通过ResetSystem() runtime service来reboot.
回复

使用道具 举报

发表于 2008-10-31 12:29:21 | 显示全部楼层
Reset Register=0xCF9, Reset Value=0x06 or 0x0E ?4 b! L8 c& r! J1 Y5 B' g! A  x( O
Reset Register还可以在Memory或者PCI configuration space
回复

使用道具 举报

发表于 2008-11-12 16:57:04 | 显示全部楼层

out 0EDh, al

今天在查寻 out    0EDh, al这个句子的时候再次回到了这个帖子 ,以前在看程序的时候居然没留意
回复

使用道具 举报

发表于 2008-11-13 13:47:19 | 显示全部楼层
完全Reset是會斷一次電的,這個可以在這你發Hardware Reset的時候根據要求調節參數達到..
回复

使用道具 举报

发表于 2008-11-27 06:58:18 | 显示全部楼层
不错的文章,学习了!!!
回复

使用道具 举报

发表于 2009-2-22 09:46:25 | 显示全部楼层
不錯的整理,学习了!!!
回复

使用道具 举报

发表于 2009-2-28 20:06:41 | 显示全部楼层
in al, 92h
% i, r& S3 z8 y" T4 n0 T5 aIODELAY
. K8 G  _- x! A" e7 Q, n& ?6 lor al, 1+ `2 L6 ], _* e$ H
out 92h, al
5 G, d9 x, g% Y" z' o+ a. G9 @hlt/ i) g& j6 P( n
1 `7 u( B8 a4 H3 p* \5 N
这个 有个问题 在 PC技术内幕 中第13章 提到这个92h端口时,说了在MCA中bit0确实是做重启- f" o; a! P% U  _  ?" w
但是在EISA中 bit0 只给了4个字的说明 :普通情况...4 ?, F. D; c$ c, [
不解ing...." @9 q1 e4 e5 H/ l& M: o" ~1 y
这样看 是不是 bit0 = 1也是做了重启?还是别的?& q. ?) F2 j9 ]& i2 c
而且我目前的水平还不知道该怎么验证?  也许我对MCA和EISA没吃透...
回复

使用道具 举报

发表于 2009-3-3 12:50:24 | 显示全部楼层
参照ICH spec中对92h的说明+ y( y9 s4 F$ L8 M" F) P
INIT_NOW — R/W. When this bit transitions from a 0 to a 1, the Intel® ICH7 will force
# l5 [+ R/ H& ^' Y' `3 }4 U$ bINIT# active for 16 PCI clocks.
回复

使用道具 举报

发表于 2009-3-23 15:11:22 | 显示全部楼层

ACPI FADT中,KB8042和RESET_REG_SUP均不支持, ACPI OS 如何Reset?

ACPI FADT中,KB8042和RESET_REG_SUP均不支持, ACPI OS 如何Reset?
回复

使用道具 举报

发表于 2009-8-7 11:19:43 | 显示全部楼层

回复 11# 的帖子

Hi:; l6 L. |2 \( ]7 b- \. P) J2 U
   srcore,
) a) J7 t( u! {# E      按照你所述,windows 下的重启,如果有KBC(EC),就是发0XFE吗?而我去追了一下,在EC收到0xFE 的地方 下了个断点,然后做windows 下重启, 以及CTRL+ALT+DEL,发现均没走这个流程,而是直接跑到了 EC check   warm reset 的位置去了(EC在不停的check  RSTRDY# 是否低,低则 warm reset )   ,难道是我们做的有问题?期待回复,谢谢!. y* _% I- t# Z% X6 e
  melow 平台(SCH+AMI CORE8)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-1 17:41 , Processed in 0.216436 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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