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

在XP中如何寫application來發出SMI

[复制链接]
发表于 2009-4-16 20:55:54 | 显示全部楼层 |阅读模式
下面是我程式簡單的代碼,我想要在XP中寫一個簡單的程式來發出SMI,但是卻失敗了。: Z% D' u7 r4 G  y- R
想請問要做哪些修改才行? 我是在VC2005中編譯的0 P9 H- f0 q5 _2 E5 P: \" w* q/ J
: k5 N, ~" ?1 F* a, z7 n+ o; z
#define ASM
" x) K/ o3 B5 V* Z
5 A, ]# C) U# `( A/ UUSHORT al=0x8100;  U7 ^0 n2 ~; ^' U5 }& g2 g( g
#ifdef ASM- [3 x0 @: p: q
__asm {
6 K  \* L3 S* g  X& z* B8 M4 v) r  mov dx, 0b2h
' |# C; ^8 y8 d! d6 N  out dx, al
1 S6 m. ^# U' b& I' C/ \! Q4 F+ C" _}- i& d* d9 \* u$ }' c
#endif
 楼主| 发表于 2009-4-17 09:47:22 | 显示全部楼层
目前我另外使用了一個呼叫WINIO的程式,來更改位於 0xb2這個位址的I/o port,但更改後,似乎並沒有正確發出SMI,還要繼續研究。
回复

使用道具 举报

发表于 2009-4-17 10:56:15 | 显示全部楼层
你怎样确认SMI有无触发的?
回复

使用道具 举报

发表于 2009-4-17 12:59:16 | 显示全部楼层
首先确认可以在XP下读写IO 端口的权利,比如可以使用WinIO
: m5 v; q3 V1 i5 p8 ^, b' X4 @然后需要清除SMI status等寄存器,使能SMI,才能保证SMI的触发% D; M3 v  t# P5 w
没有想象中那么的简单
回复

使用道具 举报

 楼主| 发表于 2009-4-17 13:27:20 | 显示全部楼层
第一 我是用 SE.exe來看0xb2的值(原本為0xAA05),當我發送0x8100出去,
- x! O, W% U& T6 u/ W     但是在0xb2的值變成0xAA00,有一個byte的值並沒有成功更改。/ \( ~6 X3 S4 d
+ O5 i6 w1 `4 Q5 P5 L3 u
第二 則是用Debug Card來看,Debug Card會有一個byte的LED燈,起始值為"FF",, {1 p0 K( W. ?/ K$ v- f' {
     當成功下出SMI時,Debug Card會顯示"BH",可惜從頭到尾,
' {* W" @  Q  H% _( X& Z+ {     Debug Card的值都沒變過,即使我直接利用SE.exe更改0xb2的值。
回复

使用道具 举报

发表于 2009-4-17 14:22:57 | 显示全部楼层
请问你是做BIOS的吗?如果不是,你向你所编程的平台的BIOS工程师确认一下就行了。
0 f4 ~% V% V& x
9 {- b1 y( @+ a; V; Z5 d5 m假如按你第一点说明,我确认SMI已经触发了。& b9 ?) b  I: C/ s7 K2 O

# ?0 h" A4 s* k- @0 {* l8 p0 y. I如果你是做BIOS的,那实在的,你要先啃一下IA32 manual!这事不是你想象的那样“简单”,因为基本很少人会找几本Spec读给你听。
回复

使用道具 举报

 楼主| 发表于 2009-4-17 14:59:24 | 显示全部楼层
我不是bios工程師,我是在IC廠工作的,為了要配合某家主機板大廠,所以趕快survey相關的知識$ X$ @+ h6 m: v( `& B* Q0 s9 {- c/ j
真是博大精深押。其目的是為了要在OS中下SMI來切換兩個不同的chip。2 n0 z: i$ C0 r  O. b! D4 [+ U- X2 W4 j
0 W+ b" @2 l. N8 j6 ]9 d% _. o
[ 本帖最后由 bborg 于 2009-4-17 15:06 编辑 ]
回复

使用道具 举报

发表于 2009-4-18 00:07:53 | 显示全部楼层
依这样的情况,你就让这个机种的BIOS来做比较好。让他告诉你向0xB2和0xB3要写什么值。基本上在DOS下照样可以测试,不用进Windows。
回复

使用道具 举报

 楼主| 发表于 2009-4-20 00:21:45 | 显示全部楼层
感謝bini大,已經OK了,藉由winio來更改I/O port"0xb2"以發出SMI的方法是對了,; b0 k3 @+ x6 \! b) b% N' O' _
後來詢問bios工程師後,才發現在發出SMI之前,必須先設定一些暫存器的值,才能夠正確發出
+ V4 z( T+ N: x9 }0 I5 q! pSMI。
回复

使用道具 举报

发表于 2009-5-9 19:27:01 | 显示全部楼层
1.首先要确定你的平台用来触发SMI的IO PORT是B2H,如果没有记错的话,INTEL CHIP一般是使用B0H,AMD CHIP使用B2H。" v, o! B) e$ j/ l
2.当你往SMI PORT写值用来触发SMI,并不需要先设定暫存器的值。8 K3 e! E( K3 @1 G+ p5 q- I# |
3.现在问题来了,SMI触发后进入SMM MODE,CODE是怎么跑的?BIOS里面那么多的SMI HANDLE,不可能一个一个的都跑到吧。所以就有了一个验证的概念,BIOS 先去看对应的HANDLE所需要的条件是否符合,只有条件符合才会去执行对应HANDLE的CODE.这就是你说的先设定一些暂存器的值了,设定这些值只是为了让BIOS知道,这个SMI是你发出来的,然后去跑你为这个功能写的CODE.9 n( B4 u3 M/ W9 {3 R4 U
4.通常我们把这种功能叫做SW SMI Function.
回复

使用道具 举报

发表于 2009-5-19 10:33:08 | 显示全部楼层
上面这位  貌似  INTEL CHIP一般是使用B2H,AMD CHIP使用B0H吧
回复

使用道具 举报

 楼主| 发表于 2009-6-2 17:58:43 | 显示全部楼层
1. 因為winio沒有64bit的版本,於是自己寫了個I/O driver,大家可以參照下面這個source code。
# M8 h$ i3 f+ b$ M- E+ t, L9 ]        http://www.codeproject.com/KB/system/phymem.aspx: w% ~2 N  d; l" H- ?! Y
        此外由於64 bit 沒有support "inline assembly",所以必須用linking的方式連結起來。
1 ~; B$ N! `2 ]0 S$ O$ S0 l2. 關於kevin大的說法我能認同。但由於我針對特殊的spec,所以必須填入那些暫存器的值,以符合下游bios工程師的要求。
回复

使用道具 举报

发表于 2009-6-6 13:07:26 | 显示全部楼层
既然都到WINDOWS下了, 为什么还要用SMI处理? 直接走SCI不就更方便么?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 14:43 , Processed in 0.109257 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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