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

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

[复制链接]
发表于 2008-9-2 14:45:45 | 显示全部楼层 |阅读模式
在UEFI的spec中,有定义event,timer和task priority Services,
9 N# j3 l5 T  [& f+ _# C/ L一直都不怎么理解为什么要做出Event这样的一个机制?( a7 }8 O  S: y& R

) s1 Q8 `5 [' g; ]# p1 }6 [, Y7 Z  N6 ~Timer类型的Event,用于定时或者周期性的事件处理,比较准时的,(代替中断???)* H9 k9 B1 ?( g$ I1 S
Wait类型的Event,应该算是查询或者等待事件的处理,如等待Keyboard和Mouse的输入,感觉像轮询;
# V( P8 X  \' m0 i5 O还有Group类型的Event,用于处理具有相同类型的事件
) }: w# N  u% M1 X3 b; |" v; ^一般的Signal的事件,目前就知道有Install Protocol的Callback功能,像PEI的Notify(Callback和Dispatch)9 F- O7 Z6 n7 }" F6 q
这些是我看Spec和Code的理解,感觉还是没有看懂,没有抓住实质,
: R1 c' {* ?, B2 u' X& X, V1 I不知道各位对Event有什么样的理解??
发表于 2008-9-3 11:58:02 | 显示全部楼层

回复 1# 的帖子

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

使用道具 举报

 楼主| 发表于 2008-9-3 12:49:50 | 显示全部楼层
嗯,只有在RestoreTPL的时候才去处理所有pending的event.
" W, Y2 r8 L+ |- d0 z因为我看到有很多地方有RestoreTPL,很频繁地,
0 e, v8 a: s/ m& r; S. J  i6 s6 l. W( `  V所以只要我们Signal了Event,那么这个Event马上就会被Dispatch了吧?! s' h1 |. D1 L! `5 P$ p
% X6 o; r/ x/ S; {9 t
TPL的控制,* z: v8 p' i  q0 k
我觉得是,当比较关键的事情要处理,(如用于处理独占操作的,不能被打断的等)
5 O4 U' h" ]# I) n8 `7 J+ k不想被一般的事件打断时就会RaiseTPL来处理,! i! A8 e' I* r6 s& `) d6 r
处理完,就会RestoreTPL了,
4 s+ n. |+ a# q+ Z+ I当然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.
* `( H# @3 _9 m; @& @8 V0 k- b
& c/ j: e# j! O- {4 C7 Z. w: t我的意思是RestoreTPL这个被很频繁的调用,而且一般的Event(callback,notify)的TPL都>当前的TPL(driver=6)$ B$ x! l) I) R( f/ k% g
所以,就可以"认为":. |1 K4 ^$ {/ {  F' D% I
       "只要我们Signal了Event,那么这个Event马上就会被Dispatch了"
回复

使用道具 举报

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

回复 5# 的帖子

我想应该跟ring0到3类似,都是逻辑上对顺序的控制,况且32个好像也没有全用,估计用了一半吧,我猜的。
) ~" S5 w. r+ V/ I6 e% [1 s7 Z  G" D" {
* [! c/ n/ v4 f5 T; ]& M而且restore调用应该不是很多吧,如果你signal一个就restore一个,那样设计这套代码的人也。。。。。。
3 H0 M3 ]% y  M, e3 d
0 U4 u  S, L" _( b  _我个人理解,每次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属性。
: N% `, t& U% L4 }) c# H/ I3 o, Y1 ctypedef
( z! w3 r" z% T0 e2 _; o5 }. V! GEFI_STATUS
  f+ N. [2 w  q$ A3 C( `( mCreateEvent (2 @  x( r. `0 m4 J$ A1 w4 m- s
IN UINT32 Type,
; H$ d) p8 W: W5 G% H" j2 kIN EFI_TPL NotifyTpl,  b+ x. p5 R5 F" x  P( k" ~$ Z: A5 X
IN EFI_EVENT_NOTIFY NotifyFunction, OPTIONAL# [9 k! t2 i4 `  g2 f
IN VOID *NotifyContext, OPTIONAL
  O8 O( d& E0 ^1 f4 t3 yOUT EFI_EVENT *Event
" }( h5 Y/ o% M8 N);7 C$ k8 u" Q$ K5 `  k% r
中NotifyTpl的作用就是让NotifyFunction在NotifyTpl设定的level上工作,这样如果CreateEvent 是EVT_NOTIFY_SIGNAL的属性,那么在调用SignalEvent()后,只要当前TPL Level小于CreateEvent 的NotifyTpl,就会触发EVENT。* q  J" X# i: H: i3 y
使用EVT_NOTIFY_SIGNAL只是EVENT的一种方式。
回复

使用道具 举报

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

回复 9# 的帖子

可以请问一下,你自己建立Notify Signal Event 来做什么吗?或者 Notify TPL是多少?7 |/ h8 r( F' Z* h
谢谢!
回复

使用道具 举报

发表于 2008-9-8 12:36:40 | 显示全部楼层
我写了个Driver,主要的工作就是当他之后执行的Driver被Load但没start前通知此driver。
. |# h- \  Q, R! ^% Q0 h4 I" y# hNotify TPL是EFI_TPL_CALLBACK,这里只要比EFI_TPL_APPLICATION大就可以了,因为driver的TPL是EFI_TPL_APPLICATION。
# b; G! U+ n! U我在使用Notify Signal Event时的问题主要是有时候必须修改EDK本身的代码,我想了好久都没有别的好办法。大家看看有什么好办法既能通知事件的发生又不做代码改动呢?
回复

使用道具 举报

 楼主| 发表于 2008-9-9 17:06:50 | 显示全部楼层
一个想法:
& `- U  N( F  M$ L5 I( L如果是Binding Protocol的Driver,在自己的Driver里面
& G% H. @  y. W5 e9 g用LocateHandle(AllHandles,gEfiDriverBindingProtocolGuid,...), e* ^& F( @" I# @9 l2 h. y
记录下当前的BindingHandles,然后在InstallProtocol  gEfiDriverBindingProtocolGuid上面挂一个Event,/ F+ g& h2 G! R+ U" ^, y
在Event的NotifyFunction里面2 |. N. b; |7 W2 {
还是用LocateHandle(AllHandles,gEfiDriverBindingProtocolGuid,...)得到此时的BindingHandles
, I3 Q: T1 }* z5 ]8 ~$ I这样应该可以在Load新的driver时,SignalEvent并得到新load的driver的BindingHandle了
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

回复 14#的帖子

你的方法很好!% g( m4 ~) D/ I8 \- @2 y7 F4 [9 r8 z4 A
可以Hook到所有后面的driver!!!
! f. }0 ]1 r% E- j
" ]8 B7 ^. z/ P0 T回复 13#的帖子
" V+ O" [6 z( ?在LoadImage中,会SignalEvent和RestoreTPL的,所以应该不用自己加
回复

使用道具 举报

发表于 2008-9-16 09:30:22 | 显示全部楼层
srcore的rigister是个好办法呀~  w' M- I% m' @

! e4 q, Y/ r0 D; Y4 l) U在LoadImage中,会SignalEvent和RestoreTPL的,所以应该不用自己加
, C# X! e# \9 j: }) A+ c1 Nxtdumpling 我在代码中找了一下 没有发现LoadImage中SignalEvent的codes 能说下在哪个位置吗?谢啦。
回复

使用道具 举报

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

回16#

File: Image.c2 m$ z* m1 w' X
CoreLoadImage()-->CoreLoadImageCommon():
( z& ^9 C5 {: ^8 Z  /// [( ~& t; D, x* t
  //Reinstall loaded image protocol to fire any notifications( m# n- a9 s. m  b7 ?
  //
( h# b6 ]7 k+ o. W. Y  Status = CoreReinstallProtocolInterface (% v. ^0 C( G% E- z! e$ U. ^. X
             Image->Handle,9 Y0 J8 b% h. {4 x; a8 L6 `
             &gEfiLoadedImageProtocolGuid,
" }7 N9 }+ Z/ l) a! w             &Image->Info,
1 w( G4 A$ r& R5 m             &Image->Info5 v" I, A' [( \  U: Q$ J
             );
+ K/ E: V8 g8 ]7 u7 D" g% L2 A2 B5 c; C5 r
File:Notify.c
+ p* |5 j) D+ Y& h9 ^% }CoreReinstallProtocolInterface()-->CoreNotifyProtocolEntry()-->CoreSignalEvent()2 ^( y) W" J7 |/ h' W
CoreReinstallProtocolInterface()-->CoreReleaseProtocolLock()-->CoreReleaseLock()-->CoreRestoreTpl()
回复

使用道具 举报

发表于 2008-9-16 11:28:43 | 显示全部楼层
原帖由 xtdumpling 于 2008-9-16 11:01 发表 ! E3 Z, M& C  O, k
File: Image.c$ |' @8 f0 D0 J/ B; v& @( x
CoreLoadImage()-->CoreLoadImageCommon():# n* d9 y9 V9 `2 }
  //+ ?4 J/ Y8 Z; u) ?6 _$ B0 B
  //Reinstall loaded image protocol to fire any notifications- s+ a0 y' S1 f6 d$ D9 w5 n
  //. R7 O  R# W2 Y% X8 u6 o
  Status = CoreReinstallProtocolInterface (* h) [& Q6 c/ C" X
             Image->Handle,9 \) w# i/ t- i$ C) J: D+ o6 `
  ...

* ^2 o# `- P9 H# G3 G
1 v5 _; I  e# Y; C" }/ t/ x感谢xtdumpling~!
回复

使用道具 举报

发表于 2008-9-16 12:08:01 | 显示全部楼层
有个新问题:0 n4 L& l/ R! Z( k, G
CoreSignalEvent()确实能通知Image被load了,但是如果要在自己的Driver中使用该Event,MS不行吧,要么还得改CreateEvent的事件函数? 好像还是不能不修改EDK的代码?xtdumpling有什么高见?
3 P* b' W0 z+ K
4 D! p+ U. M$ G; z9 ?( _[ 本帖最后由 lisen4 于 2008-9-16 12:12 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2008-9-16 13:34:56 | 显示全部楼层
请楼上的兄弟分析下BS的RegisterProtocolNotify也就是CoreRegisterProtocolNotify是做什么用的?! N* [4 U$ O; [$ X* t5 E
谢谢!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-5 15:56 , Processed in 0.054250 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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