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

请做EFI的大侠&前辈指点一下这个宏。-谢谢!

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?; Q. p& \. ]! R4 @; Q
我调试发现他是取得那个字段的地址。# K& D+ \2 I! h; ?" P
大侠能详细解释一下吗?% h: a) K1 E1 n# I
8 w4 G7 Y% U6 @- s0 a2 K% u
这段是我Debug的用例。' Q4 Z/ C& ~- P% E( _- i  j3 M
6 D# W( `9 w' Y6 }. `% L
#include "stdio.h"4 G% d6 w4 ^+ K- {
#include "stdlib.h"* A, @5 u* w* _4 ?. W
#include "string.h"
, c7 P4 K! l& u7 _' b& B4 `. q9 ]5 K8 O9 u
#define        CHAR8                unsigned char
( }6 T1 t: I- A; }: ?- H* v0 T
+ L! _" y& r, @5 T7 t: _* U7 Xtypedef struct _tagjany/ g% |1 {; [" C7 R# b
{
* [' H7 l( X0 E' Q+ |# F        char name[8];
% C1 C5 U0 M% y0 X7 ~# \        int  age;
  O9 g# w; ^5 Z# W4 a! K}JANY, *PJANY;) r8 g# h! r  e
7 G- O# Z+ M; l2 f8 @
typedef struct _tagowen
7 R3 I8 n' ?$ D{
' q( B+ c+ l' [- L3 r6 P7 i; h1 H* A        JANY jy;% E8 T- b! [  @! o
        char home[5];/ {" _3 z7 v) x
}OWEN, *POWEN;
4 P( }7 a3 y5 g( P2 b- }
, |% \2 r) C# T$ h2 A#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"! m# l, k; K' B

4 U/ _- k2 H, z  E#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))' K0 r' x1 A/ g- O# Y) t1 A

4 J. a( w; n' e3 [3 L#define PEI_CR(Record, TYPE, Field, Signature)   \
. l/ }! _6 g6 f5 {- C* d; ?* C) o1 v            _CR(Record, TYPE, Field)             ) M5 t5 K9 N- Y# A

+ Q! g% O. W9 A#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \& {9 g: ?( y, S. T+ \& C
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
$ M( P: G$ D# |
* V1 W: D2 F" ]" I3 e' s' dvoid main(): L" p+ G  h" w4 `4 k0 w+ e
{/ h0 O/ S$ ]7 A; K* `' U5 F& w
        PJANY        jany;7 T3 r5 {8 d$ Q/ q
        POWEN        owen;. ]7 [' V2 t, U3 P# B! @% u' H2 Q
        jany = malloc(sizeof(JANY));
4 _0 w9 I' `+ Q! k; ~        owen = malloc(sizeof(OWEN));
. p" N* S8 ^  o% J1 V0 J        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
% \/ w& t- k2 r        free(owen);
7 v. U3 y: @: K3 v- {& R        free(jany);
, A- v$ r5 x; ]1 n* j% k7 C        return;       
5 R$ q3 f9 o, j4 I5 c  p+ D}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。- v3 c5 _- j' k, F/ v

$ @5 a1 E& G- G8 Z你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
. b$ W3 w" D" ~$ V- }# G4 \谢谢 “kelvinklee” 指点。
  {1 B% m! z  b) Mhttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                * `) P6 R% w* Y' d' J: c# H  k# _
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!0 Q2 i! Z$ t/ a' g! Y6 O
输入:一个结构体成员的地址指针,该成员所在结构体的结构
5 Q6 t* T% G! J: }输出:该成员所在结构体的地址指针
. M/ @5 c9 g' a7 u0 H3 r+ p9 E' h: a3 `& V6 \" W7 o
算法:9 s6 _4 Y; J* |
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量; }4 m2 ~3 V' s
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-21 21:58 , Processed in 0.169039 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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