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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?; B& s1 H- e( S) D: N' b% {% y* N( W6 J
我调试发现他是取得那个字段的地址。' L5 n) {3 a( _5 e3 N
大侠能详细解释一下吗?
9 X& ^# A8 I6 }) o& ?, ]" k4 t+ a% ^& ?0 p
这段是我Debug的用例。
& J  ?& e. h, N; U" t# Y8 x. ~4 ]. K) p
#include "stdio.h"3 ^& }+ S8 q8 p( U% o+ W6 H; @' B% j7 }
#include "stdlib.h"
4 m7 P7 [3 J5 j% G- Q* `#include "string.h"
6 @+ |6 H/ \" d1 D. ?
5 |8 I/ f) `, @- d( X4 A* _1 M#define        CHAR8                unsigned char8 H6 ?4 o! w8 A2 h! i
8 u$ R4 q0 R& O! S& I
typedef struct _tagjany
5 m$ I( J' @& H" C{
5 u& K: Z+ i7 d        char name[8];9 ^7 i  i9 H) @9 r; u! J
        int  age;
+ @( W9 D  \# K8 E, [/ h3 E- O7 }}JANY, *PJANY;
; {7 p) G7 ?+ w* ~. A2 k/ k  g- k% \+ i" A
typedef struct _tagowen0 }8 c- W- h, T; x- f; Z3 Z) h" |$ Z
{( _, e' K, e. I4 r) n9 W" G
        JANY jy;
2 G6 |$ Z- T( W( C: K4 L. `        char home[5];
$ l( ?% t! Q2 o" O% N0 w  q' [}OWEN, *POWEN;
" x: D) c2 k2 t, x& F% Q& G
# ?; B& p7 x, J% @$ f5 u#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
# [) H' q8 U& Y+ I3 B! i  i, C0 o; D$ K: n
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))) {/ W3 W: j- r! \; s( {& V
0 ?9 P& W$ v. Q
#define PEI_CR(Record, TYPE, Field, Signature)   \
5 B" i* ]5 {, H# V& M6 n( H            _CR(Record, TYPE, Field)            
* J# h: w" Y3 L& y3 x  |+ Y" y9 N- z! e7 s& a6 L8 B2 l
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
( p- e* ]( \- |  K4 W- H" _; A7 y2 t  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE)), i6 {0 F' M1 }. L

, r6 u  O2 ]1 \4 z5 h6 [$ F* T  avoid main()
: x% ~. B5 L! \5 V4 e{
  _$ {6 H3 J0 x/ I        PJANY        jany;
& k! \$ @4 D) {) d        POWEN        owen;* k! [$ V' G$ J$ Y& |
        jany = malloc(sizeof(JANY));" l% d0 ^3 K8 X8 |/ J' s
        owen = malloc(sizeof(OWEN));
% v3 [2 k6 P. q7 R5 G        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);  R0 |9 s, T2 o! O' ?
        free(owen);
4 F: o# D( L- P3 ~% d1 K        free(jany);/ ^/ k& x" T; x5 `1 F6 w
        return;        2 _$ q0 N: C5 r- L( F0 \0 X
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
, T* \7 g8 ]- g
7 a) @0 t0 h% z; c你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。- x7 z. V) z, q- z( h8 Q
谢谢 “kelvinklee” 指点。1 W$ k( I* u* o  t  B
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
( y& s; v- q3 h% l( M9 t, ]6 t.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!. C/ t) w  W3 m. |. i' Q' j
输入:一个结构体成员的地址指针,该成员所在结构体的结构/ m$ J3 U* M0 O4 `, T
输出:该成员所在结构体的地址指针9 Y  S+ c. y+ q( z6 p$ n7 z
% R# \% T1 F' N" r+ U
算法:- n# V% V, Z& c9 y6 e
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量- f4 B7 B7 _% B& i( l7 x) z  h
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 02:17 , Processed in 0.128023 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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