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

请教: UEFI CoreStartImage中为什么用EFI_PEI_TRANSFER_CONTROL_PROTOCOL?

[复制链接]
发表于 2008-10-28 10:50:31 | 显示全部楼层 |阅读模式
EDK_20080905(各家IBV的应该类似),文件Image.c,在CoreStartImage(),如下一段中:
  1.   Status = gEfiPeiTransferControl->SetJump (gEfiPeiTransferControl, Image->JumpContext);
    8 L! B  i+ P5 |3 q) C. \6 J
  2.   //4 K2 e5 O. ~2 C
  3.   // The SetJump returns EFI_SUCCESS when LongJump Buffer has been armed, q# ?/ @. t0 |4 U- t4 E; }2 b
  4.   // SetJump returns EFI_WARN_RETURN_FROM_LONG_JUMP as a result of the LongJump! t0 l. P" k7 K) h) E) L" V- q9 @
  5.   // All other return values for SetJump are undefined.
    6 e: E) ~. o, Q& v
  6.   //  I! K, o1 a+ w; H
  7.   if (Status == EFI_SUCCESS) {
    4 L$ v% Z* i6 r1 E6 c  J( G
  8. 2 G5 S/ N- i9 H
  9.     /// M- n( R. Q9 s0 m/ ]/ d
  10.     // Call the image's entry point
    $ A7 [5 f; ]  c' Z- S: o1 {
  11.     //
    3 D; F1 b. C; V5 S1 O
  12.     Image->Started = TRUE;/ @% S, O$ _3 P' r) v  I
  13.     Image->Status = Image->EntryPoint (ImageHandle, Image->Info.SystemTable);7 f% {9 i7 \0 a: ~  ?

  14. % r8 S6 {/ Y9 r6 M7 |# U  ?! k
  15.     //
    , B4 X' Y2 g( Q& ^( s# }
  16.     // Add some debug information if the image returned with error. - b2 G, W" L' K4 h
  17.     // This make the user aware and check if the driver image have already released
    9 p: T8 E  c9 ^; |
  18.     // all the resource in this situation.
    0 \9 u* A- l5 z% J: L
  19.     //6 G8 N; j# @2 T% F; g' g3 ?! A
  20.     DEBUG_CODE (( W& y4 J. F6 U- ~* x  S% b* V! d# s
  21.       if (EFI_ERROR (Image->Status)) {4 r' y- \5 g; |* z0 i0 z) X
  22.         DEBUG ((EFI_D_ERROR, "Error: Image at %08X start failed: %x\n", Image->Info.ImageBase, Image->Status));' l4 b7 T& j, U: D
  23.       }
    5 W4 P& b2 b  v6 O8 S, j8 B- |6 h4 j5 |
  24.     )( L3 b8 R: B$ M) U
  25.     : e- x* L/ R! M5 E+ ?
  26.     //( P0 Q8 z2 u* c/ W1 i
  27.     // If the image returns, exit it through Exit()' `: w9 x; v: r% M0 G3 E5 d3 Y$ V
  28.     //3 T/ z4 S* r) I# ^* K' {
  29.     CoreExit (ImageHandle, Image->Status, 0, NULL);
    8 D/ E. b! C! N4 Y% A
  30.   }
复制代码
调用DXE driver前,为什么要用SetJump保存CPU的信息,driver返回后,再用CoreExit--LongJump恢复到SetJump时的状态7 [4 H+ R1 H0 z, y; u2 d- D
既然driver可以返回,为什么非要这样恢复到调用前的状态呢?难道在调用driver的过程CPU的状态可能会被破坏吗?
" `8 [4 M6 o( k& x# M8 B而且目前来看driver只会返回Status而已,根据这个就可以做处理了.
* P1 |* `% Z- D2 h7 l
1 L5 I/ _! `: Z5 ?我感觉有点多此一举了...不解
发表于 2008-10-28 22:29:18 | 显示全部楼层
我觉得可能是要保证DXE driver之间的独立性吧。
回复

使用道具 举报

发表于 2008-10-29 13:42:13 | 显示全部楼层
C程序可以用return语句在main()里退出,也可以用exit()函数在程序里任何合适的地方退出。UEFI也提供了类似的机制,即Exit boot service。与从UEFI driver的入口函数中用return退出相比,用Exit()除了可以在其它的函数中直接退出,而不用先返回到入口函数再退出之外,还可以返回额外的Exit data。
) Z8 A% n3 ]& E5 q
( E3 g7 p# ?; T4 P( uEFI_PEI_TRANSFER_CONTROL_PROTOCOL提供的SetJump/LongJump函数就是支持Exit boot service用的。类似于C的setjmp和longjmp库函数。
回复

使用道具 举报

 楼主| 发表于 2008-10-31 10:03:16 | 显示全部楼层
有点了解了,Exit()可以直接退出返回一些参数.% R' `, n5 Q" N+ b/ _) z9 Y
没有用过,暂且记下了.6 z+ @% v7 H0 l8 K+ S8 z7 i' X
- n0 K! ~9 O" C! I$ U( v
非常感谢!!!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-19 21:02 , Processed in 0.125048 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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