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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
2 |" C' d  u0 h' c$ K8 i0 X我调试发现他是取得那个字段的地址。7 E1 M" ^, q1 C7 V! r: k
大侠能详细解释一下吗?' u8 U: U; R3 Q
; x9 S7 t; Q* O0 g" m
这段是我Debug的用例。2 b: }2 f1 n! t- x) o
) z1 p8 p) c! R8 B# `+ [- @) d
#include "stdio.h"% d, H' c5 G( X
#include "stdlib.h": J2 l/ _, f5 W
#include "string.h"! g  l! l6 g1 F/ C

: j! b3 X* r: x* `& ?$ Z2 [#define        CHAR8                unsigned char6 w; h+ f2 b4 d/ s7 K1 K
6 o- q! c: Z9 j8 u, I. u
typedef struct _tagjany
. M7 D" m, ]4 }9 u& Z{
- o7 }& [) a6 V. [6 k/ p+ }( _        char name[8];
& K. P3 i; H+ Q6 a        int  age;9 z7 e1 f, o6 `) f
}JANY, *PJANY;0 r+ o5 l% k+ B3 u
1 f+ Y+ j5 t: D& {- R  F. z- F  X  n
typedef struct _tagowen
- ?$ S* J- x( L$ C6 A- p2 \{8 o- d& L' _! W; Q) N% m8 b/ g* k
        JANY jy;+ ^5 W- x7 m6 Z1 w
        char home[5];
; Z: O7 f9 e* i1 i( _}OWEN, *POWEN;3 x1 }8 ^) X. j* u+ S  [3 w
2 {7 a: Q# p" b. B# M$ v7 ^
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu") |6 K( o+ \) p+ R6 O! g
5 ^. [6 _/ P, ^' b- P4 |, n2 Y! P
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
3 l; y; t0 ]5 x2 C) S
+ V' M6 l. u. @#define PEI_CR(Record, TYPE, Field, Signature)   \' o( d* i/ R/ Q. K4 a# ^
            _CR(Record, TYPE, Field)             ' ~5 X0 u5 ?' ^; N; h
* }' Z! R2 r$ l( _
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \& |4 g  o( S6 M/ @1 H
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
# }- D# g1 Z+ g
+ n/ {; R& `4 q* i! d1 b' C+ P. {void main()2 u/ M3 w3 T$ K3 X* e
{$ P+ U! D& m; r
        PJANY        jany;8 \9 o: W5 g9 P* k4 y4 i4 `) {
        POWEN        owen;
3 `3 `- V- @3 Z* ]" `$ B  e( H5 F6 k* h        jany = malloc(sizeof(JANY));% Q! |7 H8 B2 c3 l, ^7 W- k
        owen = malloc(sizeof(OWEN));
: K/ B& E3 d' k        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);3 S+ M# Z1 g8 u2 r! l& R
        free(owen);* C$ |- K: S8 W) @- b
        free(jany);
/ S* s' n- I7 J7 o& N$ P" t        return;       
" M+ A* @5 S7 V# V% u1 W1 w}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。! w0 \# O2 \+ ~7 l- u3 @: U5 j
) w  l  W1 ^; u% N. f: `- E
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。8 ]; _% K' m% U4 W: Q4 F  L
谢谢 “kelvinklee” 指点。* g; ?" V4 l* V" P# Y
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                ) h" C" H4 O" \1 g: l( K# M3 k
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!2 R1 G3 b' S  g+ v2 [9 B, @5 D
输入:一个结构体成员的地址指针,该成员所在结构体的结构
' V3 z1 T4 }$ t4 \& \3 {输出:该成员所在结构体的地址指针4 O: |3 N1 v1 J# g1 j

7 U# G* U  v/ T/ Y5 W7 O算法:
: W" f4 `. i) l1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
- d. l  `% S+ }8 O2 O/ e7 ~% H, d2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 18:36 , Processed in 0.056322 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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