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

请教,UEFI中Event的理解? Why and when use event?

[复制链接]
发表于 2008-9-2 14:45:45 | 显示全部楼层 |阅读模式
在UEFI的spec中,有定义event,timer和task priority Services,- G3 A4 g; d; d$ t+ `0 L$ X! ?( o
一直都不怎么理解为什么要做出Event这样的一个机制?1 i) F0 ?7 f6 G$ o4 [- b
& D- v5 H( F$ B" G/ ]! `
Timer类型的Event,用于定时或者周期性的事件处理,比较准时的,(代替中断???)
5 b0 q+ W+ V& E) ]Wait类型的Event,应该算是查询或者等待事件的处理,如等待Keyboard和Mouse的输入,感觉像轮询;+ n7 ~' L7 c9 W
还有Group类型的Event,用于处理具有相同类型的事件
6 F2 `: _3 F& s一般的Signal的事件,目前就知道有Install Protocol的Callback功能,像PEI的Notify(Callback和Dispatch)5 y) H1 i& y+ r2 A. N$ x
这些是我看Spec和Code的理解,感觉还是没有看懂,没有抓住实质,7 G) |! j, D1 G
不知道各位对Event有什么样的理解??
发表于 2008-9-3 11:58:02 | 显示全部楼层

回复 1# 的帖子

只有在restoreTPL的时候才去处理所有的event的notify。建议你抽个时间去把event的那几个函数看看,还有TPL的rise和restore大概看一下就能明白了。
回复

使用道具 举报

 楼主| 发表于 2008-9-3 12:49:50 | 显示全部楼层
嗯,只有在RestoreTPL的时候才去处理所有pending的event.5 S9 X( w/ J( p/ E6 B7 }
因为我看到有很多地方有RestoreTPL,很频繁地,3 V/ y0 X) H% Q3 i# Z* j
所以只要我们Signal了Event,那么这个Event马上就会被Dispatch了吧?  a: t: V3 r* V0 A

8 H& ?! n3 y1 B) ZTPL的控制,) Q  ?7 J* q1 `" v, N
我觉得是,当比较关键的事情要处理,(如用于处理独占操作的,不能被打断的等)' b% h+ T- a9 q6 K7 M
不想被一般的事件打断时就会RaiseTPL来处理,4 c3 b7 E& K# W3 X
处理完,就会RestoreTPL了,% o" J. X$ Q6 {( a7 L
当然RestoreTPL还可以用于处理pending的Event.
回复

使用道具 举报

发表于 2008-9-3 15:13:21 | 显示全部楼层

回复 3# 的帖子

signal之后我想没有立刻dispatch吧。 xT你在好好看看restore的代码和notify的代码。
回复

使用道具 举报

 楼主| 发表于 2008-9-3 16:24:12 | 显示全部楼层

回复 4# 的帖子

对,Signal后只是将Event加入处理队列了,要等到下一个RestoreTPL,并且当前TPL低于Event的TPL才会被Dispatch.
0 r! b* i! h, c/ P
4 }4 i- ^% d% f! A; U! t: g2 m我的意思是RestoreTPL这个被很频繁的调用,而且一般的Event(callback,notify)的TPL都>当前的TPL(driver=6)$ B4 m* t4 W. B, d* `% }
所以,就可以"认为":
" k0 Q. |& m4 P" M1 J       "只要我们Signal了Event,那么这个Event马上就会被Dispatch了"
回复

使用道具 举报

发表于 2008-9-3 16:36:33 | 显示全部楼层

回复 5# 的帖子

我想应该跟ring0到3类似,都是逻辑上对顺序的控制,况且32个好像也没有全用,估计用了一半吧,我猜的。
* p7 C/ w# N# b) X) S7 p
5 y7 K; @* S8 h而且restore调用应该不是很多吧,如果你signal一个就restore一个,那样设计这套代码的人也。。。。。。 # y  i! e- W: {0 L" E/ h' A
& ?1 [& \' g' o2 f5 m) [( _8 S2 p
我个人理解,每次restore总是有目的或者到一定阶段了才restore,至于这些原则我就不知道了。
回复

使用道具 举报

 楼主| 发表于 2008-9-3 21:55:22 | 显示全部楼层
逻辑上对顺序的控制? 这个通过protocol的notify event可以做到,但是我觉得event的功能应该不仅限于此。
回复

使用道具 举报

发表于 2008-9-4 12:01:51 | 显示全部楼层
看到的就是表面的,背后的看不到。在黑暗中摸索吧
回复

使用道具 举报

发表于 2008-9-5 12:11:32 | 显示全部楼层
前几天用了EVENT的EVT_NOTIFY_SIGNAL属性。' K! A: V8 F& P* Y7 V5 L
typedef; I+ q6 o7 V( W/ Z6 V. j& S
EFI_STATUS. F/ O0 i; {0 V/ \0 Q7 q
CreateEvent (
3 n6 t) w! W9 o5 Y$ [$ \: DIN UINT32 Type,2 G6 L5 T* s! x! i
IN EFI_TPL NotifyTpl,( k! Z; x5 `6 Z$ O  U
IN EFI_EVENT_NOTIFY NotifyFunction, OPTIONAL
2 K# Y/ J9 i6 e2 ?) HIN VOID *NotifyContext, OPTIONAL" p" S* i; h* p( B# k5 z! W% C: P# ?
OUT EFI_EVENT *Event$ I1 \( {/ W! j9 B0 w( c
);% B! L  C4 Y+ C/ P6 G1 R# _9 X3 [
中NotifyTpl的作用就是让NotifyFunction在NotifyTpl设定的level上工作,这样如果CreateEvent 是EVT_NOTIFY_SIGNAL的属性,那么在调用SignalEvent()后,只要当前TPL Level小于CreateEvent 的NotifyTpl,就会触发EVENT。
7 x' j- s2 Q2 w# R2 w使用EVT_NOTIFY_SIGNAL只是EVENT的一种方式。
回复

使用道具 举报

 楼主| 发表于 2008-9-5 20:24:10 | 显示全部楼层

回复 9# 的帖子

可以请问一下,你自己建立Notify Signal Event 来做什么吗?或者 Notify TPL是多少?3 m1 c; |. p( ~1 G
谢谢!
回复

使用道具 举报

发表于 2008-9-8 12:36:40 | 显示全部楼层
我写了个Driver,主要的工作就是当他之后执行的Driver被Load但没start前通知此driver。
& C" U) \4 u+ E+ X3 |Notify TPL是EFI_TPL_CALLBACK,这里只要比EFI_TPL_APPLICATION大就可以了,因为driver的TPL是EFI_TPL_APPLICATION。7 C5 _$ `3 G# h, v# j# k4 a
我在使用Notify Signal Event时的问题主要是有时候必须修改EDK本身的代码,我想了好久都没有别的好办法。大家看看有什么好办法既能通知事件的发生又不做代码改动呢?
回复

使用道具 举报

 楼主| 发表于 2008-9-9 17:06:50 | 显示全部楼层
一个想法:
! Q& d6 c+ t$ j, v如果是Binding Protocol的Driver,在自己的Driver里面
- @& Q: W  L1 q. Q  H9 _- N8 T用LocateHandle(AllHandles,gEfiDriverBindingProtocolGuid,...)7 V6 c& R- l* Z' ~; ~6 p' i, q9 m
记录下当前的BindingHandles,然后在InstallProtocol  gEfiDriverBindingProtocolGuid上面挂一个Event,. m# F( F; p8 _) j2 Y$ ~4 |* z
在Event的NotifyFunction里面" Y, I- h! U" _: E3 k  z* [4 ]
还是用LocateHandle(AllHandles,gEfiDriverBindingProtocolGuid,...)得到此时的BindingHandles7 A  S# U: o: A3 |
这样应该可以在Load新的driver时,SignalEvent并得到新load的driver的BindingHandle了
回复

使用道具 举报

发表于 2008-9-11 12:59:04 | 显示全部楼层
方法很类似,你是在对特定的driver进行通知吧 我比较狠一点 哈哈 是在Image.c中的LoadImage的相关函数中加的Signal只要LoadImage 后就触发事件到NotifyFunction里面,然后再回来执行startimage。  g/ W" o3 }$ u: l6 {/ ?/ ~
哈哈 以后多交流 遇到能聊EFI的人不容易呀~!
回复

使用道具 举报

发表于 2008-9-12 10:02:06 | 显示全部楼层
register EFI Loaded Image Protocol的notification如何?
回复

使用道具 举报

 楼主| 发表于 2008-9-12 11:06:24 | 显示全部楼层

回复 14#的帖子

你的方法很好!
" X) H3 |0 P8 q4 f4 h( g5 u可以Hook到所有后面的driver!!!
% P9 c1 ]  h1 n, K
9 ?7 F; k- ?/ Q* T. L回复 13#的帖子
* i; k3 r8 S" Y6 I0 O8 o在LoadImage中,会SignalEvent和RestoreTPL的,所以应该不用自己加
回复

使用道具 举报

发表于 2008-9-16 09:30:22 | 显示全部楼层
srcore的rigister是个好办法呀~. M' N) R1 }5 k! K: m& i+ d
; s9 r. w- d7 ?
在LoadImage中,会SignalEvent和RestoreTPL的,所以应该不用自己加+ S( s& X  J6 z2 O- j3 K( m
xtdumpling 我在代码中找了一下 没有发现LoadImage中SignalEvent的codes 能说下在哪个位置吗?谢啦。
回复

使用道具 举报

 楼主| 发表于 2008-9-16 11:01:49 | 显示全部楼层

回16#

File: Image.c
; c7 {8 E% a" |  L5 gCoreLoadImage()-->CoreLoadImageCommon():5 L  N" r5 }1 L  t
  //: T8 _' \9 o( H7 g
  //Reinstall loaded image protocol to fire any notifications
* p/ n/ Y$ Q$ X8 I' S7 I8 g/ R3 N1 B  //* A3 s, K& T% U, H! ?
  Status = CoreReinstallProtocolInterface (0 l# K9 z: ]% I! \$ @$ i5 q
             Image->Handle,
. X* W0 S1 X3 ^9 y3 Z( B             &gEfiLoadedImageProtocolGuid,
" h" l* O9 O. [* _, Q             &Image->Info,
6 x( P, _# w1 `, w& S: `3 q             &Image->Info5 \# R- _7 S& q7 }* b! V6 Z9 i3 I; w
             );
; v/ \% K& q; U1 ^& X* n; j/ ^# Q2 a8 O0 J
File:Notify.c
+ m& N" Y6 Q+ L+ q- o  K' vCoreReinstallProtocolInterface()-->CoreNotifyProtocolEntry()-->CoreSignalEvent()# k2 u7 o6 N& y8 E
CoreReinstallProtocolInterface()-->CoreReleaseProtocolLock()-->CoreReleaseLock()-->CoreRestoreTpl()
回复

使用道具 举报

发表于 2008-9-16 11:28:43 | 显示全部楼层
原帖由 xtdumpling 于 2008-9-16 11:01 发表
& |, b" E3 D: ?% [- U0 G) ^- w! q6 `File: Image.c
3 D; X8 X$ h" t+ I1 o* k, BCoreLoadImage()-->CoreLoadImageCommon():
: f/ Q- w5 Q" A& L  //: ?" L; ?; Z/ s- G0 a
  //Reinstall loaded image protocol to fire any notifications4 E, |) u/ P: U2 s
  //, {) P3 @( K9 U: `# X  Z9 _$ G
  Status = CoreReinstallProtocolInterface (
* ~7 u: w0 j' L! T             Image->Handle,
4 M8 W) ~9 S' Y  ...
4 |3 Y6 T3 I. q9 W

  s0 N4 T6 D  K, u感谢xtdumpling~!
回复

使用道具 举报

发表于 2008-9-16 12:08:01 | 显示全部楼层
有个新问题:$ L+ ~9 I! E2 {6 ~4 w
CoreSignalEvent()确实能通知Image被load了,但是如果要在自己的Driver中使用该Event,MS不行吧,要么还得改CreateEvent的事件函数? 好像还是不能不修改EDK的代码?xtdumpling有什么高见?  n) \& f! h& g& ?5 A
, `8 _! Q# s6 h/ _0 i
[ 本帖最后由 lisen4 于 2008-9-16 12:12 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2008-9-16 13:34:56 | 显示全部楼层
请楼上的兄弟分析下BS的RegisterProtocolNotify也就是CoreRegisterProtocolNotify是做什么用的?) l1 v6 K) i) l+ h) H
谢谢!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-5 01:26 , Processed in 0.080195 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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