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

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

[复制链接]
发表于 2007-12-11 15:23:54 | 显示全部楼层 |阅读模式
在和朋友聊天时,你是否碰到突然弹出一个重启?哈哈,也许你是中毒了,也许是系统更新.但重启,大家是否了解呢?本文将介绍几种重启行为,希望对大家有所帮助.
7 {) f% w) r: |4 c4 q$ D
7 |. w# g; R2 k' E2 R1、KBC Reset0 h) \3 l. }0 q5 E4 h9 j- n
这是软件实现的一种重启方法,是AT系统的遗产。此种重启工作顺序为:软件发送0xFE至KBC,KBC收到后发送信息给南桥,南桥下拉CPU INIT# 大约16个PCI Clock让系统重启。代码如下:
  1. ;----------------------------------------------; m2 ?5 q# c" K" U" ]* D& W# b5 g- F8 H
  2. ; 文件名:KBCReset.asm
    9 [- j1 @6 t" d' f# N  y7 }
  3. ;----------------------------------------------
    9 t+ F' Z. O9 w5 x! h
  4. ;    2007-12-11    bini.Yi/易祝兵    For teaching
    ' f* R$ i6 U( j0 S/ k4 _2 Q5 U
  5. ;----------------------------------------------
    + o7 h! P4 X0 U5 a& }: W5 T1 D
  6.     .386
    1 T& q: `5 C# o
  7.     .model tiny5 I/ Y3 M* F7 [6 d! f' m
  8.     .code3 Q9 k, G' ~+ E
  9.     org     100h
    4 c) {, J- C( i! J' {4 S7 I
  10.     ( a. k# Z" v9 x" z" O4 u
  11. ;; 如下代码参照 《PC技术内幕》第8章 键盘系统6 R0 F; w" H) @$ s( \% _) w' N
  12. ( w- h2 o2 X$ |3 g* }
  13. START:  e: x7 j! B1 U# e4 A
  14.     mov     bl, 0FEh                ; KBC Reset命令3 W; @4 `: b' g* b* f/ L
  15.     call    keyboard_cmd            ; 不应该有返回
    - x. D" M' ], I) f, I: O
  16.     hlt8 g, d  z6 z! u$ a$ R% c) ^
  17. + b$ F5 J# D3 ?. z
  18. IODELAY MACRO
    7 n8 `5 K2 {6 s7 A5 n
  19.     out    0EDh, al
    % _( f+ H+ M( I9 f
  20. ENDM/ v( ]1 r" T9 T$ i1 N

  21. ; `- T5 P1 H) o1 ?# ~' _6 D
  22. ;----------------------------------------------
    1 z4 W% Y& a% D/ |8 Z# k9 s
  23. ;    keyboard_cmd()
    : x  V; b3 E# f- Z( J  b7 X
  24. ;----------------------------------------------$ \; {7 N, Z) t* e) Y1 m7 K- P
  25. ;    如果由于缓冲区满超时,则 ah 返回非零6 ^7 a: N; a1 ~3 }- e  ^6 H

  26. % C$ n, p( s) N
  27. ;    调用    bl = 命令字节
    6 }) I; O6 C/ V, x
  28. ;            ds = cs
    2 @, [' K: k  a) W) l  e& _
  29. ;
    3 G' W4 O8 W' U% o8 A1 l1 ?
  30. ;    返回    如果 ah =0,则成功) u6 G; ~: L$ U; ^9 X* M$ V/ k5 [
  31. ;            如果 ah =1,则失败1 i  N) }, \2 e- |# U
  32. ;----------------------------------------------, w3 Q- I* ]% T  u
  33. ' n. L- z/ g( T* a# U" K) Q  v
  34. keyboard_cmd    PROC    NEAR
    % O& h. l6 S$ C8 l& Y- t/ t5 X/ _
  35.     xor     cx, cx                  ; 超时计数器(64K)+ e1 @! f" D, c, M! t6 C8 f, `! g. e
  36. " v; A5 X# D, C2 U: D% Y1 {, M
  37. cmd_wait:
    ' g. _% R2 m! ?. K# w. l" k6 n/ N2 ]
  38.     in      al, 64h                 ; 获取控制器状态
    % |4 ~+ ?5 B  T  Q' `3 u$ ~
  39.     IODELAY" N# u5 P" C2 X/ U3 I& K! K4 O+ p# G, a
  40.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完)
    ( _3 f. d2 F: b/ j/ O4 V
  41.     jz      cmd_send                ; 缓冲区空,准备接收命令.. W9 D1 j9 p* K1 m
  42.     loop    cmd_wait                ; 缓冲区满,重试" a' A8 a/ Q) ]4 l; k$ b! c+ G
  43.    
    - ^, w. o5 F- F) N: r
  44.     jmp     cmd_error               ; 超时,失败' m" ?4 _3 k* b: K
  45.     ( `# i) u: C3 J+ u! m
  46. cmd_send:6 W6 `+ P5 i8 K: R. R; Y! `
  47.     mov     al, bl                  ; 取 bl 中的命令字节
    # \0 i8 E$ G" u5 _7 x/ k) b
  48.     out     64h, al                 ; 发送命令字节
    . D9 N/ N  a0 y5 v5 |2 J7 o$ C% u/ {/ n
  49.     IODELAY# {  s2 R1 C' i) K4 s. h! `
  50. 7 g3 u' J+ z/ [) V& L; @/ M2 X1 o
  51.     xor     cx, cx                  ; 超时计数器(64K). n" N/ e- M" J8 \
  52. cmd_accept:
    2 I; p- U- O  d+ }1 S7 h$ R2 y/ Q9 ?/ k( n
  53.     in      al, 64h                 ; 获取控制器状态. D' w9 q. y. c" |% x: L8 @
  54.     IODELAY
      i1 f3 T4 h) _8 V3 a) T
  55.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完)
    6 T$ |( Y0 ^7 d, _, e3 o2 Z: }
  56.     jz      cmd_ok                  ; 缓冲区空,处理完
    % G) }9 ]* Y  i4 [8 a7 F" k
  57.     loop    cmd_accept              ; 缓冲区满,重试' M! }, G; R9 _1 H7 m& U
  58.       n7 |! v+ @  ~( @* K
  59. cmd_error:                          ; 超时失败& I  V2 z% e* B$ s) |
  60.     mov     ah, 1                   ; 失败返回状态非零( [0 e7 I& ]( @- @+ J. K) Z/ g
  61.     jmp     cmd_exit
    & C6 w$ y# X* D* ~6 N) I7 Z

  62. - ?& o+ A+ R9 X
  63. cmd_ok:
    + X6 z% p" m; F/ x
  64.     xor     ah, ah                  ; 成功返回零
    + {5 b: V& \- C9 d6 K
  65.    
    , M& @/ b' c. m/ D% b
  66. cmd_exit:
    : Q1 {  q# E1 C, a* }* P
  67.     ret
    9 [! q; R: y; e$ B9 N) |9 ?4 S$ Q+ I( l
  68. keyboard_cmd    ENDP
    8 `- h  a, B$ l5 J* T$ S% m

  69. 4 K# v6 u( D' N
  70.     END    START
复制代码
2、PORT 92h
6 F5 B0 s* r8 `( v+ [% @5 B 从EISA系统之后,系统控制端口定义了一位用来快速重启的寄存器,就是在PORT 92h的Bit0,这种方式最终结果是和KBC一样的,HOST会拉CPU的INIT#以让系统重启。但这种方式不通过KBC,所以速度更快一点,代码如下:
  1. in al, 92h9 H) M9 R3 p( b; k+ z7 d5 p8 p3 L
  2. IODELAY7 ~- c4 G' S3 _. p0 `" O* U
  3. or al, 1
    . }' X5 W$ D  i; N2 w8 D4 ~+ k* w# J
  4. out 92h, al
    ) g: O+ Q5 H- H( i
  5. hlt
    ) E8 w) p5 V( `, `4 U. }
复制代码
3、Reset Control Register(Port CF9h)
0 ~  g0 t  r' r  d5 _ 用此方法控制Reset,各Chip极有可能各芯片产商的做法会不同。: K1 d" n  Q$ X' P  I3 `
这里大家可以认识几种Reset的名词: Platform Reset, PCI Reset, System Reset, Reset CPU.我们来看Intel的文档,如下图:
% T& V$ N% m6 |; G          1.GIF : E# B6 s% x+ ^  C4 D5 d6 ]
5 F3 _" |" Q% L$ i! `; z. {. 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。
! t" ]) L1 l& N: \7 F& t 2 V- o3 R+ z. z* H/ O% d
因此你可以用下如代码Hard Reset:
  1. mov al, 6
    0 i! @4 K$ f2 _
  2. mov dx, 0CF9h
    2 v& C/ J: v. W, @
  3. out dx, al
    ) @8 M6 L$ p1 t+ z8 `
  4. jmp $
    1 `2 x' d. N- C' J# m* {) r
复制代码
也可以用如下代码“关机”(看你的机器的做法,也就是对SLP_S3#,SLP_S4#,SLP_S5#的处理):
  1. mov al, 0Eh
    # a' L! V5 C' ]/ z* r
  2. mov dx, 0CF9h
    5 m! D- S2 V1 L; i0 m0 J
  3. out dx, al
    6 a9 y+ J, a( u* p& d5 `$ c/ T9 c0 z
  4. jmp $) T7 |# V3 B+ ?0 [# E
复制代码
4、Ctrl+Alt+Del1 @1 Y  S6 q) k& x/ d1 z
    这种方法“基本”是在“DOS”下有效,教课书上常称为"热启"。键盘中断会hook住你的按键,Hook就是BIOS的INT 09h软中断,当你按下这三个键时,就相当于Far jmp到 F000:FFF0处。用如下代码在DOS可实现热启动。
  1.     jmp     F000:FFF0
      ?' t+ @) y, D
  2.    
复制代码
OK,你对系统重启是否又清楚了一些呢?
发表于 2007-12-12 09:19:53 | 显示全部楼层

不错啊
回复

使用道具 举报

发表于 2007-12-12 16:10:17 | 显示全部楼层
不错,学习了。
2 a" [& x$ Q8 d# c+ c$ c7 Z还有人这样写:
/ \. s: c4 k, Q8 `mov     dx, 64h  ! I" a. C& `' e
mov     al, 0FEh 3 L2 `+ n, N" t/ x, V  F' r
out     dx, al         
+ r. \2 U* V6 @5 y% hin      al, 92h$ s5 B7 ^, w5 e! t! j
or      al, 1! }$ J9 x) Q$ f# [  {. d4 V
out     92h, al
: q" ~3 A: P1 ]mov     dx, 0CF9h
) ]' T) H  K1 w7 S7 cin      al, dx, P: `8 X9 M# ?8 o- g& E
or      al, 6
# D; w9 I4 K' h  Z  ^( i% T5 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 | 显示全部楼层
请教各位下
" m& }5 ^& g. E( w/ L0 O, K经常看到 “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:! G6 ^* A% N3 x
If(BIOS报告的ACPI Tabler版本>=2.0 && FADT中RESET_REG_SUP标志设置 && 系统中没有8042键盘控制器) {
' O' C1 w& R3 ]  通过FADT报的RESET REGister和REset value reboot;" L: C5 F4 I: Z1 g9 j3 A. q4 b
} else {* Z+ d/ p5 S% s: p1 O  l3 Y- G- ]) f
  port(64h)=0feh // 这种reset不是整个系统范围的reset,BIOS一般会检测到这种reset,并转换为RESET REG reset
5 {3 {3 h; {! ]7 i, _: b}
( Y3 U6 C" b) l9 w  G  d$ @
) n" V' l; A/ y8 X. K如果是UEFI的Windows,可能通过ResetSystem() runtime service来reboot.
回复

使用道具 举报

发表于 2008-10-31 12:29:21 | 显示全部楼层
Reset Register=0xCF9, Reset Value=0x06 or 0x0E ?
5 y! c* P. c. H" o' V9 f* R4 OReset 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, 92h1 Z8 d. m; b( c- r$ g. F1 ~
IODELAY
, ^& b6 `% t. f+ f/ Cor al, 1) j, {% S8 r: x
out 92h, al
2 c0 N7 \  y& i( E7 E- O. I9 ]hlt
, Q7 K4 d3 G( \0 Z
9 @8 x( F1 T2 l* |5 d- W! ?' ~! I# |这个 有个问题 在 PC技术内幕 中第13章 提到这个92h端口时,说了在MCA中bit0确实是做重启+ L" h( O' W* h0 x' b+ N' h+ _
但是在EISA中 bit0 只给了4个字的说明 :普通情况...  {. j7 x6 w: M$ p( @3 f
不解ing....; T1 t9 D* E% j$ T% z
这样看 是不是 bit0 = 1也是做了重启?还是别的?
8 S* Y/ J6 \' p# W+ d而且我目前的水平还不知道该怎么验证?  也许我对MCA和EISA没吃透...
回复

使用道具 举报

发表于 2009-3-3 12:50:24 | 显示全部楼层
参照ICH spec中对92h的说明6 J0 M3 C" Y! a  w$ K
INIT_NOW — R/W. When this bit transitions from a 0 to a 1, the Intel® ICH7 will force
- ^1 @' D- h- O, h) X$ X3 Q) c4 `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:1 E* Z! x; x' k: z
   srcore,/ _  E  z$ x0 x# T2 I, d
      按照你所述,windows 下的重启,如果有KBC(EC),就是发0XFE吗?而我去追了一下,在EC收到0xFE 的地方 下了个断点,然后做windows 下重启, 以及CTRL+ALT+DEL,发现均没走这个流程,而是直接跑到了 EC check   warm reset 的位置去了(EC在不停的check  RSTRDY# 是否低,低则 warm reset )   ,难道是我们做的有问题?期待回复,谢谢!( u9 f! z/ O( k! _2 E
  melow 平台(SCH+AMI CORE8)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-20 03:46 , Processed in 0.047399 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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