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

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

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

& H4 x: h& {6 D1、KBC Reset
* T4 {1 G/ p" R2 T 这是软件实现的一种重启方法,是AT系统的遗产。此种重启工作顺序为:软件发送0xFE至KBC,KBC收到后发送信息给南桥,南桥下拉CPU INIT# 大约16个PCI Clock让系统重启。代码如下:
  1. ;----------------------------------------------0 S# {: _7 ?- O' F
  2. ; 文件名:KBCReset.asm
    0 E, L# m+ C* d. M: {
  3. ;----------------------------------------------1 C3 z# y9 P# E5 U1 S# x+ R! y
  4. ;    2007-12-11    bini.Yi/易祝兵    For teaching
    : J5 J) s+ P' }8 e
  5. ;----------------------------------------------* M( A- @' c4 Z# O3 ]
  6.     .386$ }) K0 c) v* Q# C* |6 O& [! x
  7.     .model tiny9 G. p1 B2 g4 H6 n* n, K
  8.     .code; z8 k" G& H1 J1 _
  9.     org     100h
    ; g0 A0 S8 k- [3 {
  10.    
    % \  `7 O2 @/ \; `8 `" R
  11. ;; 如下代码参照 《PC技术内幕》第8章 键盘系统
    + t- X9 R6 N; {/ H: }' L9 B

  12. ' b3 O6 [, e$ u4 O
  13. START:" G0 |4 o7 P' u  T
  14.     mov     bl, 0FEh                ; KBC Reset命令" @1 a7 r' F5 f% h* h: N
  15.     call    keyboard_cmd            ; 不应该有返回
    & y( x2 H7 c/ n1 P! J' C
  16.     hlt
    " Z6 }; n5 C, S! m
  17. ' Y8 _/ r4 F6 O9 g7 P6 T1 J0 p
  18. IODELAY MACRO
    6 C* t  L' E: W" \( A4 b0 m
  19.     out    0EDh, al: `% d, v" S& o& ?2 r/ j/ H( P
  20. ENDM
    4 j! {& Y/ m1 D

  21. # A0 z7 k7 S* e$ S. \; m
  22. ;----------------------------------------------
    0 J1 s, _. |- L9 ~6 u
  23. ;    keyboard_cmd()( j  i0 z% U7 e! ~+ p5 o
  24. ;----------------------------------------------" T5 H9 v! A* a7 z+ W/ t
  25. ;    如果由于缓冲区满超时,则 ah 返回非零
    " F/ L* C- M  z( F* M# u
  26. ! ^: I" ]3 v5 Z6 K
  27. ;    调用    bl = 命令字节; x7 C5 ~6 w# s) F  j9 d9 k3 _  ^6 i
  28. ;            ds = cs4 C# @8 e3 f7 p& `: x
  29. ;
    8 @, g8 p2 F) Q5 P
  30. ;    返回    如果 ah =0,则成功% F8 n: ^- ~& j3 g# @
  31. ;            如果 ah =1,则失败0 R# f6 p% V0 h
  32. ;----------------------------------------------  a- q0 s; ]" ?: E( C& r
  33. & \: w6 M8 m* ~$ d: X
  34. keyboard_cmd    PROC    NEAR
    5 [, t  A0 b) `5 g8 O" f
  35.     xor     cx, cx                  ; 超时计数器(64K)
    0 f% w9 L- d8 l  u1 @
  36. 5 S* ]( r; A0 W/ L" k. s# e
  37. cmd_wait:
    / S- g7 s( ~6 Z, p( h% Y
  38.     in      al, 64h                 ; 获取控制器状态7 e: ^- B# V& z9 V* W3 B% `
  39.     IODELAY. _2 w$ G2 [& h* J- B: X
  40.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完)" Q( S: [1 K% H& n
  41.     jz      cmd_send                ; 缓冲区空,准备接收命令.  W$ E( P# F+ S
  42.     loop    cmd_wait                ; 缓冲区满,重试2 `+ X& b, W* r5 ~5 I( @
  43.    
    & I/ X* V3 p2 K! @2 F. q( h% Y
  44.     jmp     cmd_error               ; 超时,失败
    1 E# g' D( [6 W& d4 l7 E5 I# A- q
  45.    
    8 [& r( Q" O' g
  46. cmd_send:
    ) @9 C( l5 K% [8 v4 y; o* ]  p
  47.     mov     al, bl                  ; 取 bl 中的命令字节
    2 y; a# t! G* g5 E- L
  48.     out     64h, al                 ; 发送命令字节2 e% I* c! i2 t
  49.     IODELAY
    % h3 G% R- W' V

  50. % Y4 l( j: t  b7 R+ k9 C% Z
  51.     xor     cx, cx                  ; 超时计数器(64K)
    $ @$ ~# e; C3 t1 ?3 }. e. W
  52. cmd_accept:( g0 W9 ~6 G) h9 _/ r
  53.     in      al, 64h                 ; 获取控制器状态! U# F( f" [8 M9 f- y0 x
  54.     IODELAY- [* R. \0 L' Y
  55.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完)# b) O) Z( v' n5 r  G$ _
  56.     jz      cmd_ok                  ; 缓冲区空,处理完4 b) s% G" {* Z. i
  57.     loop    cmd_accept              ; 缓冲区满,重试  G. X7 k6 V& K; x) y5 j
  58.     6 H  b7 C( Q  Z& b  ~5 l
  59. cmd_error:                          ; 超时失败
      E( T( m' ?4 K- n$ c" F5 ?& a
  60.     mov     ah, 1                   ; 失败返回状态非零/ T( h5 B" m3 f$ D
  61.     jmp     cmd_exit
    5 U. I% V7 X  ^9 p2 [- o

  62. 7 f& l, Z: b* o$ K5 X2 R
  63. cmd_ok:4 h( ]- u4 V+ S! I; a5 E
  64.     xor     ah, ah                  ; 成功返回零
    ! Q" P( ^! _$ W( i" T4 T" }
  65.     6 W+ z. D7 t  W
  66. cmd_exit:* @% a( I1 @; T; Z% w& y
  67.     ret
    * ~+ t" a3 m8 C& i0 M
  68. keyboard_cmd    ENDP4 P7 k5 W, f/ ^1 \7 g
  69. 1 x+ l4 d% E1 w6 n$ k4 F
  70.     END    START
复制代码
2、PORT 92h) z- C2 I& c6 M0 b4 S! x
从EISA系统之后,系统控制端口定义了一位用来快速重启的寄存器,就是在PORT 92h的Bit0,这种方式最终结果是和KBC一样的,HOST会拉CPU的INIT#以让系统重启。但这种方式不通过KBC,所以速度更快一点,代码如下:
  1. in al, 92h
    $ X3 G5 L) N& z; {5 Z" q7 X
  2. IODELAY
    6 }1 v! d4 \5 O+ _; a
  3. or al, 1
    ( M% |' F8 @: u
  4. out 92h, al
    - V: A- E7 [! K4 T/ C! n7 |- X
  5. hlt
    ) A+ p& ~0 ^, ]4 N* c
复制代码
3、Reset Control Register(Port CF9h), l" F$ ~: s$ x8 u/ z2 }
用此方法控制Reset,各Chip极有可能各芯片产商的做法会不同。* I. M. Z3 \2 u) j7 ^
这里大家可以认识几种Reset的名词: Platform Reset, PCI Reset, System Reset, Reset CPU.我们来看Intel的文档,如下图:' I# C5 e5 [) F$ g5 q
          1.GIF
% X5 O3 L/ v- y# H* C; `# e ( h' [/ \2 i. r; G" c9 o" g# j
大家注意看,如果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。% H4 f; w4 k% i3 Y& J6 @
7 q  l6 k" x5 L  T  w: j2 @: a
因此你可以用下如代码Hard Reset:
  1. mov al, 6
    # Q" e' Y6 D- g
  2. mov dx, 0CF9h
    & I8 m5 u4 I" l4 R* e- P( }
  3. out dx, al. @6 ^8 v& S$ C7 W% V
  4. jmp $
    8 j$ K. L- `: |3 O% g; ~7 ?
复制代码
也可以用如下代码“关机”(看你的机器的做法,也就是对SLP_S3#,SLP_S4#,SLP_S5#的处理):
  1. mov al, 0Eh
    $ @& j4 Y; B( B( P5 p/ P
  2. mov dx, 0CF9h3 M5 v1 R5 M  J; P: y
  3. out dx, al
    ( g& s! g* M: n4 L6 N% M. P
  4. jmp $& A) D$ x+ W1 e
复制代码
4、Ctrl+Alt+Del
: N% I: G+ b$ R' J    这种方法“基本”是在“DOS”下有效,教课书上常称为"热启"。键盘中断会hook住你的按键,Hook就是BIOS的INT 09h软中断,当你按下这三个键时,就相当于Far jmp到 F000:FFF0处。用如下代码在DOS可实现热启动。
  1.     jmp     F000:FFF0
    0 e8 y( ~9 E8 R5 n; j
  2.    
复制代码
OK,你对系统重启是否又清楚了一些呢?
发表于 2007-12-12 09:19:53 | 显示全部楼层

不错啊
回复

使用道具 举报

发表于 2007-12-12 16:10:17 | 显示全部楼层
不错,学习了。) ]5 D/ K6 j6 F( K
还有人这样写:, U0 H( F1 B6 Q  x
mov     dx, 64h  1 H9 {7 ^" u" q: ]- ]2 M
mov     al, 0FEh ' f" e3 i4 F6 d
out     dx, al          + {7 `6 h9 Q. O* W+ A6 k/ a
in      al, 92h
1 V' W) f: w( a6 S' i! |' Ior      al, 1
, g8 o2 }5 b, g$ Eout     92h, al! B4 G  H3 @5 k, K: B
mov     dx, 0CF9h
# W/ o0 F5 t6 p) rin      al, dx* a/ d/ _+ c* E% h! a" m
or      al, 6: }3 d8 u! c& L" h# m
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 | 显示全部楼层
请教各位下 8 ^/ g  L# k7 Q* 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:0 {1 i* Z+ U; \% y* m
If(BIOS报告的ACPI Tabler版本>=2.0 && FADT中RESET_REG_SUP标志设置 && 系统中没有8042键盘控制器) {
8 P# i$ k) z6 f  通过FADT报的RESET REGister和REset value reboot;
; y/ E2 V, z' T$ G9 r} else {, [% Y- j# p3 ]2 \
  port(64h)=0feh // 这种reset不是整个系统范围的reset,BIOS一般会检测到这种reset,并转换为RESET REG reset
0 ]1 x1 B1 R* R}2 f+ r5 U% p6 R. Z8 F3 Y" P+ ]

# j, ?7 P; ?8 H( _) r如果是UEFI的Windows,可能通过ResetSystem() runtime service来reboot.
回复

使用道具 举报

发表于 2008-10-31 12:29:21 | 显示全部楼层
Reset Register=0xCF9, Reset Value=0x06 or 0x0E ?, ]: c2 z: x8 p3 u# }
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
4 M1 i- d' K. O7 [  z) ]IODELAY  m' E0 x# F& B" m6 Z7 j
or al, 1: V, y, l9 p9 Q9 ~4 n
out 92h, al' L, p7 l5 W% Q
hlt
; _2 P, t: W4 Y: m) E
9 O+ n7 V  \' f/ a) f/ k这个 有个问题 在 PC技术内幕 中第13章 提到这个92h端口时,说了在MCA中bit0确实是做重启( X; M# @9 C+ E1 R9 W
但是在EISA中 bit0 只给了4个字的说明 :普通情况...2 g0 h+ f0 J6 S: A# F! x/ L
不解ing....4 H7 y" a7 B! M0 m; m0 [8 U0 V
这样看 是不是 bit0 = 1也是做了重启?还是别的?
: `; p- ?* g& ^而且我目前的水平还不知道该怎么验证?  也许我对MCA和EISA没吃透...
回复

使用道具 举报

发表于 2009-3-3 12:50:24 | 显示全部楼层
参照ICH spec中对92h的说明( B% ^$ G% E1 f# {: h( x7 W
INIT_NOW — R/W. When this bit transitions from a 0 to a 1, the Intel® ICH7 will force5 l# s! r8 B& [: x+ p5 n# j
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:! A0 }4 X4 e9 m% C: B0 i* E% W5 q3 ^
   srcore,
" L! u% K" |# l5 ^& E+ p      按照你所述,windows 下的重启,如果有KBC(EC),就是发0XFE吗?而我去追了一下,在EC收到0xFE 的地方 下了个断点,然后做windows 下重启, 以及CTRL+ALT+DEL,发现均没走这个流程,而是直接跑到了 EC check   warm reset 的位置去了(EC在不停的check  RSTRDY# 是否低,低则 warm reset )   ,难道是我们做的有问题?期待回复,谢谢!5 y; q& t1 A% s1 R. H, t: J
  melow 平台(SCH+AMI CORE8)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-18 18:40 , Processed in 0.122070 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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