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

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

[复制链接]
发表于 2007-12-11 15:23:54 | 显示全部楼层 |阅读模式
在和朋友聊天时,你是否碰到突然弹出一个重启?哈哈,也许你是中毒了,也许是系统更新.但重启,大家是否了解呢?本文将介绍几种重启行为,希望对大家有所帮助.$ Z4 |5 |+ z  A2 x2 Z4 O$ g

6 W$ V# s1 F+ m  ]. V1、KBC Reset9 r0 j8 [, S1 g' W9 G% [1 @8 G- z
这是软件实现的一种重启方法,是AT系统的遗产。此种重启工作顺序为:软件发送0xFE至KBC,KBC收到后发送信息给南桥,南桥下拉CPU INIT# 大约16个PCI Clock让系统重启。代码如下:
  1. ;----------------------------------------------
    - }9 M2 J% y, f; y  L
  2. ; 文件名:KBCReset.asm
    / Q4 x$ @' c. c" v
  3. ;----------------------------------------------1 X$ F& j3 ]; _/ D* y2 w
  4. ;    2007-12-11    bini.Yi/易祝兵    For teaching
    " ]# j; n3 p: V$ u' v4 m2 b4 U
  5. ;----------------------------------------------
    4 L( q# `, j1 G' m3 }0 x
  6.     .386
    2 O" T) u  A& I; U
  7.     .model tiny5 H0 |1 k7 Q6 G' C0 ]8 \; X5 ?
  8.     .code7 g; |/ b; ~# v% U! F
  9.     org     100h
    8 S6 C6 Y  Q8 @( L8 ?* V$ T
  10.     * \6 F. t3 @* D) t5 H- K4 W# l0 o! A
  11. ;; 如下代码参照 《PC技术内幕》第8章 键盘系统
    , ?; z# n: B, S: y
  12. : v5 B& n, O9 `& I) z
  13. START:. m$ ^6 m" X1 d1 E( X. n# z8 f  C* y
  14.     mov     bl, 0FEh                ; KBC Reset命令) t* Z9 c. A7 F( B3 x9 B
  15.     call    keyboard_cmd            ; 不应该有返回3 l" o6 _7 d6 R; j/ i5 I: f/ }# J
  16.     hlt# o& [7 u* y+ J9 F$ C
  17.   m8 m. S$ U! I4 H+ _" o, d
  18. IODELAY MACRO
    ( o- S0 H6 o+ ~& ]0 D. V: A
  19.     out    0EDh, al9 X* H0 F# x+ W
  20. ENDM
    # M6 K* l. `- Q9 r2 |. p4 g4 I

  21.   V' N9 {% F- H/ n
  22. ;----------------------------------------------/ N9 v. s# H( N: j
  23. ;    keyboard_cmd()
    : i; `  q: d8 L# V8 P
  24. ;----------------------------------------------$ _. y5 S: p, L; ]5 P" d' ?$ S! x
  25. ;    如果由于缓冲区满超时,则 ah 返回非零
    & T- ?* G9 y  p- E4 R
  26. ) r4 a% O0 T, C# t
  27. ;    调用    bl = 命令字节2 d" A. V3 ~6 `
  28. ;            ds = cs& G% p, |+ C1 `" F9 b
  29. ;4 @" K) Z) c2 D( y3 D
  30. ;    返回    如果 ah =0,则成功
    - K7 L: k4 B/ d% ^  n7 q3 d
  31. ;            如果 ah =1,则失败
    ( n  I3 k6 m- X! N/ Q( ^. l( j
  32. ;----------------------------------------------9 v: J9 n9 ^) P" u. M- X$ _4 F

  33. 7 [& T! d, @8 q9 t% s- J5 z
  34. keyboard_cmd    PROC    NEAR
    0 o/ B  B( r8 o* G4 ]' m& n
  35.     xor     cx, cx                  ; 超时计数器(64K), B6 D& ^- o. `6 Q  C, y3 ^) \
  36. # T- j9 k! L% L; c" V. Z
  37. cmd_wait:
    2 L& v1 e/ ~# j9 r8 B' J
  38.     in      al, 64h                 ; 获取控制器状态4 i3 S5 j3 r- y
  39.     IODELAY
    . Z' O  Q) m, h* T9 X3 `
  40.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完)1 G9 L; U/ b0 q1 m4 {
  41.     jz      cmd_send                ; 缓冲区空,准备接收命令.
    . \; h+ q) e8 G
  42.     loop    cmd_wait                ; 缓冲区满,重试3 b6 m0 h  P) R2 |" J) W
  43.    
    6 {2 t$ G3 ~) ^
  44.     jmp     cmd_error               ; 超时,失败! n/ L' n2 o" j( ~, ]- ^! o' t, ~
  45.     % |: Y1 l& z0 K$ B
  46. cmd_send:
    $ b4 |" Z# m9 h* l. k
  47.     mov     al, bl                  ; 取 bl 中的命令字节
    3 ^% t" o. [  H8 e3 Y: h
  48.     out     64h, al                 ; 发送命令字节
    7 Y' p5 z! d0 V2 `
  49.     IODELAY
    $ g3 t% `  }1 D- J1 c- e0 b5 w
  50. * q/ ~' t  W! i2 E4 d
  51.     xor     cx, cx                  ; 超时计数器(64K)
      a) O( y! j0 V4 r& g' c
  52. cmd_accept:
    1 ]$ ^. A' y2 ^2 d, h
  53.     in      al, 64h                 ; 获取控制器状态# j- n8 m4 f! }  U: p
  54.     IODELAY
    4 N+ B5 ?- K1 n9 h
  55.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完)" h+ u0 d, u; Q( e( x# Q
  56.     jz      cmd_ok                  ; 缓冲区空,处理完
    ( b. E4 i9 o7 h' @7 H; X4 k/ w
  57.     loop    cmd_accept              ; 缓冲区满,重试
    ( P5 _. g" K7 W+ U
  58.    
    6 @+ p$ S9 W, i& g  @/ a8 U1 \# z8 i" S
  59. cmd_error:                          ; 超时失败( I$ v" L- p; q. u$ h0 G' G% m
  60.     mov     ah, 1                   ; 失败返回状态非零
    ) }; y; s/ }7 A; r2 u
  61.     jmp     cmd_exit
    " e+ Z3 Z3 F/ q7 ~' m- B, J

  62. * q) U! m, R+ C+ ]
  63. cmd_ok:
    ( B0 r& }7 }2 H
  64.     xor     ah, ah                  ; 成功返回零! ~/ \3 m5 c( |' Y
  65.    
    ( L% C( W4 ?) v% F8 \' u) w
  66. cmd_exit:6 H1 _; Y/ @' H; v
  67.     ret
    * {  t& a, p+ N/ r
  68. keyboard_cmd    ENDP  w" W( W5 N  u0 q# Z& p
  69. $ q# K# Z0 d7 v5 |
  70.     END    START
复制代码
2、PORT 92h( f6 R8 _2 \4 T
从EISA系统之后,系统控制端口定义了一位用来快速重启的寄存器,就是在PORT 92h的Bit0,这种方式最终结果是和KBC一样的,HOST会拉CPU的INIT#以让系统重启。但这种方式不通过KBC,所以速度更快一点,代码如下:
  1. in al, 92h7 H' ^# a! M  M2 t5 b
  2. IODELAY
      i! y" ]  X# x% q
  3. or al, 1
    ) M# }) l* W* C8 P. z! [6 k. h
  4. out 92h, al
    7 i2 {2 m" _8 F: b6 o' i5 l  C. ~
  5. hlt
    ) s% v/ j6 O0 ]! N5 l9 w: g9 i
复制代码
3、Reset Control Register(Port CF9h)+ u4 a) S" h* p1 Z# H! B9 M
用此方法控制Reset,各Chip极有可能各芯片产商的做法会不同。
, ~! V1 T1 z2 Q# j% r, s 这里大家可以认识几种Reset的名词: Platform Reset, PCI Reset, System Reset, Reset CPU.我们来看Intel的文档,如下图:7 F1 J6 P( v% C: ~8 \+ q
          1.GIF % m8 u3 {( K1 q

1 e9 e/ U, u+ z  z, ~0 g' a; T 大家注意看,如果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。
" |0 H, D; A2 f$ |% h, v
5 |, v% w2 P7 q 因此你可以用下如代码Hard Reset:
  1. mov al, 6
    7 v8 S4 B1 p$ M5 w
  2. mov dx, 0CF9h$ |) \& o0 j6 Z+ N* w4 m/ I, a1 g' `" n
  3. out dx, al
    1 }% K5 a+ b& j% s3 E! F; S$ R
  4. jmp $
      |( r9 q3 S* w4 ?: r5 v
复制代码
也可以用如下代码“关机”(看你的机器的做法,也就是对SLP_S3#,SLP_S4#,SLP_S5#的处理):
  1. mov al, 0Eh- K! V5 L8 S, K2 d( j8 h
  2. mov dx, 0CF9h" M1 ?/ t5 _8 X0 E' J) F3 T
  3. out dx, al7 G: V4 i( }- C% M$ g& a! \% Z
  4. jmp $
    # o- B! L4 i. J4 a
复制代码
4、Ctrl+Alt+Del
) F0 x5 B+ y, z  M) f* @0 p    这种方法“基本”是在“DOS”下有效,教课书上常称为"热启"。键盘中断会hook住你的按键,Hook就是BIOS的INT 09h软中断,当你按下这三个键时,就相当于Far jmp到 F000:FFF0处。用如下代码在DOS可实现热启动。
  1.     jmp     F000:FFF0
    7 w( v3 U. ~& W1 C
  2.    
复制代码
OK,你对系统重启是否又清楚了一些呢?
发表于 2007-12-12 09:19:53 | 显示全部楼层

不错啊
回复

使用道具 举报

发表于 2007-12-12 16:10:17 | 显示全部楼层
不错,学习了。
; X5 h) N5 k0 C) w1 x  _还有人这样写:
' I0 P* `' h9 T# @. _1 ~; fmov     dx, 64h  . j$ B6 e! T, u% s2 O' D
mov     al, 0FEh 5 ~! ?4 }+ d  ~# k/ H; m- _7 t3 j7 i' g- E
out     dx, al         
: d/ R) T) M) G' {! O# @4 Fin      al, 92h
- y  U5 i- g6 y5 t6 d  b* Y( @or      al, 1- m2 V3 Q2 g& r8 m4 \; \. g8 J
out     92h, al/ d2 @  u( d5 C6 J: l% v. e
mov     dx, 0CF9h 2 o! C* C8 u" J# W0 ^; y2 Z
in      al, dx
) q0 @1 J, o7 Ror      al, 6; n0 i- @0 i* |' ^! h/ v6 Q
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 | 显示全部楼层
请教各位下 * ^" b" ?; p, G& 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:
+ ^4 o. O/ v; j$ jIf(BIOS报告的ACPI Tabler版本>=2.0 && FADT中RESET_REG_SUP标志设置 && 系统中没有8042键盘控制器) {0 _1 Y+ G- J8 j( ~5 f9 G; x
  通过FADT报的RESET REGister和REset value reboot;7 q* Q, V% |# U# z  D
} else {& r4 h0 m, o2 H5 ]) v2 _
  port(64h)=0feh // 这种reset不是整个系统范围的reset,BIOS一般会检测到这种reset,并转换为RESET REG reset, I/ V0 y( o% p# i, ?  B
}7 z) D1 V0 r1 q6 d
) `0 N$ x/ ~! [" q) ?, {" C
如果是UEFI的Windows,可能通过ResetSystem() runtime service来reboot.
回复

使用道具 举报

发表于 2008-10-31 12:29:21 | 显示全部楼层
Reset Register=0xCF9, Reset Value=0x06 or 0x0E ?8 j+ r) ]+ E7 w) h6 \3 Y5 Q; i! f
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; g0 y1 ^2 \% R. I" F3 H# v8 l  b
IODELAY" u- N, m6 I3 j5 \$ x+ p/ P
or al, 1
/ X5 @5 ]( F2 m$ lout 92h, al
8 A8 `' b3 H4 @6 ^, a  a/ |; Whlt
% t* X, U2 L4 C6 }9 z3 R, V. X- C, ^) }/ g. i7 s' i! I2 m
这个 有个问题 在 PC技术内幕 中第13章 提到这个92h端口时,说了在MCA中bit0确实是做重启
7 S; B! Z; f6 P+ W1 |但是在EISA中 bit0 只给了4个字的说明 :普通情况...
9 Z: s( t# W9 A( S2 j% n+ [1 Q不解ing....
. b0 f+ u: O3 a: f7 ]! X这样看 是不是 bit0 = 1也是做了重启?还是别的?8 _. M( P& A; B2 L) z
而且我目前的水平还不知道该怎么验证?  也许我对MCA和EISA没吃透...
回复

使用道具 举报

发表于 2009-3-3 12:50:24 | 显示全部楼层
参照ICH spec中对92h的说明
! R5 j, M% H2 J1 R# y$ aINIT_NOW — R/W. When this bit transitions from a 0 to a 1, the Intel® ICH7 will force
! ?3 m9 g2 k9 T% A5 |$ N# U- SINIT# 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:5 t' i/ p8 U5 L5 Y2 k6 m; h+ H# |
   srcore,
+ G' ~9 o, P/ w* K4 I      按照你所述,windows 下的重启,如果有KBC(EC),就是发0XFE吗?而我去追了一下,在EC收到0xFE 的地方 下了个断点,然后做windows 下重启, 以及CTRL+ALT+DEL,发现均没走这个流程,而是直接跑到了 EC check   warm reset 的位置去了(EC在不停的check  RSTRDY# 是否低,低则 warm reset )   ,难道是我们做的有问题?期待回复,谢谢!5 X' Y: h! Z' p' l3 s
  melow 平台(SCH+AMI CORE8)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-19 21:54 , Processed in 0.135426 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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