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

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

[复制链接]
发表于 2007-12-11 15:23:54 | 显示全部楼层 |阅读模式
在和朋友聊天时,你是否碰到突然弹出一个重启?哈哈,也许你是中毒了,也许是系统更新.但重启,大家是否了解呢?本文将介绍几种重启行为,希望对大家有所帮助." X5 ~5 o! W  J& I: i
; d$ b' }& c1 }$ R5 `4 c$ f  I7 Q
1、KBC Reset4 O2 @5 `/ v) H& S
这是软件实现的一种重启方法,是AT系统的遗产。此种重启工作顺序为:软件发送0xFE至KBC,KBC收到后发送信息给南桥,南桥下拉CPU INIT# 大约16个PCI Clock让系统重启。代码如下:
  1. ;----------------------------------------------
    . c3 u5 [5 r5 H  n! |
  2. ; 文件名:KBCReset.asm
    6 e# ]$ C4 z% |# z% Z" Q( D* |
  3. ;----------------------------------------------. H' J$ T' r: K8 P9 i; K- Y
  4. ;    2007-12-11    bini.Yi/易祝兵    For teaching
    2 ?  K' W% t  y" A- h" r
  5. ;----------------------------------------------; x6 |" g3 ?- t; f# M+ ]
  6.     .386
    9 Q0 m9 G" v6 w5 {! z# K! M
  7.     .model tiny1 m" X2 d+ |* [8 d& Q) |# Z
  8.     .code- t# }4 r7 O# ?& C
  9.     org     100h
    9 \+ r6 z) ]4 Y4 Z  \/ f( i
  10.     7 j# E. g; p$ {
  11. ;; 如下代码参照 《PC技术内幕》第8章 键盘系统
    - r' h, u& Q. n1 {! Y, w
  12. 4 a- @- y+ N* v- ^/ @* h+ C; O6 T
  13. START:
    * G' R& U# k4 H& @( O( P
  14.     mov     bl, 0FEh                ; KBC Reset命令
    8 a+ S% r! l7 s0 H) m
  15.     call    keyboard_cmd            ; 不应该有返回
    ; C2 Z5 Q7 t% f" t
  16.     hlt8 s+ a1 `$ @7 P% b2 Q* Y# s
  17. $ H4 |! E4 j2 e  t% ]. I$ I
  18. IODELAY MACRO
    : F7 I4 [, ~; K0 q+ L
  19.     out    0EDh, al' Q: o) X2 R( W% v% N- h, e. W
  20. ENDM
    9 `8 L% y4 Q1 R4 H
  21. + u& P7 |1 h6 N- i1 d
  22. ;----------------------------------------------0 e2 |5 I: e& Z" p
  23. ;    keyboard_cmd()( ]( F+ i  ^6 j
  24. ;----------------------------------------------' r$ A( D; n* V- [
  25. ;    如果由于缓冲区满超时,则 ah 返回非零
    $ d2 J8 w) s# S

  26. , W* L% I4 N  W. t' q$ ?+ U
  27. ;    调用    bl = 命令字节7 o. [0 l3 h* i& R
  28. ;            ds = cs* m2 j  ?$ p- B1 H5 \3 y
  29. ;' u  r- ~$ p1 E+ _
  30. ;    返回    如果 ah =0,则成功% a8 ]+ i1 p) {8 \2 W
  31. ;            如果 ah =1,则失败
    / c1 ~, g+ }& F" ^
  32. ;----------------------------------------------
    / R( h, h0 ~* i+ x

  33. " [: F# d- d: H$ |2 k) m7 j- R
  34. keyboard_cmd    PROC    NEAR
    % Z, q# j4 \+ \  t4 G! k
  35.     xor     cx, cx                  ; 超时计数器(64K)3 \" I" R, ?$ x: ]# W

  36. , r2 D! e+ k* G% J" p$ x
  37. cmd_wait:
    ( O7 |/ w( h/ d9 ^7 p
  38.     in      al, 64h                 ; 获取控制器状态
    % A0 H! i( X3 v
  39.     IODELAY0 r9 F4 Z# H) F
  40.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完)
    $ t6 f% X  D4 e) S8 y$ h) S$ F9 p& o
  41.     jz      cmd_send                ; 缓冲区空,准备接收命令.) z! l1 S. V/ ]7 O$ t
  42.     loop    cmd_wait                ; 缓冲区满,重试
    8 D) w9 F$ P, `+ C
  43.    
    9 }! w8 A- F/ S* f# {1 s# G
  44.     jmp     cmd_error               ; 超时,失败) C5 K  }. ?! T2 o
  45.     ( d& g1 m4 g1 j$ ]) R( C& L$ i
  46. cmd_send:' A  U- q' l1 ^7 s7 |# y
  47.     mov     al, bl                  ; 取 bl 中的命令字节" J- h0 h' j9 Y( l# }% U" x, M
  48.     out     64h, al                 ; 发送命令字节( t( |% K. y: b% j! Z
  49.     IODELAY. M; U* c3 N2 a1 t" Z. I

  50. # W$ V7 a5 R! Y+ n, G8 d
  51.     xor     cx, cx                  ; 超时计数器(64K)- L! h2 b( o  y6 e1 Z
  52. cmd_accept:/ j' z- O& k6 b/ ~1 W
  53.     in      al, 64h                 ; 获取控制器状态
    : L/ r% s$ L9 E# a# g2 E3 h' O
  54.     IODELAY
    % U  r- k6 c/ j6 [* f7 a/ s" m% J- M
  55.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完)
    . q* B9 |3 U9 K0 s# `2 R( i
  56.     jz      cmd_ok                  ; 缓冲区空,处理完9 m! `9 z. Y1 S
  57.     loop    cmd_accept              ; 缓冲区满,重试3 `( [) t& d# `
  58.     , c; e- `3 t7 l+ ~! u
  59. cmd_error:                          ; 超时失败
    3 `$ `+ I9 k; N+ j8 F
  60.     mov     ah, 1                   ; 失败返回状态非零
    6 b/ H8 r0 b; h' C$ Q2 u5 C. d
  61.     jmp     cmd_exit
    2 ?9 w1 g% u/ Y

  62. 8 X. y" L6 ^2 @$ i, m: Q& s4 ^0 ]
  63. cmd_ok:
    2 Z0 y5 k: R, l0 M
  64.     xor     ah, ah                  ; 成功返回零/ R* R" W" M% v" a% U
  65.    
    ) t; y" f4 R+ h
  66. cmd_exit:- ^5 C  ^* y8 {" }  `& l: F
  67.     ret6 d+ S2 N& L  s1 H  K
  68. keyboard_cmd    ENDP# Y) ^  D! b" a# h# C
  69.   O; C3 ?% X# v
  70.     END    START
复制代码
2、PORT 92h/ i7 u9 N, H: e0 B
从EISA系统之后,系统控制端口定义了一位用来快速重启的寄存器,就是在PORT 92h的Bit0,这种方式最终结果是和KBC一样的,HOST会拉CPU的INIT#以让系统重启。但这种方式不通过KBC,所以速度更快一点,代码如下:
  1. in al, 92h
    2 B* i6 d- }* o9 o6 E+ ^: A9 k
  2. IODELAY
    , `% h5 s) `8 E
  3. or al, 1  u( h. o+ d" [0 e9 p' p& V
  4. out 92h, al* X' C  n7 @5 ~  [7 Z
  5. hlt
    5 Z) V1 ^1 R4 f4 c& P  w3 F2 Z
复制代码
3、Reset Control Register(Port CF9h)
; C$ Y8 @2 ?. U  K9 ]3 J0 J% s 用此方法控制Reset,各Chip极有可能各芯片产商的做法会不同。
2 ?! k" Y, T0 [/ p$ w* b  J6 g 这里大家可以认识几种Reset的名词: Platform Reset, PCI Reset, System Reset, Reset CPU.我们来看Intel的文档,如下图:
! K) }" _' {) Q          1.GIF
% a3 v6 b" [+ t/ @, p: l , V) Z2 X0 i7 R! T( |1 u
大家注意看,如果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。
+ i) d6 }, Y1 M' u* M- S 0 s2 e9 l* _# J* C* |8 p
因此你可以用下如代码Hard Reset:
  1. mov al, 6! R  o7 M; y3 i! a: N
  2. mov dx, 0CF9h6 R4 {( m3 F  }8 z2 H
  3. out dx, al3 ^& A6 m7 w2 j1 H  k# F
  4. jmp $1 V! |3 z% ^/ F0 t' b7 n
复制代码
也可以用如下代码“关机”(看你的机器的做法,也就是对SLP_S3#,SLP_S4#,SLP_S5#的处理):
  1. mov al, 0Eh# p# f7 W3 v( a
  2. mov dx, 0CF9h0 B$ I! A, E% Q! p. \- s
  3. out dx, al
    3 B6 b0 ~# u& Q$ G1 `2 f2 M
  4. jmp $' Q+ ^; I8 X5 L5 [9 N1 i$ v
复制代码
4、Ctrl+Alt+Del
" ^2 Y- c* \% N4 Q$ |; @    这种方法“基本”是在“DOS”下有效,教课书上常称为"热启"。键盘中断会hook住你的按键,Hook就是BIOS的INT 09h软中断,当你按下这三个键时,就相当于Far jmp到 F000:FFF0处。用如下代码在DOS可实现热启动。
  1.     jmp     F000:FFF04 y1 m1 X3 F' z, v% S
  2.    
复制代码
OK,你对系统重启是否又清楚了一些呢?
发表于 2007-12-12 09:19:53 | 显示全部楼层

不错啊
回复

使用道具 举报

发表于 2007-12-12 16:10:17 | 显示全部楼层
不错,学习了。6 I& m3 M. i  V3 ~$ g1 H
还有人这样写:
& I  N# _9 B- ^  G# f6 T& zmov     dx, 64h  
# A) o/ e( u( W) o5 w- qmov     al, 0FEh ; o0 Z, _7 h2 e' b
out     dx, al         
% c3 c4 w# w& J6 Q1 Tin      al, 92h
% G. n) L) m9 k+ a$ J, [2 `or      al, 1+ |# E: ^8 h) \0 i3 `$ u
out     92h, al, U5 n" ?9 Z% V1 ?2 f& a* C0 n( |
mov     dx, 0CF9h
3 H5 k/ ], x" w0 Xin      al, dx
6 L5 R6 _  o6 \5 Uor      al, 6
# p+ h; U9 w- |$ j2 |5 }+ [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 | 显示全部楼层
请教各位下
) W9 ]5 P( I2 D' r5 O* w$ ^+ g' b: j- w经常看到 “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:5 A; l' ]' I. d4 W, ~
If(BIOS报告的ACPI Tabler版本>=2.0 && FADT中RESET_REG_SUP标志设置 && 系统中没有8042键盘控制器) {5 B. L, J  j; ^" d4 |: I( u
  通过FADT报的RESET REGister和REset value reboot;
& H# n- r8 V7 |% H! h} else {7 F5 k% i: c  }' X" g
  port(64h)=0feh // 这种reset不是整个系统范围的reset,BIOS一般会检测到这种reset,并转换为RESET REG reset5 r8 R) R$ z( N
}
- G8 Z% z# z* ^4 t) N% ], H) M! T# x" b/ t' t* D: @% C
如果是UEFI的Windows,可能通过ResetSystem() runtime service来reboot.
回复

使用道具 举报

发表于 2008-10-31 12:29:21 | 显示全部楼层
Reset Register=0xCF9, Reset Value=0x06 or 0x0E ?7 Q) p, b1 {4 \' w; P  l! J! H
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
9 t( Y1 b, o: n, [IODELAY7 U* l: W2 P: L4 x7 V0 I
or al, 15 f- r) M) p$ Q
out 92h, al
& x, _) M. Z6 |0 T# k/ l3 hhlt" u; f4 l! A9 b1 M8 B
4 C9 x* p/ ^% o: J# _
这个 有个问题 在 PC技术内幕 中第13章 提到这个92h端口时,说了在MCA中bit0确实是做重启
* ]$ y; z3 W( n但是在EISA中 bit0 只给了4个字的说明 :普通情况...
- w7 N/ v$ [% r' B9 i8 t不解ing....
* Q# N8 S4 n3 ]3 U这样看 是不是 bit0 = 1也是做了重启?还是别的?7 A+ B- i" u% H8 u4 d0 s$ @
而且我目前的水平还不知道该怎么验证?  也许我对MCA和EISA没吃透...
回复

使用道具 举报

发表于 2009-3-3 12:50:24 | 显示全部楼层
参照ICH spec中对92h的说明. h7 b, C& G7 y4 Z. h9 J
INIT_NOW — R/W. When this bit transitions from a 0 to a 1, the Intel® ICH7 will force% i7 q: p# U- l! U6 R: A
INIT# 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:
3 {- N* _9 u2 k8 O   srcore,
! H8 ]' S5 v' f  S      按照你所述,windows 下的重启,如果有KBC(EC),就是发0XFE吗?而我去追了一下,在EC收到0xFE 的地方 下了个断点,然后做windows 下重启, 以及CTRL+ALT+DEL,发现均没走这个流程,而是直接跑到了 EC check   warm reset 的位置去了(EC在不停的check  RSTRDY# 是否低,低则 warm reset )   ,难道是我们做的有问题?期待回复,谢谢!) j9 ~; V6 n5 {* N4 g; l% W& S
  melow 平台(SCH+AMI CORE8)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 19:33 , Processed in 0.046217 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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