找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 10929|回复: 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);
      H  ~; `" Y% }3 @* h
  2.   //( F$ @# V3 c! B" L( l4 b. x# i/ W1 A
  3.   // The SetJump returns EFI_SUCCESS when LongJump Buffer has been armed7 z; \2 Q: U' C% [
  4.   // SetJump returns EFI_WARN_RETURN_FROM_LONG_JUMP as a result of the LongJump
    ; N( g# c+ i1 I# B. c
  5.   // All other return values for SetJump are undefined.0 p7 x; l- W) E
  6.   //. K7 V0 B% @5 X! R1 e* l
  7.   if (Status == EFI_SUCCESS) {! H6 W7 `7 Q( R4 }# R; X2 i
  8. 0 w: r! D5 V1 l6 t
  9.     //
    : g& t& \( ~, h0 R: B
  10.     // Call the image's entry point5 y% W' x3 U/ g( w
  11.     //
    1 R' R. s, ~9 y; i
  12.     Image->Started = TRUE;$ o. }' ]% Z- F* M2 d
  13.     Image->Status = Image->EntryPoint (ImageHandle, Image->Info.SystemTable);9 U( y9 T! @* r0 ]3 ^
  14. ( x* d0 Z1 n  O, G
  15.     //) l& a$ ]. _6 ]# y
  16.     // Add some debug information if the image returned with error. & h* ]7 h' j9 m7 L! M6 V. t
  17.     // This make the user aware and check if the driver image have already released 2 t$ _7 j7 f8 O& j( B
  18.     // all the resource in this situation. 1 l' @. _" f6 y! A0 ?! T, h9 ~, A! D
  19.     //4 }' ~; R* f* c7 h. ]4 h" e
  20.     DEBUG_CODE (
    ) W2 i: g3 P* B' _5 p+ i, W
  21.       if (EFI_ERROR (Image->Status)) {
    ( x: I2 R2 K2 W  u4 ~1 \
  22.         DEBUG ((EFI_D_ERROR, "Error: Image at %08X start failed: %x\n", Image->Info.ImageBase, Image->Status));
    ) Q2 j* N& @2 J1 P; E
  23.       }
    8 v( r: k$ }$ r: W5 B1 W" ]
  24.     )
    4 a' M) W/ C1 m- M
  25.     , u" B; ]6 n% u7 q% D* m  n# c
  26.     //# G, C! h5 Q4 c1 `/ g
  27.     // If the image returns, exit it through Exit(): {8 }& J3 f; A/ F1 p$ \9 u7 ^
  28.     //
    : ~" g; }& N2 J& ]" z. B- i0 g
  29.     CoreExit (ImageHandle, Image->Status, 0, NULL);
      J' I. l( r) U+ ^
  30.   }
复制代码
调用DXE driver前,为什么要用SetJump保存CPU的信息,driver返回后,再用CoreExit--LongJump恢复到SetJump时的状态
/ W  b5 Q: v% D4 m+ ?0 p; z# Q3 c既然driver可以返回,为什么非要这样恢复到调用前的状态呢?难道在调用driver的过程CPU的状态可能会被破坏吗?
, Z( o! p5 l6 T, Z+ \7 s9 R1 h而且目前来看driver只会返回Status而已,根据这个就可以做处理了.
& U. i# r0 X+ J7 j9 V! t; X% h5 ]9 {0 }+ A
我感觉有点多此一举了...不解
发表于 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。
; P. d; E9 T/ \! H7 G5 o
  o- Q( w$ _" F5 R5 C* U$ j- X- uEFI_PEI_TRANSFER_CONTROL_PROTOCOL提供的SetJump/LongJump函数就是支持Exit boot service用的。类似于C的setjmp和longjmp库函数。
回复

使用道具 举报

 楼主| 发表于 2008-10-31 10:03:16 | 显示全部楼层
有点了解了,Exit()可以直接退出返回一些参数.
6 O  ^" k5 \/ Y3 F. c3 v/ i没有用过,暂且记下了.
5 r& I2 z5 R; j' y: Y1 _6 F
2 r4 U/ r# j; p非常感谢!!!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-21 22:12 , Processed in 0.052461 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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