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

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

[复制链接]
发表于 2008-9-2 14:45:45 | 显示全部楼层 |阅读模式
在UEFI的spec中,有定义event,timer和task priority Services,4 S6 A5 G" L$ d* o# t4 l
一直都不怎么理解为什么要做出Event这样的一个机制?7 S( ^( [* H! h7 i+ v1 O+ s

: |: o5 X1 M1 i( @$ g! u' J( V% \; {Timer类型的Event,用于定时或者周期性的事件处理,比较准时的,(代替中断???). L  U# U' C4 B) `! H
Wait类型的Event,应该算是查询或者等待事件的处理,如等待Keyboard和Mouse的输入,感觉像轮询;2 T  b2 e: \  Y+ g
还有Group类型的Event,用于处理具有相同类型的事件
6 U% T- a1 I- z9 f$ J一般的Signal的事件,目前就知道有Install Protocol的Callback功能,像PEI的Notify(Callback和Dispatch)+ R2 K2 z* Q0 J  D3 F" [, H
这些是我看Spec和Code的理解,感觉还是没有看懂,没有抓住实质,
# a: c; z/ A- w, [+ l" @不知道各位对Event有什么样的理解??
发表于 2008-9-3 11:58:02 | 显示全部楼层

回复 1# 的帖子

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

使用道具 举报

 楼主| 发表于 2008-9-3 12:49:50 | 显示全部楼层
嗯,只有在RestoreTPL的时候才去处理所有pending的event.' J* p" K) f, O0 K$ i$ S# C% m& h
因为我看到有很多地方有RestoreTPL,很频繁地,
6 h- K# f. |8 f" A6 t! M所以只要我们Signal了Event,那么这个Event马上就会被Dispatch了吧?
+ X4 E: b; u0 o6 O
6 v# h# \$ O* I+ b* v9 J$ X" kTPL的控制,
5 v% F1 m4 V3 l# p) m& [我觉得是,当比较关键的事情要处理,(如用于处理独占操作的,不能被打断的等)7 B6 x- X7 u$ N/ w+ N. c1 y
不想被一般的事件打断时就会RaiseTPL来处理,
; d7 D; T4 S& }处理完,就会RestoreTPL了,) r6 I3 _8 |9 m( p
当然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.  g; u* {! u4 \5 l% l
! u' V5 K6 @: Z  d8 {7 o1 [
我的意思是RestoreTPL这个被很频繁的调用,而且一般的Event(callback,notify)的TPL都>当前的TPL(driver=6)
7 t/ _$ m" V+ q& L7 t- g所以,就可以"认为":$ y" n/ w" C  T* _# i) Q
       "只要我们Signal了Event,那么这个Event马上就会被Dispatch了"
回复

使用道具 举报

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

回复 5# 的帖子

我想应该跟ring0到3类似,都是逻辑上对顺序的控制,况且32个好像也没有全用,估计用了一半吧,我猜的。) v' a7 v& W' E9 p! o/ V

" M+ r, \3 M7 Q/ T0 [而且restore调用应该不是很多吧,如果你signal一个就restore一个,那样设计这套代码的人也。。。。。。
" Q" i/ E; g$ w3 q) K% |$ i" N+ `$ w7 V# b* I. [" Q
我个人理解,每次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属性。' B+ O4 ?" q) g8 J( B6 H, d
typedef0 h. @# T- l/ e' \0 m7 g
EFI_STATUS
# U; x# R8 j! c) m9 q! bCreateEvent (
. i! n* u1 q% ]/ WIN UINT32 Type,
$ S$ \3 n/ s% M$ W( AIN EFI_TPL NotifyTpl,
4 t& {" `) `) P# YIN EFI_EVENT_NOTIFY NotifyFunction, OPTIONAL' N9 e" H+ }3 s1 N+ ~. [
IN VOID *NotifyContext, OPTIONAL
( ~5 [" D( V2 b4 X5 ~OUT EFI_EVENT *Event# L8 n  Z4 s: |8 U
);: S$ i/ d4 g$ s% F" O5 p. P7 A
中NotifyTpl的作用就是让NotifyFunction在NotifyTpl设定的level上工作,这样如果CreateEvent 是EVT_NOTIFY_SIGNAL的属性,那么在调用SignalEvent()后,只要当前TPL Level小于CreateEvent 的NotifyTpl,就会触发EVENT。
, w1 i0 h) _/ B. R" ~使用EVT_NOTIFY_SIGNAL只是EVENT的一种方式。
回复

使用道具 举报

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

回复 9# 的帖子

可以请问一下,你自己建立Notify Signal Event 来做什么吗?或者 Notify TPL是多少?9 I, p# v5 d; G: ^1 u/ b
谢谢!
回复

使用道具 举报

发表于 2008-9-8 12:36:40 | 显示全部楼层
我写了个Driver,主要的工作就是当他之后执行的Driver被Load但没start前通知此driver。
4 U5 e- J( h8 E% y+ z6 n- kNotify TPL是EFI_TPL_CALLBACK,这里只要比EFI_TPL_APPLICATION大就可以了,因为driver的TPL是EFI_TPL_APPLICATION。
/ w, H1 P8 L+ W! V2 p9 v我在使用Notify Signal Event时的问题主要是有时候必须修改EDK本身的代码,我想了好久都没有别的好办法。大家看看有什么好办法既能通知事件的发生又不做代码改动呢?
回复

使用道具 举报

 楼主| 发表于 2008-9-9 17:06:50 | 显示全部楼层
一个想法:) k5 O+ J1 p$ F* P: v. N0 p
如果是Binding Protocol的Driver,在自己的Driver里面  R+ E1 O, J  O
用LocateHandle(AllHandles,gEfiDriverBindingProtocolGuid,...)
% N8 w1 q  n7 u% f" f) E/ b+ ?3 Z记录下当前的BindingHandles,然后在InstallProtocol  gEfiDriverBindingProtocolGuid上面挂一个Event,
" n, l8 z! I4 o% E" k/ v在Event的NotifyFunction里面
  P8 F' H+ D8 ^; S( X, ~还是用LocateHandle(AllHandles,gEfiDriverBindingProtocolGuid,...)得到此时的BindingHandles
1 }. \! `6 U" @* \8 A- G7 r- Q这样应该可以在Load新的driver时,SignalEvent并得到新load的driver的BindingHandle了
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

回复 14#的帖子

你的方法很好!5 }) r2 E% G7 N" x7 g8 D
可以Hook到所有后面的driver!!! 0 e$ g8 E1 M5 [0 {
: f, \+ U( d' e: K( {3 @. B1 G2 A
回复 13#的帖子5 v+ E) e7 S' [
在LoadImage中,会SignalEvent和RestoreTPL的,所以应该不用自己加
回复

使用道具 举报

发表于 2008-9-16 09:30:22 | 显示全部楼层
srcore的rigister是个好办法呀~! T: x, K' n3 E1 \& L( \

$ F" e  K0 i" A( z" v$ [# L! i在LoadImage中,会SignalEvent和RestoreTPL的,所以应该不用自己加* c2 G1 h/ W" N
xtdumpling 我在代码中找了一下 没有发现LoadImage中SignalEvent的codes 能说下在哪个位置吗?谢啦。
回复

使用道具 举报

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

回16#

File: Image.c
+ ?4 o& x; y" q4 R( g7 s0 r" _CoreLoadImage()-->CoreLoadImageCommon():/ O, I  X5 @  G  ^
  //
7 W& k4 q6 z3 C4 L% r  //Reinstall loaded image protocol to fire any notifications
  |2 |+ T2 S9 T. `+ S. I  //
! h8 U- Q6 Y" Z5 S  Status = CoreReinstallProtocolInterface (, ?4 [5 i  _3 [* D: C; F
             Image->Handle,
1 a- M- H. \5 a5 u1 J' [. E             &gEfiLoadedImageProtocolGuid,
* O- f* ?7 W$ g8 n. L3 R% H- \: U             &Image->Info,
+ J& z7 B% M9 D) Y0 q/ Y. W' _             &Image->Info
  [7 P: @8 e  Q- Q" u" Y             );5 G, g& b# o& W7 Y5 [

' n; q7 |6 O3 p5 q, kFile:Notify.c$ G9 [0 r6 [( X9 a, a8 D0 L( x9 ^
CoreReinstallProtocolInterface()-->CoreNotifyProtocolEntry()-->CoreSignalEvent()
" ]; }; W, n" [" p3 H: MCoreReinstallProtocolInterface()-->CoreReleaseProtocolLock()-->CoreReleaseLock()-->CoreRestoreTpl()
回复

使用道具 举报

发表于 2008-9-16 11:28:43 | 显示全部楼层
原帖由 xtdumpling 于 2008-9-16 11:01 发表
: n% X4 X5 u! y2 CFile: Image.c
: S: l- J; g0 d: y3 yCoreLoadImage()-->CoreLoadImageCommon():
/ z# I: T& |. a4 v, O6 \6 i  //7 T. i0 Q4 k  `" v- q7 E) k* [
  //Reinstall loaded image protocol to fire any notifications
8 P+ ^$ s0 }8 c8 V5 M; }$ h  //
' {" v3 R! Y# m. N  l# T  Status = CoreReinstallProtocolInterface (! m+ W+ s1 u& E8 [: R' E4 L
             Image->Handle,
8 P! y4 h' K. v) r  ...

) T3 R) z: a) V+ } 4 B2 {( x) Q% l; s1 F
感谢xtdumpling~!
回复

使用道具 举报

发表于 2008-9-16 12:08:01 | 显示全部楼层
有个新问题:/ E4 V, q  N; M: T  c/ Z4 @
CoreSignalEvent()确实能通知Image被load了,但是如果要在自己的Driver中使用该Event,MS不行吧,要么还得改CreateEvent的事件函数? 好像还是不能不修改EDK的代码?xtdumpling有什么高见?! L9 f  ]" [4 @2 @  e2 J

! _) G4 {. J! o[ 本帖最后由 lisen4 于 2008-9-16 12:12 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2008-9-16 13:34:56 | 显示全部楼层
请楼上的兄弟分析下BS的RegisterProtocolNotify也就是CoreRegisterProtocolNotify是做什么用的?
9 i6 r( `3 F; c% Q3 q) Z' b谢谢!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-29 05:47 , Processed in 0.059580 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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