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

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

[复制链接]
发表于 2007-12-11 15:23:54 | 显示全部楼层 |阅读模式
在和朋友聊天时,你是否碰到突然弹出一个重启?哈哈,也许你是中毒了,也许是系统更新.但重启,大家是否了解呢?本文将介绍几种重启行为,希望对大家有所帮助., d0 Z0 s: I- J" L; n
0 A6 V9 m- e7 O1 O& Q
1、KBC Reset
; r$ r, A, M; c5 L7 q/ C 这是软件实现的一种重启方法,是AT系统的遗产。此种重启工作顺序为:软件发送0xFE至KBC,KBC收到后发送信息给南桥,南桥下拉CPU INIT# 大约16个PCI Clock让系统重启。代码如下:
  1. ;----------------------------------------------
    ! ^- e/ }$ z* Y  Q; t$ {! @$ a5 {
  2. ; 文件名:KBCReset.asm6 s* N8 i4 }0 t( g0 U) \
  3. ;----------------------------------------------( ~2 Y, ^" V  g6 F/ m0 h2 V
  4. ;    2007-12-11    bini.Yi/易祝兵    For teaching
    6 R7 ^8 m. U8 E! Y  ^' X& u
  5. ;----------------------------------------------8 G! X; T6 O. j; d
  6.     .3864 i% p1 m- R1 f% y
  7.     .model tiny8 |+ A1 V1 ^. u* v# z6 @7 n
  8.     .code
    : k9 {" `* x3 ~: D+ _! x
  9.     org     100h& H* N$ k) o5 J& Y5 O# u) \3 z
  10.    
    , ~% S; p( j1 X$ f) h
  11. ;; 如下代码参照 《PC技术内幕》第8章 键盘系统% {. T( x+ q5 P* g' J
  12. ; ~; o4 I# y" l! [
  13. START:
    6 i" C& `2 N) W0 q$ c
  14.     mov     bl, 0FEh                ; KBC Reset命令
    + v+ z0 j+ P5 S; I  q, ~1 e
  15.     call    keyboard_cmd            ; 不应该有返回/ V3 d1 J5 v8 r
  16.     hlt* Q0 z# T# _% I

  17. , k; |7 f+ q8 k! `
  18. IODELAY MACRO
    / p  \* u8 V! M; ^
  19.     out    0EDh, al
    2 h) ~% J" I$ V# r% G
  20. ENDM
    4 E. z5 [' s" B1 z; u

  21. 8 J8 ?  C# B" c/ u- s2 k3 [6 l
  22. ;----------------------------------------------
    . V* [; |3 ]# @
  23. ;    keyboard_cmd()8 Z& C/ b$ w% u
  24. ;----------------------------------------------
    " F4 p" T4 `, U+ H  V4 \# L3 u3 l3 ~
  25. ;    如果由于缓冲区满超时,则 ah 返回非零6 p7 e4 n, V3 b4 F. B. d  E  F4 h; {

  26. 1 F& Y# \' W+ s: ~
  27. ;    调用    bl = 命令字节
    5 @6 Y. s7 A3 G  L# I  y
  28. ;            ds = cs! \% p+ H, r1 k9 f" S
  29. ;9 n* ]. Z( M, ?5 B
  30. ;    返回    如果 ah =0,则成功# a" x- `: w$ f8 i" r: }
  31. ;            如果 ah =1,则失败
    # L( I9 E) g! N# _8 X
  32. ;----------------------------------------------) Z) s, K* Y/ h7 o& U. A  g

  33. 2 p+ \  {9 t' C+ Y+ y8 f+ m* ^
  34. keyboard_cmd    PROC    NEAR
    % Y* `# d1 G7 H
  35.     xor     cx, cx                  ; 超时计数器(64K)9 y/ |8 @5 d' m% Z; M$ H3 V* _/ m
  36. " B1 H9 l2 w$ t# N
  37. cmd_wait:
    0 @( g& k% m7 h; W
  38.     in      al, 64h                 ; 获取控制器状态
    $ b4 r& C1 M7 u
  39.     IODELAY
    $ O: n3 m, q& {
  40.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完)
    ! S2 S. k- u3 m3 `" o; m- V# C. G
  41.     jz      cmd_send                ; 缓冲区空,准备接收命令.
    8 v, R/ P3 U% y, c: z" F, j! _5 X
  42.     loop    cmd_wait                ; 缓冲区满,重试9 {& J/ R- F- D+ G' |
  43.     5 I2 i& V: k- x: O
  44.     jmp     cmd_error               ; 超时,失败
    3 X4 O4 i8 U# N9 ?; D) S4 n
  45.     & E; O1 m, \9 L- i! c
  46. cmd_send:
    5 x5 D: [5 F1 E! I( G
  47.     mov     al, bl                  ; 取 bl 中的命令字节. e1 ~! g. ?. J1 S% Z& y
  48.     out     64h, al                 ; 发送命令字节
    ( z# U3 u# K* y# p5 N( d
  49.     IODELAY+ Y: y3 X2 @1 ^
  50. / e& \8 C& N7 _  j2 X+ ~1 U" K
  51.     xor     cx, cx                  ; 超时计数器(64K)
    9 `( H+ N8 j2 N7 ]+ \8 U
  52. cmd_accept:4 W( s% m0 ?: @+ P2 Z) l+ Z# A
  53.     in      al, 64h                 ; 获取控制器状态0 I7 _  N, b" g' N
  54.     IODELAY
    ) P9 X7 Y: b$ s$ K2 q# l
  55.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完): _! Y+ M3 {2 R! e. ?2 T
  56.     jz      cmd_ok                  ; 缓冲区空,处理完' M5 l2 ]! m" z. z
  57.     loop    cmd_accept              ; 缓冲区满,重试
    ! i. D+ \3 A2 g- E+ B0 A' I
  58.    
    # c# g5 U& Y5 f3 F- r
  59. cmd_error:                          ; 超时失败$ e9 o" S8 S% {7 j! k
  60.     mov     ah, 1                   ; 失败返回状态非零% d  ?: n& g- l
  61.     jmp     cmd_exit
    . a/ R% G1 p7 P

  62. ) m7 P+ L3 V# C$ O8 ?
  63. cmd_ok:
    ; y4 R" ^+ W) V8 V
  64.     xor     ah, ah                  ; 成功返回零: ?; i0 y' d* e: L1 i3 \
  65.    
    ' \" h5 |9 L8 ?( c3 J# x! s
  66. cmd_exit:
    ! n, p: J3 z- K* l
  67.     ret
    . G0 r+ Y: [$ D" K
  68. keyboard_cmd    ENDP$ G- A4 l1 m  P" Y. p8 p

  69. 4 b/ S* Z: v# g0 |  _4 a: V- K
  70.     END    START
复制代码
2、PORT 92h9 q* {3 L: o$ H" T! ^+ t; l+ O1 s
从EISA系统之后,系统控制端口定义了一位用来快速重启的寄存器,就是在PORT 92h的Bit0,这种方式最终结果是和KBC一样的,HOST会拉CPU的INIT#以让系统重启。但这种方式不通过KBC,所以速度更快一点,代码如下:
  1. in al, 92h' ?( A* T8 y$ ^& \' o
  2. IODELAY
    3 o& ~8 ?. w( G( `- _  Z# t
  3. or al, 14 U0 H5 m# M. g4 m& }  Q4 D
  4. out 92h, al* x5 o% G5 E/ a8 a( Y" r3 z
  5. hlt/ j9 b6 }; o& z
复制代码
3、Reset Control Register(Port CF9h)" [# I# P9 ?6 Q
用此方法控制Reset,各Chip极有可能各芯片产商的做法会不同。; r* q; b8 j: `, c
这里大家可以认识几种Reset的名词: Platform Reset, PCI Reset, System Reset, Reset CPU.我们来看Intel的文档,如下图:& c' _7 U5 S6 v) I& A2 R3 s
          1.GIF * I8 r/ F( t1 Z$ k

) H8 C5 a: R2 P' D$ x 大家注意看,如果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。. T+ i+ u8 ], H# S. j

0 @( }5 N4 [$ @& ~2 l$ {! d 因此你可以用下如代码Hard Reset:
  1. mov al, 6
    , }! N7 r& ]: |& i# f3 I
  2. mov dx, 0CF9h
      V& a; p3 Z+ i5 ^/ }: A
  3. out dx, al- ~8 w" r2 c' `
  4. jmp $0 i( F3 {8 w* K5 n4 k7 U
复制代码
也可以用如下代码“关机”(看你的机器的做法,也就是对SLP_S3#,SLP_S4#,SLP_S5#的处理):
  1. mov al, 0Eh
    9 f7 ]9 u8 O( d9 V2 f( o% {
  2. mov dx, 0CF9h8 v- f5 ]* k9 f) i
  3. out dx, al8 v8 g& K7 {- j8 @0 e& M$ B, z8 @0 o
  4. jmp $
    6 I1 n0 R' A1 y/ ~2 Z3 E+ l! X
复制代码
4、Ctrl+Alt+Del
0 q1 S# i/ s# N! `    这种方法“基本”是在“DOS”下有效,教课书上常称为"热启"。键盘中断会hook住你的按键,Hook就是BIOS的INT 09h软中断,当你按下这三个键时,就相当于Far jmp到 F000:FFF0处。用如下代码在DOS可实现热启动。
  1.     jmp     F000:FFF0. m/ ?, `  k* k
  2.    
复制代码
OK,你对系统重启是否又清楚了一些呢?
发表于 2007-12-12 09:19:53 | 显示全部楼层

不错啊
回复

使用道具 举报

发表于 2007-12-12 16:10:17 | 显示全部楼层
不错,学习了。
  d9 C& K: C$ g1 H, G# u+ ]还有人这样写:7 `- n0 t: a: d' }5 q6 s1 N
mov     dx, 64h  
# o1 `* N  x5 S- Vmov     al, 0FEh
7 p' [6 f; p2 b! E7 Lout     dx, al          + T, i3 _( i6 r& d& r
in      al, 92h
  M  q5 k& i9 T4 x, V  ]or      al, 1
5 `, V% i% \* R2 V) ?out     92h, al
! |  T% \! b* E) Y" d9 |/ }2 ~mov     dx, 0CF9h 9 Z7 f: N/ o4 J5 `. b4 d  o
in      al, dx3 M" u4 h% @. F0 E
or      al, 6: L2 R* m: h, k0 X1 ?& D/ U: c0 l' e
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 | 显示全部楼层
请教各位下 9 [- u! b2 F. q- ~2 d5 n
经常看到 “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:9 `) W( g5 e4 p) b
If(BIOS报告的ACPI Tabler版本>=2.0 && FADT中RESET_REG_SUP标志设置 && 系统中没有8042键盘控制器) {
7 e( k+ u4 M- n; o* U, s  通过FADT报的RESET REGister和REset value reboot;
! L" n' T. t( d( e- _, N- o3 @$ N9 G} else {3 q0 B% H, c, z1 S
  port(64h)=0feh // 这种reset不是整个系统范围的reset,BIOS一般会检测到这种reset,并转换为RESET REG reset
+ ^( l# G) n9 w7 @}
. b* |; G- J: r+ \1 T2 g  T6 M* W
% }+ y6 ?# T5 f) y% R  ]. q如果是UEFI的Windows,可能通过ResetSystem() runtime service来reboot.
回复

使用道具 举报

发表于 2008-10-31 12:29:21 | 显示全部楼层
Reset Register=0xCF9, Reset Value=0x06 or 0x0E ?
+ p4 p" ?8 a  a; U& Q( F$ ~1 v  GReset 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
+ i3 h; W. c4 _% j* k( a5 oIODELAY
. X# O( e/ j: r# ~) }! [& z" `or al, 1" ^5 V- o- A4 B: P$ b9 x! n1 T
out 92h, al! u3 {: R5 ]8 J) Q
hlt# Y4 K5 \. ~/ v
5 c2 ]$ t- c" Z
这个 有个问题 在 PC技术内幕 中第13章 提到这个92h端口时,说了在MCA中bit0确实是做重启! O4 J! H4 \* Y8 \8 U
但是在EISA中 bit0 只给了4个字的说明 :普通情况...
+ X: r7 b0 F: `0 G/ P% m不解ing....
6 v/ O3 {; ^; g/ [) |- h% Y7 v( b这样看 是不是 bit0 = 1也是做了重启?还是别的?% O! H! p4 v4 C/ Y/ V
而且我目前的水平还不知道该怎么验证?  也许我对MCA和EISA没吃透...
回复

使用道具 举报

发表于 2009-3-3 12:50:24 | 显示全部楼层
参照ICH spec中对92h的说明5 V& e. E4 T  Y- ^% i
INIT_NOW — R/W. When this bit transitions from a 0 to a 1, the Intel® ICH7 will force
9 |- ^" M  D8 p; N9 b" 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:
5 }1 @5 I5 c& Q- u9 ?0 g$ ?   srcore,; M& @; @& ]2 u$ J
      按照你所述,windows 下的重启,如果有KBC(EC),就是发0XFE吗?而我去追了一下,在EC收到0xFE 的地方 下了个断点,然后做windows 下重启, 以及CTRL+ALT+DEL,发现均没走这个流程,而是直接跑到了 EC check   warm reset 的位置去了(EC在不停的check  RSTRDY# 是否低,低则 warm reset )   ,难道是我们做的有问题?期待回复,谢谢!
& S5 Z+ ~' l% {8 ?  Y8 ]+ o  melow 平台(SCH+AMI CORE8)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 01:54 , Processed in 0.109020 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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