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

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

[复制链接]
发表于 2007-12-11 15:23:54 | 显示全部楼层 |阅读模式
在和朋友聊天时,你是否碰到突然弹出一个重启?哈哈,也许你是中毒了,也许是系统更新.但重启,大家是否了解呢?本文将介绍几种重启行为,希望对大家有所帮助.& ^/ O/ g  n7 P
% w2 a# h4 W7 M5 [& y: l6 |
1、KBC Reset2 }2 i. Q; B0 `- B( B. B
这是软件实现的一种重启方法,是AT系统的遗产。此种重启工作顺序为:软件发送0xFE至KBC,KBC收到后发送信息给南桥,南桥下拉CPU INIT# 大约16个PCI Clock让系统重启。代码如下:
  1. ;----------------------------------------------
    1 n2 n$ `7 t4 P2 ^6 s" P. _
  2. ; 文件名:KBCReset.asm
    ' u  c! M# \# c* f$ @2 }0 N
  3. ;----------------------------------------------
    - G8 l6 E0 X# u- d
  4. ;    2007-12-11    bini.Yi/易祝兵    For teaching
    . s& e" R9 H% @9 n( a: V* j
  5. ;----------------------------------------------% X3 s7 q' H. P
  6.     .386
    / t% t  F% w5 T2 D1 `( }
  7.     .model tiny
    # _& s' j- j- Q3 C' m7 r
  8.     .code
      A; s% b  i2 W. v3 o
  9.     org     100h
    $ v" v+ f2 M/ r
  10.    
    * S4 l% P0 V8 m' b
  11. ;; 如下代码参照 《PC技术内幕》第8章 键盘系统
    * _) K* i( Z$ L/ M2 B

  12. * q# y, p) b; e
  13. START:
    ' R+ }# s1 e, }. ?, s- K+ M$ l" j) k0 P* x
  14.     mov     bl, 0FEh                ; KBC Reset命令
    " J- f4 e, ]! @( U# k
  15.     call    keyboard_cmd            ; 不应该有返回7 L# l: _1 M5 x+ x! f2 x
  16.     hlt
    ! d2 F$ H; ]- e' L6 S

  17. - ?* T+ O7 ^; p0 Y3 \2 j. O
  18. IODELAY MACRO
    * D* C+ B; a/ N  M
  19.     out    0EDh, al" r; w* N6 S, z2 J5 S
  20. ENDM
    & N6 I7 O- J" {7 r1 k5 Q% k

  21. ( }) E; G' x  ~: t- g; e; v
  22. ;----------------------------------------------
    ; T: s0 c2 h: ]7 t- c# U$ M
  23. ;    keyboard_cmd()1 W9 v/ a7 |* S# N! D
  24. ;----------------------------------------------
    ) [) o# k2 w+ q  ]. X5 s
  25. ;    如果由于缓冲区满超时,则 ah 返回非零
    9 K3 D: X" P3 Z  |+ r; a; o  K

  26. - O7 X- Y! v! b
  27. ;    调用    bl = 命令字节% |$ f& e% \0 _) ~1 J
  28. ;            ds = cs2 C' y/ a- x) Z+ e1 g
  29. ;' e& k1 U$ k: a6 w/ ^
  30. ;    返回    如果 ah =0,则成功) R% ^% n) i, B4 q7 Z# G) g$ c" x
  31. ;            如果 ah =1,则失败! j2 U9 L" d0 h6 Y" S
  32. ;----------------------------------------------
    $ v& }8 M1 ]4 q# k$ N
  33. , R8 P$ F3 Q2 Y" ?! |  p2 @1 D+ |$ f* c
  34. keyboard_cmd    PROC    NEAR
    / I- i% E( G3 p" K4 x3 T& \; l
  35.     xor     cx, cx                  ; 超时计数器(64K)
    2 h8 }; K, J1 i. D7 C1 A. n
  36. : K4 \0 d' A+ L3 c3 {0 ?8 y6 t
  37. cmd_wait:
    " {( ]" L; \2 O
  38.     in      al, 64h                 ; 获取控制器状态  L6 F2 c5 K/ {1 N- }, d
  39.     IODELAY" B& n0 ]0 q1 u$ y& D
  40.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完)' e  o  ?4 d. a8 ?
  41.     jz      cmd_send                ; 缓冲区空,准备接收命令.
    : M# ?- E: X' `# }/ ?
  42.     loop    cmd_wait                ; 缓冲区满,重试
    8 u4 H% I1 |/ _( |, G1 A; c7 Z
  43.     & _. U# `0 _( C, y  M9 H
  44.     jmp     cmd_error               ; 超时,失败
    5 E- e( g7 E# P/ L
  45.    
      f$ u8 `3 i& h0 F/ s
  46. cmd_send:
    / d3 L- ^9 X8 _' q& B
  47.     mov     al, bl                  ; 取 bl 中的命令字节
    0 e( X9 A/ e# l$ Q& O, P: `5 ?( K
  48.     out     64h, al                 ; 发送命令字节
    4 G" N0 u+ |7 Q
  49.     IODELAY- v6 T. j; @( b, Z
  50. " ~+ g( o! z2 S, c
  51.     xor     cx, cx                  ; 超时计数器(64K)
    ) K+ ?/ k. W  H' ]7 ~: W
  52. cmd_accept:
    1 T' Y1 W; D, W. A: M
  53.     in      al, 64h                 ; 获取控制器状态, y# r) E% j* W7 p+ }# H
  54.     IODELAY. _9 K5 B: y1 C. t/ T# P3 N5 V6 Z
  55.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完)
    ) s. ^# M' Z, _* u
  56.     jz      cmd_ok                  ; 缓冲区空,处理完
    + i" [" s9 R8 D
  57.     loop    cmd_accept              ; 缓冲区满,重试" M5 s- H$ l  L& I0 X9 `8 O' J7 p- O  B; _
  58.     , ?, M: J; H- |$ e1 u& |, H; w
  59. cmd_error:                          ; 超时失败
    + E: H$ S. M! i) @/ p
  60.     mov     ah, 1                   ; 失败返回状态非零- {* t# W& O0 W3 l
  61.     jmp     cmd_exit
    1 \- ~1 F3 _% R5 s. ~

  62. 3 T1 K6 L8 R, E0 l5 k$ c  K4 E
  63. cmd_ok:  c5 N4 B8 g* f. B' e/ w
  64.     xor     ah, ah                  ; 成功返回零& W8 n; n# R6 Z. j
  65.     , W; Q* M4 k: s
  66. cmd_exit:" O% p  y5 E0 L8 H) Q
  67.     ret( ^, s. U$ |! Z+ \+ f7 B( L1 v
  68. keyboard_cmd    ENDP
    8 i; j! s7 F  S9 N' X! f0 {
  69. 1 P( |2 {0 z( [2 Y* }( `& {) S9 [
  70.     END    START
复制代码
2、PORT 92h
9 B. m% b( }/ K" a2 F# w$ y  P 从EISA系统之后,系统控制端口定义了一位用来快速重启的寄存器,就是在PORT 92h的Bit0,这种方式最终结果是和KBC一样的,HOST会拉CPU的INIT#以让系统重启。但这种方式不通过KBC,所以速度更快一点,代码如下:
  1. in al, 92h
    , ?: ^* \: r8 R2 c& F
  2. IODELAY/ R% w5 q* ~) W% K0 Y, ~
  3. or al, 1
    . r! k, V7 e5 [
  4. out 92h, al5 P  O0 x% F0 T, C
  5. hlt
    1 g9 _0 a% G* j4 {# L, p: @
复制代码
3、Reset Control Register(Port CF9h)- ~3 F" E3 x! E& p9 A4 a
用此方法控制Reset,各Chip极有可能各芯片产商的做法会不同。
5 R& ~/ G4 Q% x. I 这里大家可以认识几种Reset的名词: Platform Reset, PCI Reset, System Reset, Reset CPU.我们来看Intel的文档,如下图:
' h% q; F9 h$ G, I# U. O; W          1.GIF
# }/ R: |3 y9 J* P
# W  ]6 t& Z2 z$ U/ _0 ^6 k 大家注意看,如果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。, A( o4 ]* m; X1 G' X- n

8 F( y! K, C$ Q) O1 ]; T: ? 因此你可以用下如代码Hard Reset:
  1. mov al, 6
    6 ^9 N- S  a" ]/ S$ t1 r
  2. mov dx, 0CF9h
    * X  s" |3 u' H
  3. out dx, al
    ) L! K& t, l0 D9 P3 O# y6 Y2 r) ?$ q
  4. jmp $
    / u: Y( C1 N1 `, f/ t6 ^+ A8 m/ Z
复制代码
也可以用如下代码“关机”(看你的机器的做法,也就是对SLP_S3#,SLP_S4#,SLP_S5#的处理):
  1. mov al, 0Eh& p6 T. b/ ^7 Z/ @) |0 g" X* t
  2. mov dx, 0CF9h, q' r; U$ j  L9 e
  3. out dx, al
    + l8 e' P- ], g( m' h& g
  4. jmp $3 v0 n9 v" @* M7 O
复制代码
4、Ctrl+Alt+Del
# A4 m# |. s# B( A1 A2 ]  Z6 X% {    这种方法“基本”是在“DOS”下有效,教课书上常称为"热启"。键盘中断会hook住你的按键,Hook就是BIOS的INT 09h软中断,当你按下这三个键时,就相当于Far jmp到 F000:FFF0处。用如下代码在DOS可实现热启动。
  1.     jmp     F000:FFF0, ?% L9 a/ @) o  m- U1 g' e
  2.    
复制代码
OK,你对系统重启是否又清楚了一些呢?
发表于 2007-12-12 09:19:53 | 显示全部楼层

好

不错啊
回复

使用道具 举报

发表于 2007-12-12 16:10:17 | 显示全部楼层
不错,学习了。" R7 m" l4 [5 G# V
还有人这样写:) l5 n* F  q% C/ n
mov     dx, 64h  
- R" O* P9 F& M/ K: Qmov     al, 0FEh
8 F; [$ [6 X1 y- f2 W3 m# ?* b7 Rout     dx, al          4 \9 _9 R7 S8 \. X" r# @! C; A! J
in      al, 92h
" S' w& c: e. [5 t+ e6 Uor      al, 1
$ ?9 U' V& m) r0 Zout     92h, al
" U; l" Y( L) @, W+ @0 _& Rmov     dx, 0CF9h % v7 a. U8 Z% X2 [# ^  P. p4 R$ k' `
in      al, dx2 m$ O" t* Z" L# a" n8 [1 T0 M. B
or      al, 6  Z3 L) [! |/ S) t- k- F" m: 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 | 显示全部楼层
请教各位下
" S- a4 L9 a) W9 f' j# O1 X9 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:6 e- a" G, A: t
If(BIOS报告的ACPI Tabler版本>=2.0 && FADT中RESET_REG_SUP标志设置 && 系统中没有8042键盘控制器) {
( W7 S8 U. h3 r3 ]( t  通过FADT报的RESET REGister和REset value reboot;" H9 O5 N1 b9 E
} else {
" e, N) l# o; s6 ?7 X8 G5 b5 i  port(64h)=0feh // 这种reset不是整个系统范围的reset,BIOS一般会检测到这种reset,并转换为RESET REG reset+ x: {7 q$ z+ i) c
}
: r# P. o$ p2 Q5 r/ N3 g; |) R' y! d6 f9 n/ ^# a
如果是UEFI的Windows,可能通过ResetSystem() runtime service来reboot.
回复

使用道具 举报

发表于 2008-10-31 12:29:21 | 显示全部楼层
Reset Register=0xCF9, Reset Value=0x06 or 0x0E ?
" p1 }$ F. S/ `. ~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
7 K' N6 h9 V$ t7 o: |IODELAY) T# y' x) I2 q8 Z
or al, 1
1 \8 R1 w$ A- g& e6 w% i/ z3 Gout 92h, al) ?( l$ T# |( |! X" ~9 k% J4 n1 H
hlt
" `% T+ b9 f! x: M3 V/ ?0 d' k8 [1 e! W* P$ Q$ f5 f
这个 有个问题 在 PC技术内幕 中第13章 提到这个92h端口时,说了在MCA中bit0确实是做重启
1 f  @- W( x4 n0 p但是在EISA中 bit0 只给了4个字的说明 :普通情况...
5 i' Y8 N3 b7 a# k' O1 ]8 C2 D不解ing....$ \9 B" z' y7 F- ?
这样看 是不是 bit0 = 1也是做了重启?还是别的?% A4 }- V5 F3 k
而且我目前的水平还不知道该怎么验证?  也许我对MCA和EISA没吃透...
回复

使用道具 举报

发表于 2009-3-3 12:50:24 | 显示全部楼层
参照ICH spec中对92h的说明  R3 i* ~% F6 s( s* p
INIT_NOW — R/W. When this bit transitions from a 0 to a 1, the Intel® ICH7 will force
- Z* _: M" G2 y" I9 IINIT# 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:, y$ |1 e1 ]" }! j7 u
   srcore,
! U: \, S( G/ g      按照你所述,windows 下的重启,如果有KBC(EC),就是发0XFE吗?而我去追了一下,在EC收到0xFE 的地方 下了个断点,然后做windows 下重启, 以及CTRL+ALT+DEL,发现均没走这个流程,而是直接跑到了 EC check   warm reset 的位置去了(EC在不停的check  RSTRDY# 是否低,低则 warm reset )   ,难道是我们做的有问题?期待回复,谢谢!
$ f$ y% h  I* X; m, l* N  melow 平台(SCH+AMI CORE8)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-20 08:36 , Processed in 0.078769 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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