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

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

[复制链接]
发表于 2007-12-11 15:23:54 | 显示全部楼层 |阅读模式
在和朋友聊天时,你是否碰到突然弹出一个重启?哈哈,也许你是中毒了,也许是系统更新.但重启,大家是否了解呢?本文将介绍几种重启行为,希望对大家有所帮助.
* l( f% c$ G: g( P% [) v! x+ [5 j! Z- y" Q8 s: u1 A9 ^& H7 {$ _! S
1、KBC Reset
0 A, w/ P+ s5 e  K9 X5 D 这是软件实现的一种重启方法,是AT系统的遗产。此种重启工作顺序为:软件发送0xFE至KBC,KBC收到后发送信息给南桥,南桥下拉CPU INIT# 大约16个PCI Clock让系统重启。代码如下:
  1. ;----------------------------------------------
    % _* R. `2 n( L6 y. B' C
  2. ; 文件名:KBCReset.asm1 _) A4 [6 P3 @0 m! x: s( Y7 O
  3. ;----------------------------------------------+ D# M. E3 r" A0 g* k
  4. ;    2007-12-11    bini.Yi/易祝兵    For teaching  ~* ^0 m; K* s3 {% e2 v" y
  5. ;----------------------------------------------! W" K5 \7 ^% [  ~7 q- q
  6.     .3866 B4 z1 e- h& [- x9 ?* F0 D
  7.     .model tiny
    ; N* j# T+ t7 f7 a# f  h1 T, _# b
  8.     .code
    0 e3 H2 z% c8 q
  9.     org     100h  b+ \% _: e$ @; }" e+ @
  10.    
    " D* C/ L# `$ C( g5 k
  11. ;; 如下代码参照 《PC技术内幕》第8章 键盘系统
    " \; n4 Z  Z% k; a
  12. 4 i/ [: \. K- U
  13. START:
    5 X' ~+ L' E% F2 A$ V
  14.     mov     bl, 0FEh                ; KBC Reset命令9 W2 K  y) u* w
  15.     call    keyboard_cmd            ; 不应该有返回
    . Z+ \; `' O9 T2 r& t
  16.     hlt
      ~4 U# U0 @4 d. c% [
  17. $ W  d" J9 f; t1 T) `6 I" ]+ U3 O
  18. IODELAY MACRO( T+ P* ?( o3 E: r+ }; A
  19.     out    0EDh, al
    6 [' j& k6 G. N% T1 a
  20. ENDM
    / v& }2 d7 N4 }8 a3 ]& e6 n3 O
  21. & X' M  D1 `& m5 Z: U* I$ J
  22. ;----------------------------------------------
    , c8 c: E2 k6 s6 I! x" R
  23. ;    keyboard_cmd()/ c4 k8 w+ [- U- F5 ?
  24. ;----------------------------------------------
    ( y$ ?6 w- p# m/ g' y& S
  25. ;    如果由于缓冲区满超时,则 ah 返回非零4 ?' C/ Q1 ]* x( V& i& N, _5 B1 r

  26. 6 Z  I( Q1 s" I4 R+ ]* J" E6 @6 W' M
  27. ;    调用    bl = 命令字节; [6 e! w+ [/ A6 f
  28. ;            ds = cs( x' r/ p6 ^% `0 D
  29. ;
    4 j% {# R% [, W6 w' G2 P$ U% n+ n0 c+ F
  30. ;    返回    如果 ah =0,则成功
    7 P7 Z( ]& q" ^5 H/ _$ K
  31. ;            如果 ah =1,则失败
    $ z+ w, C9 m: J
  32. ;----------------------------------------------
    2 j0 W* _) a2 u6 p8 H: q- B

  33. , Q0 A0 K3 W, ?6 Q, \2 _
  34. keyboard_cmd    PROC    NEAR
    4 U2 `9 ?8 x# N& M
  35.     xor     cx, cx                  ; 超时计数器(64K)! d0 n0 i/ P' P+ Y7 f
  36. * h1 h) Y7 H# r& M3 S. n
  37. cmd_wait:9 W! t0 z" n, g' w# k9 l4 Z
  38.     in      al, 64h                 ; 获取控制器状态: j1 c) _: \# z) ?: R% _0 K
  39.     IODELAY& y. B# T* i# I" H8 i2 i( m
  40.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完)+ z! ^' m7 G) Q! S8 {: O! H! F
  41.     jz      cmd_send                ; 缓冲区空,准备接收命令.8 p6 I0 m* w- X! }. b1 F
  42.     loop    cmd_wait                ; 缓冲区满,重试' D) U( v6 x! U
  43.     1 Q0 _) T; T% f' ^! ^
  44.     jmp     cmd_error               ; 超时,失败; C# y9 W! y1 y  W$ d# _
  45.    
    1 o- @" L9 _, p
  46. cmd_send:
    # G2 w: w7 l6 L! M% b& x
  47.     mov     al, bl                  ; 取 bl 中的命令字节
    3 v; q& D6 B6 H8 d& [; b
  48.     out     64h, al                 ; 发送命令字节3 w) r0 Z% u; r) g5 _7 \2 }7 ]
  49.     IODELAY2 {+ t5 Q  q( R9 Z+ l- G% X' W
  50. $ `+ {7 L3 S0 e% J2 Z2 e
  51.     xor     cx, cx                  ; 超时计数器(64K)6 C) C  ^& C9 j6 J" J3 e
  52. cmd_accept:5 _3 V* p  H4 g( O2 Y8 A* J
  53.     in      al, 64h                 ; 获取控制器状态
    7 ?: @$ Y) d* ]$ f3 m% r- [
  54.     IODELAY
    9 Y; d% E5 x7 d
  55.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完)$ x( t5 Q  Q: Z( A1 D% ]
  56.     jz      cmd_ok                  ; 缓冲区空,处理完# `: |% g0 m4 _) C, W( t6 E
  57.     loop    cmd_accept              ; 缓冲区满,重试
    , \  r- A0 Y; ]$ T
  58.     " z' z: w0 D, n( P" Q  }2 {! G+ l
  59. cmd_error:                          ; 超时失败2 a: e( _  _+ Y$ G* t7 u) H
  60.     mov     ah, 1                   ; 失败返回状态非零
    - Z' A5 `6 E% a+ j
  61.     jmp     cmd_exit
    # _: T, g+ I; K" w  d1 }- p
  62. 9 L0 ]6 }$ t6 |/ U& L4 d! y
  63. cmd_ok:
    " S8 v; [$ C' ^: e1 D% c% v
  64.     xor     ah, ah                  ; 成功返回零% i3 u1 P& ]9 y$ w/ u
  65.       L  _2 `0 `# ~3 |; Q6 R4 k
  66. cmd_exit:3 d# ~$ x' j7 i2 U7 P) L# w
  67.     ret
    2 ]7 Z5 ?' R, {# R: n( ~
  68. keyboard_cmd    ENDP' N' V3 b* P: f: r
  69. 8 Z& _2 e% j7 J$ z4 I4 O' D
  70.     END    START
复制代码
2、PORT 92h
8 S3 X6 e; `' E+ ~, N) x 从EISA系统之后,系统控制端口定义了一位用来快速重启的寄存器,就是在PORT 92h的Bit0,这种方式最终结果是和KBC一样的,HOST会拉CPU的INIT#以让系统重启。但这种方式不通过KBC,所以速度更快一点,代码如下:
  1. in al, 92h% g9 H7 x' b$ k0 c9 i2 J
  2. IODELAY- I* ^/ R4 C/ e
  3. or al, 1
    $ H0 ]3 K# F0 B. u; j/ S
  4. out 92h, al/ o: j% X. y9 o* s; O" [5 o. T! L0 f
  5. hlt2 |, P4 D2 m' t: s* j% m4 _
复制代码
3、Reset Control Register(Port CF9h)) [0 a. h7 ]2 V" m
用此方法控制Reset,各Chip极有可能各芯片产商的做法会不同。; _1 {7 u+ z9 M/ o, ~5 e
这里大家可以认识几种Reset的名词: Platform Reset, PCI Reset, System Reset, Reset CPU.我们来看Intel的文档,如下图:2 l3 {8 j, ?+ c% S0 v
          1.GIF
- _8 J1 {& H( V0 v5 W7 ~: ~- ~& J
; J& l; `! V, [3 }% a: Y 大家注意看,如果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。
7 N* ^8 Z+ B$ G6 K) D1 I ' o2 K& Z2 ~1 i- i9 }
因此你可以用下如代码Hard Reset:
  1. mov al, 6
    0 w+ Q( c0 @2 F! k
  2. mov dx, 0CF9h( \) ~( x2 q- ?+ ]& R1 R
  3. out dx, al
      P) V3 A# v9 t; _$ n6 k
  4. jmp $
    , M% g& e/ d8 b: Q% b. F7 i, u
复制代码
也可以用如下代码“关机”(看你的机器的做法,也就是对SLP_S3#,SLP_S4#,SLP_S5#的处理):
  1. mov al, 0Eh
    # m  q! S7 k) T' {
  2. mov dx, 0CF9h
    3 P- Q) _' H9 _2 M$ Y. e
  3. out dx, al; K1 L6 f) l) D2 A, T7 K2 Y9 l5 R3 Q
  4. jmp $% a% }. ~9 V" K, y) V7 s
复制代码
4、Ctrl+Alt+Del
4 Y- q# `3 z& @/ ^# Z    这种方法“基本”是在“DOS”下有效,教课书上常称为"热启"。键盘中断会hook住你的按键,Hook就是BIOS的INT 09h软中断,当你按下这三个键时,就相当于Far jmp到 F000:FFF0处。用如下代码在DOS可实现热启动。
  1.     jmp     F000:FFF0
    , U  B0 g# o! r8 J/ \/ X
  2.    
复制代码
OK,你对系统重启是否又清楚了一些呢?
发表于 2007-12-12 09:19:53 | 显示全部楼层

不错啊
回复

使用道具 举报

发表于 2007-12-12 16:10:17 | 显示全部楼层
不错,学习了。
; \3 w/ H: m! x/ h" M# J: h还有人这样写:
3 J! t/ L/ ^# ~! Z- Smov     dx, 64h  
+ V% ]$ ?% e/ N3 h8 x9 c. Y) }mov     al, 0FEh
- s+ [' c7 W2 ~1 R# e! F* g' \  Zout     dx, al          ) ~2 ?; p3 ^5 e4 H* f
in      al, 92h
: ?" M( x+ s" M. t( Cor      al, 1
% @0 k' h" o0 {out     92h, al
  B8 a% d7 ^+ i* t5 qmov     dx, 0CF9h
& d; X* C" r  s: i. l; T0 f8 Uin      al, dx3 g8 H& Z. T- V; [6 Z8 l
or      al, 61 x' f% g& E* i0 n
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 | 显示全部楼层
请教各位下 % W5 Y1 X7 [5 E3 t* [% X, \5 X7 [8 i/ l
经常看到 “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:8 _/ Q& |; T1 t# x
If(BIOS报告的ACPI Tabler版本>=2.0 && FADT中RESET_REG_SUP标志设置 && 系统中没有8042键盘控制器) {5 f8 _" M1 Z/ {, A2 `6 s
  通过FADT报的RESET REGister和REset value reboot;
, ^; c$ t% Q$ `+ `+ b2 o} else {6 e9 n5 L5 N  Y! s# W/ P
  port(64h)=0feh // 这种reset不是整个系统范围的reset,BIOS一般会检测到这种reset,并转换为RESET REG reset
6 \2 N9 S( h4 D! X( \; t}! \: h& o3 s7 R. v

$ p/ S  r& T0 M3 p* K如果是UEFI的Windows,可能通过ResetSystem() runtime service来reboot.
回复

使用道具 举报

发表于 2008-10-31 12:29:21 | 显示全部楼层
Reset Register=0xCF9, Reset Value=0x06 or 0x0E ?
" H9 e7 X. y1 S: h2 K; aReset 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
* w0 J( @6 u( m( c. NIODELAY2 i# E" @/ ?6 ?5 d
or al, 1+ w$ L" Q9 [& F; t' R' Y
out 92h, al: @" J2 v; h' Y: _5 y+ O
hlt& F; `9 W. K5 p7 e1 i% S. c+ b1 F; D

" j  Y# c8 J9 S% b" g  s这个 有个问题 在 PC技术内幕 中第13章 提到这个92h端口时,说了在MCA中bit0确实是做重启
  ^3 U8 o" L9 h. s但是在EISA中 bit0 只给了4个字的说明 :普通情况...1 L2 O; u) e0 b; U
不解ing....
' ]& r. Y3 v6 }( R9 _* F这样看 是不是 bit0 = 1也是做了重启?还是别的?
3 B+ n' A. P7 d而且我目前的水平还不知道该怎么验证?  也许我对MCA和EISA没吃透...
回复

使用道具 举报

发表于 2009-3-3 12:50:24 | 显示全部楼层
参照ICH spec中对92h的说明1 Q2 ]5 U) e1 n( s
INIT_NOW — R/W. When this bit transitions from a 0 to a 1, the Intel® ICH7 will force
0 A7 m8 q- x. g8 k# W! `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:
% T) f9 {! Y9 O) F( L, x) _( o   srcore,
. ~) [! |! @* c6 J% n" g      按照你所述,windows 下的重启,如果有KBC(EC),就是发0XFE吗?而我去追了一下,在EC收到0xFE 的地方 下了个断点,然后做windows 下重启, 以及CTRL+ALT+DEL,发现均没走这个流程,而是直接跑到了 EC check   warm reset 的位置去了(EC在不停的check  RSTRDY# 是否低,低则 warm reset )   ,难道是我们做的有问题?期待回复,谢谢!( q' B( H! m$ b) w$ C2 O
  melow 平台(SCH+AMI CORE8)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 03:58 , Processed in 0.055928 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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