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

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

[复制链接]
发表于 2008-9-2 14:45:45 | 显示全部楼层 |阅读模式
在UEFI的spec中,有定义event,timer和task priority Services,# Z7 C) m* G0 Y% y0 K6 C4 s1 O
一直都不怎么理解为什么要做出Event这样的一个机制?
) {  r, G8 m' ~) z, n+ ]; L1 W% R9 x3 L7 n$ T+ \5 j  B* w
Timer类型的Event,用于定时或者周期性的事件处理,比较准时的,(代替中断???)5 }" S3 e: N1 A5 ^5 B8 i
Wait类型的Event,应该算是查询或者等待事件的处理,如等待Keyboard和Mouse的输入,感觉像轮询;! I3 ^2 Q. v* Z' m& k9 _& J
还有Group类型的Event,用于处理具有相同类型的事件' D2 @! x- w0 K  o& z; j  f9 ^
一般的Signal的事件,目前就知道有Install Protocol的Callback功能,像PEI的Notify(Callback和Dispatch)3 j, }8 K' c% ]) m9 @
这些是我看Spec和Code的理解,感觉还是没有看懂,没有抓住实质,) k( D+ @: N* D# A
不知道各位对Event有什么样的理解??
发表于 2008-9-3 11:58:02 | 显示全部楼层

回复 1# 的帖子

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

使用道具 举报

 楼主| 发表于 2008-9-3 12:49:50 | 显示全部楼层
嗯,只有在RestoreTPL的时候才去处理所有pending的event.# q' j  i% K. o8 P
因为我看到有很多地方有RestoreTPL,很频繁地,) |0 O. M( T, W' e
所以只要我们Signal了Event,那么这个Event马上就会被Dispatch了吧?- M, h+ u! }4 q# c( b
# m3 b& {/ n4 e" ~
TPL的控制,. @1 a  S& s) x) \( l1 a; d
我觉得是,当比较关键的事情要处理,(如用于处理独占操作的,不能被打断的等)4 I9 H" _8 h8 e. g
不想被一般的事件打断时就会RaiseTPL来处理,
( O* x' D  D) N. Z! p4 j0 Y处理完,就会RestoreTPL了,
/ w, a3 Q1 Q+ r# j0 d. o- t当然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.- Z' n& q) @8 ^' ^. T% l7 Z& t+ K
  T2 j* a* k+ Y! R  `
我的意思是RestoreTPL这个被很频繁的调用,而且一般的Event(callback,notify)的TPL都>当前的TPL(driver=6)' L, X- J5 _- B  D
所以,就可以"认为":
. j4 e7 y( x9 v8 o! G' o0 A, E       "只要我们Signal了Event,那么这个Event马上就会被Dispatch了"
回复

使用道具 举报

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

回复 5# 的帖子

我想应该跟ring0到3类似,都是逻辑上对顺序的控制,况且32个好像也没有全用,估计用了一半吧,我猜的。0 D/ F: c5 f) X" J5 c4 B6 Q

* T8 Z$ x4 S0 s& ^* T" y而且restore调用应该不是很多吧,如果你signal一个就restore一个,那样设计这套代码的人也。。。。。。
* t9 }( t( p! s6 ~  I* i
1 T: s3 ^) W  I/ b5 [% {我个人理解,每次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属性。9 s4 L: \8 H3 [. m2 U& O
typedef
& F" ?- k9 [! Q6 R. P' |EFI_STATUS
+ `" ^: C" P/ pCreateEvent (0 b+ c- [" J* t; F' A4 L9 J. Y
IN UINT32 Type,
5 s* _, t( I) G' iIN EFI_TPL NotifyTpl,4 h# F  V: i8 A7 l  J! ^
IN EFI_EVENT_NOTIFY NotifyFunction, OPTIONAL
" i  E' k9 r1 t8 U! a/ J  DIN VOID *NotifyContext, OPTIONAL* K* [# v4 h: \# T! k2 W4 Y
OUT EFI_EVENT *Event" \  X+ y+ j3 ^' k' b, u+ G: |
);
' S" J, K4 u4 |+ z$ i, B中NotifyTpl的作用就是让NotifyFunction在NotifyTpl设定的level上工作,这样如果CreateEvent 是EVT_NOTIFY_SIGNAL的属性,那么在调用SignalEvent()后,只要当前TPL Level小于CreateEvent 的NotifyTpl,就会触发EVENT。
7 [: Q- v& d0 z* C) Q- i/ }使用EVT_NOTIFY_SIGNAL只是EVENT的一种方式。
回复

使用道具 举报

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

回复 9# 的帖子

可以请问一下,你自己建立Notify Signal Event 来做什么吗?或者 Notify TPL是多少?. p" c. G( ^4 V6 J$ f/ G' @7 q& @2 l
谢谢!
回复

使用道具 举报

发表于 2008-9-8 12:36:40 | 显示全部楼层
我写了个Driver,主要的工作就是当他之后执行的Driver被Load但没start前通知此driver。
# g* U1 ]7 f* ?7 J' sNotify TPL是EFI_TPL_CALLBACK,这里只要比EFI_TPL_APPLICATION大就可以了,因为driver的TPL是EFI_TPL_APPLICATION。
# I7 U. `5 Z- O5 s我在使用Notify Signal Event时的问题主要是有时候必须修改EDK本身的代码,我想了好久都没有别的好办法。大家看看有什么好办法既能通知事件的发生又不做代码改动呢?
回复

使用道具 举报

 楼主| 发表于 2008-9-9 17:06:50 | 显示全部楼层
一个想法:% i4 u% |! |  Q2 K, Q$ B2 b1 e
如果是Binding Protocol的Driver,在自己的Driver里面
9 o! V# n6 @: r3 Q5 n) K用LocateHandle(AllHandles,gEfiDriverBindingProtocolGuid,...)
2 F6 d, k* Z2 q$ f" D记录下当前的BindingHandles,然后在InstallProtocol  gEfiDriverBindingProtocolGuid上面挂一个Event,
4 Q" {& K& h/ U& X在Event的NotifyFunction里面6 y4 s* E4 R% m" b' U7 O
还是用LocateHandle(AllHandles,gEfiDriverBindingProtocolGuid,...)得到此时的BindingHandles
" l" u8 p; O- ]; x* x; h这样应该可以在Load新的driver时,SignalEvent并得到新load的driver的BindingHandle了
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

回复 14#的帖子

你的方法很好!
7 y4 s6 l, ?+ W8 P可以Hook到所有后面的driver!!! / i0 T3 R: X1 G: P: K

% `4 }8 D6 R; ~9 W* a回复 13#的帖子
) B( K) x' _/ f- F2 i) J在LoadImage中,会SignalEvent和RestoreTPL的,所以应该不用自己加
回复

使用道具 举报

发表于 2008-9-16 09:30:22 | 显示全部楼层
srcore的rigister是个好办法呀~
( ]! r* B2 Q# f/ X" |0 I# r
! }' c' J0 n7 I( [5 `3 [在LoadImage中,会SignalEvent和RestoreTPL的,所以应该不用自己加) x: y8 l# a- c
xtdumpling 我在代码中找了一下 没有发现LoadImage中SignalEvent的codes 能说下在哪个位置吗?谢啦。
回复

使用道具 举报

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

回16#

File: Image.c
6 f) Q! _% w  LCoreLoadImage()-->CoreLoadImageCommon():
+ m4 J) D* N( d8 w  //
0 ]$ b! o- X0 Q- V6 i  //Reinstall loaded image protocol to fire any notifications, K  y6 J  E( V7 a! X3 B6 D0 j
  //
" N0 T8 r, U6 J% Y  ]7 W3 |  Status = CoreReinstallProtocolInterface (
$ V" f, _* c  K             Image->Handle,. B% e" [# _3 f+ d* T6 K- Y) G
             &gEfiLoadedImageProtocolGuid,
, U0 g7 e, ~! o6 A             &Image->Info,2 Y, L" U# v+ R+ D" t0 S
             &Image->Info7 Y# U! d4 U% q( Q' P* d; o
             );% h9 g3 a, x7 T- m; s3 d5 w7 |; Y

$ K* r# b1 Z, @# _: uFile:Notify.c
9 r8 T$ \. ?5 x4 ?+ E6 x  ZCoreReinstallProtocolInterface()-->CoreNotifyProtocolEntry()-->CoreSignalEvent()
1 I/ X3 F$ s6 n, W0 |  J5 {CoreReinstallProtocolInterface()-->CoreReleaseProtocolLock()-->CoreReleaseLock()-->CoreRestoreTpl()
回复

使用道具 举报

发表于 2008-9-16 11:28:43 | 显示全部楼层
原帖由 xtdumpling 于 2008-9-16 11:01 发表
, O( D- c0 y# VFile: Image.c% z! T# c! t3 J& t! j$ E& ~
CoreLoadImage()-->CoreLoadImageCommon():
0 d! K5 Y" {/ V- m8 V! o( L  //
7 o) b2 W4 m0 S  //Reinstall loaded image protocol to fire any notifications
- v9 y' ], B1 Z% k1 a5 u$ ~  //
# Y4 A. V, c, r' A6 E  Status = CoreReinstallProtocolInterface (
- Q2 q5 F" e# z" O; V9 b             Image->Handle,
# H9 {) f' ]' h) g! ~  ...

: d' y8 x4 F; U) l; A! ^$ ` 5 P7 N1 P3 Z9 A# T/ @: `
感谢xtdumpling~!
回复

使用道具 举报

发表于 2008-9-16 12:08:01 | 显示全部楼层
有个新问题:
0 w2 D% ^. J: f$ ]9 u* ~. ?' HCoreSignalEvent()确实能通知Image被load了,但是如果要在自己的Driver中使用该Event,MS不行吧,要么还得改CreateEvent的事件函数? 好像还是不能不修改EDK的代码?xtdumpling有什么高见?
& \; o( K9 o* @4 n2 p' n! q) ^6 ]+ N( ^7 Z/ u
[ 本帖最后由 lisen4 于 2008-9-16 12:12 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2008-9-16 13:34:56 | 显示全部楼层
请楼上的兄弟分析下BS的RegisterProtocolNotify也就是CoreRegisterProtocolNotify是做什么用的?
1 N" |1 ?6 {- ~; b谢谢!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-25 03:29 , Processed in 0.045721 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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