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

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

[复制链接]
发表于 2007-12-11 15:23:54 | 显示全部楼层 |阅读模式
在和朋友聊天时,你是否碰到突然弹出一个重启?哈哈,也许你是中毒了,也许是系统更新.但重启,大家是否了解呢?本文将介绍几种重启行为,希望对大家有所帮助.
; g+ }( U/ J  E4 W# t7 s  X! @  ~6 @5 X
0 C( m) @& I6 L1、KBC Reset3 ^( ]7 ?) f8 S$ u) Q2 @, L
这是软件实现的一种重启方法,是AT系统的遗产。此种重启工作顺序为:软件发送0xFE至KBC,KBC收到后发送信息给南桥,南桥下拉CPU INIT# 大约16个PCI Clock让系统重启。代码如下:
  1. ;----------------------------------------------
    # b5 X% P; d0 t) L- C
  2. ; 文件名:KBCReset.asm; x& Z) C$ f* I
  3. ;----------------------------------------------  a: L1 }  \* @. ?2 g
  4. ;    2007-12-11    bini.Yi/易祝兵    For teaching
    ; P' Z9 I( j. T4 F* r- W8 o. w, m
  5. ;----------------------------------------------
    8 @# \$ S9 `" p& f
  6.     .386' T, U3 C# L% h# }9 L( ?3 l) c
  7.     .model tiny
    2 R' X- Y8 e9 b1 W
  8.     .code" T$ t" h7 Q  ~( E% @
  9.     org     100h3 i1 L- h- ]3 \8 T( j
  10.    
    ; M/ C# |; e( i" r! {
  11. ;; 如下代码参照 《PC技术内幕》第8章 键盘系统8 k! j# c  \) K" s6 N, Y
  12. 3 m- w6 z. t) C1 E' S2 _  h
  13. START:  B# m6 ~3 [0 V- C. B# H
  14.     mov     bl, 0FEh                ; KBC Reset命令
    ) t" Z3 j& }! m* }& j1 b7 I* g5 o8 b
  15.     call    keyboard_cmd            ; 不应该有返回3 a3 t+ u. C4 y% a3 k) R8 A" g- O
  16.     hlt' i- R1 n+ J! i" {, O, R& W7 u
  17. ; Y& ~) d. O# l4 n
  18. IODELAY MACRO
    : r! L; ]$ D# F
  19.     out    0EDh, al# S1 _4 x( @/ ~6 ^+ I: T) I
  20. ENDM
    4 R/ L& W  |3 l% U2 z6 _$ C
  21. 8 F0 K2 e* G; x( a2 h
  22. ;----------------------------------------------( M# f4 l4 |4 z& W
  23. ;    keyboard_cmd()
    9 D& L5 _3 v% G. o
  24. ;----------------------------------------------1 Z# z5 c0 m% h
  25. ;    如果由于缓冲区满超时,则 ah 返回非零
    9 X$ ~2 R$ Y5 O& u: O

  26. % p& `% ]  b& A3 d% w
  27. ;    调用    bl = 命令字节
    3 Z' M: T. [' }
  28. ;            ds = cs4 ?6 B4 z. k$ q. w# [0 W* u  W% ~
  29. ;
    ! E4 l  ?- N3 f9 @
  30. ;    返回    如果 ah =0,则成功
    & ^+ t4 C3 s. A: @$ ]7 x) S: B
  31. ;            如果 ah =1,则失败& c8 M0 b  h( d
  32. ;----------------------------------------------" B; f! ]3 A/ n+ v8 h2 g9 Z3 e$ r
  33. 0 I" ~  q" p5 V+ T/ S
  34. keyboard_cmd    PROC    NEAR& H* v  v# B$ q, Q
  35.     xor     cx, cx                  ; 超时计数器(64K)0 ~. W8 n; }1 `0 ^
  36. ) f$ O8 x, R- _: Q5 x2 q' K  c# r* v
  37. cmd_wait:1 e) D1 C" o  \) O- s" c
  38.     in      al, 64h                 ; 获取控制器状态2 M: E3 |' H/ Z; J1 y" X2 T
  39.     IODELAY
    ' G6 P$ j8 }- u- L# |
  40.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完)2 a$ o: E. _9 x: i) c# X% X
  41.     jz      cmd_send                ; 缓冲区空,准备接收命令.
    ; p6 X! [6 Q! v6 f' a
  42.     loop    cmd_wait                ; 缓冲区满,重试
    + @' h0 w) h) _5 |0 K
  43.    
    8 T0 x: v1 v  V9 e6 X: e, ~
  44.     jmp     cmd_error               ; 超时,失败7 C; C' \4 @$ _7 D' Q5 |
  45.    
    - Z, U) b9 w. p) Y% U5 j
  46. cmd_send:
    ) O0 s, E2 l+ D
  47.     mov     al, bl                  ; 取 bl 中的命令字节7 u  G7 L  [2 S9 z! O( y2 }* D2 ^
  48.     out     64h, al                 ; 发送命令字节4 f+ M/ e& i1 s. X1 V: M
  49.     IODELAY1 ]6 [2 a3 `2 \) d8 R
  50. / p# f# {0 ~" b+ l+ w( [+ ~
  51.     xor     cx, cx                  ; 超时计数器(64K); J& c* S3 `/ C% O+ O. d. |
  52. cmd_accept:
    & p. }( U# [/ ]: N" ~3 Z9 s
  53.     in      al, 64h                 ; 获取控制器状态% m! Y' K7 _. b  W* \9 G2 P
  54.     IODELAY* m! x, R0 U5 J  Q2 Q* ^+ t2 Y% _: G
  55.     test    al, 2                   ; bit1,输入缓冲区满?(控制器是否有数据没处理完)- w1 S4 S6 i: N
  56.     jz      cmd_ok                  ; 缓冲区空,处理完
    & w8 s% k" l7 k. i1 G3 R, m7 o
  57.     loop    cmd_accept              ; 缓冲区满,重试
    " t$ c$ j0 w( C$ C3 R2 _* t( A
  58.    
    # z, S( U; G4 d! c5 q1 P
  59. cmd_error:                          ; 超时失败: L6 c0 c" p/ x3 R" k9 _
  60.     mov     ah, 1                   ; 失败返回状态非零( C* v% @0 X4 o4 ^. C3 s
  61.     jmp     cmd_exit
    ) o" x/ W1 S1 G( N" a

  62. : z+ ?" a4 B$ k4 k0 @! q8 ]
  63. cmd_ok:
    $ M6 ^, o5 X; G9 Z$ @* c; r1 }
  64.     xor     ah, ah                  ; 成功返回零
    ( R' Q' }; A* i+ h
  65.     ' U# w9 D1 A( a7 K0 z
  66. cmd_exit:6 R' I9 C% K% N, Q: H
  67.     ret
    ) B) k/ E( Y- D
  68. keyboard_cmd    ENDP/ S! R$ @" z- z; d5 S

  69. # J# D: J. n- O
  70.     END    START
复制代码
2、PORT 92h
" s1 B# P1 l4 s. c$ W' a 从EISA系统之后,系统控制端口定义了一位用来快速重启的寄存器,就是在PORT 92h的Bit0,这种方式最终结果是和KBC一样的,HOST会拉CPU的INIT#以让系统重启。但这种方式不通过KBC,所以速度更快一点,代码如下:
  1. in al, 92h* h: ^4 U3 }" q; Z
  2. IODELAY" G; M4 S  ~6 p" @9 z5 Y) d* X+ _& k
  3. or al, 1
    0 B) d" c5 R5 Z, c8 ]) X0 C  y
  4. out 92h, al2 R0 d* _- l- _$ D# g6 l. |9 |
  5. hlt
    6 ^# N' Z1 m/ k2 V' M2 b
复制代码
3、Reset Control Register(Port CF9h)1 X4 ^! C' S! p5 Z: v
用此方法控制Reset,各Chip极有可能各芯片产商的做法会不同。
# l8 {9 z1 G: |. f4 X; ` 这里大家可以认识几种Reset的名词: Platform Reset, PCI Reset, System Reset, Reset CPU.我们来看Intel的文档,如下图:
) Y; N: |0 H* B" h' M          1.GIF 3 k7 n6 o# t& p8 {- |- l, h. x

. {# z1 ^# U8 X" \/ D 大家注意看,如果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。# l0 ?' ~0 G2 J
; U2 x7 c( _9 Q; q2 s
因此你可以用下如代码Hard Reset:
  1. mov al, 66 `( e( g& u  }: x( a
  2. mov dx, 0CF9h
    9 P3 p* f8 w  O
  3. out dx, al
    - D; G/ n  D$ y* I1 ~; {% Z
  4. jmp $) z. z4 f- }" t8 W1 T* o
复制代码
也可以用如下代码“关机”(看你的机器的做法,也就是对SLP_S3#,SLP_S4#,SLP_S5#的处理):
  1. mov al, 0Eh/ c) H9 s, a- p( i: |8 V9 W
  2. mov dx, 0CF9h
    7 k1 y0 `1 g# W
  3. out dx, al/ T" n$ A" h! w% p9 H" H
  4. jmp $+ I( ?# u: `0 ?( q
复制代码
4、Ctrl+Alt+Del
7 z( Y8 W) s! @- ^    这种方法“基本”是在“DOS”下有效,教课书上常称为"热启"。键盘中断会hook住你的按键,Hook就是BIOS的INT 09h软中断,当你按下这三个键时,就相当于Far jmp到 F000:FFF0处。用如下代码在DOS可实现热启动。
  1.     jmp     F000:FFF00 z5 a4 J% E5 z$ Y$ M
  2.    
复制代码
OK,你对系统重启是否又清楚了一些呢?
发表于 2007-12-12 09:19:53 | 显示全部楼层

不错啊
回复

使用道具 举报

发表于 2007-12-12 16:10:17 | 显示全部楼层
不错,学习了。
7 a) v' W5 g4 z2 B还有人这样写:
2 r  t) k4 ~7 l  Umov     dx, 64h  
  C! T; ^, y. A7 c+ Cmov     al, 0FEh
5 g- B$ g; E1 zout     dx, al          8 Y3 B; }: _5 e' |
in      al, 92h
/ w8 r5 G) H- r3 Q+ v7 N( j  qor      al, 1
* C2 @. y: l9 Sout     92h, al
" z; K  E1 J* `  `mov     dx, 0CF9h
/ ^6 f% k1 @2 c8 |  C2 \" k+ qin      al, dx! j/ p  q# J" A; @% X0 ?
or      al, 6
9 k1 o" k* u2 G. H8 ~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 | 显示全部楼层
请教各位下
- U0 h  l- i$ s0 z经常看到 “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:4 Y2 [# {# [8 P; X
If(BIOS报告的ACPI Tabler版本>=2.0 && FADT中RESET_REG_SUP标志设置 && 系统中没有8042键盘控制器) {
; M3 W; r& o3 E2 b1 w  通过FADT报的RESET REGister和REset value reboot;
% {* {6 g$ f" `} else {7 U) a7 V) |4 \- S5 p9 U7 b8 K
  port(64h)=0feh // 这种reset不是整个系统范围的reset,BIOS一般会检测到这种reset,并转换为RESET REG reset
) j7 G4 m3 t! d( p% x}: w3 a9 H  \/ |4 c

& |3 l9 k: W, `' z7 v如果是UEFI的Windows,可能通过ResetSystem() runtime service来reboot.
回复

使用道具 举报

发表于 2008-10-31 12:29:21 | 显示全部楼层
Reset Register=0xCF9, Reset Value=0x06 or 0x0E ?. Q6 L: v4 M0 C: r( ^& @8 Z
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# B' L# D1 B: b% R; n
IODELAY$ a' J9 F) C# B3 E
or al, 1
6 a6 u. O0 j6 gout 92h, al( K# h6 @+ H& ?/ |
hlt
- h" {2 @$ l) _2 F
! c9 ]" Q4 R, i' S+ O这个 有个问题 在 PC技术内幕 中第13章 提到这个92h端口时,说了在MCA中bit0确实是做重启7 C( A. [, k9 a. D, C
但是在EISA中 bit0 只给了4个字的说明 :普通情况...7 x6 Q& p; @, J2 Q6 {4 q
不解ing....
5 w2 `1 _% g  W. O# _; N& J这样看 是不是 bit0 = 1也是做了重启?还是别的?
6 C& [4 }" E6 H. Y1 c而且我目前的水平还不知道该怎么验证?  也许我对MCA和EISA没吃透...
回复

使用道具 举报

发表于 2009-3-3 12:50:24 | 显示全部楼层
参照ICH spec中对92h的说明
2 M% L' ^0 |1 m5 U! L8 j3 vINIT_NOW — R/W. When this bit transitions from a 0 to a 1, the Intel® ICH7 will force
0 F4 Q( }8 |+ |3 u8 HINIT# 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:+ w5 ^4 ]/ d* X0 F7 n
   srcore,
4 P( t, h: v( w: k# l$ Y/ d: G' p      按照你所述,windows 下的重启,如果有KBC(EC),就是发0XFE吗?而我去追了一下,在EC收到0xFE 的地方 下了个断点,然后做windows 下重启, 以及CTRL+ALT+DEL,发现均没走这个流程,而是直接跑到了 EC check   warm reset 的位置去了(EC在不停的check  RSTRDY# 是否低,低则 warm reset )   ,难道是我们做的有问题?期待回复,谢谢!. D+ G: J& W. w5 l2 t$ ?3 n
  melow 平台(SCH+AMI CORE8)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-8 08:10 , Processed in 0.358794 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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