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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?/ s2 u8 V- H, z7 D0 l; {$ I5 N
我调试发现他是取得那个字段的地址。: g% V7 A4 U2 ]& n$ ^6 M
大侠能详细解释一下吗?
$ p7 T6 p- K* j4 h6 ~" [: Q9 N7 w0 u) V7 s" O* R
这段是我Debug的用例。0 l1 e" Z4 ^0 C  J4 f- l
3 M0 w: D) Z* |( H% ~0 ?" Y
#include "stdio.h"9 R8 V2 G" X8 R
#include "stdlib.h"
: J; r( R+ L/ k& @! A- O& i" c#include "string.h". m, Y# |6 f! t$ P% l- b
9 h  f) ~% a( D$ M, ^
#define        CHAR8                unsigned char4 Y& N# ?  e' Y# F2 V$ H
) e7 m& B. `9 [
typedef struct _tagjany! i/ D1 A. {* b
{8 h: w0 C2 h3 J- A
        char name[8];
  Y  T% v. f5 ^3 w" g5 G        int  age;3 f: H) `: F( W) F  n0 u
}JANY, *PJANY;$ `2 O; @' Y7 _$ a0 ~2 Q" w! o
  P7 N  G5 q' M% s
typedef struct _tagowen
" e# Z! n" [' q3 {8 s/ X" w{' d: |2 K& e0 z5 U
        JANY jy;1 O+ R6 R7 }7 Y8 p5 f+ U
        char home[5];! N+ ]. U+ [6 A- Q/ L! n
}OWEN, *POWEN;) n( W( o: r# G. [/ P. R: `, ]
- l2 F% r; N6 O9 u6 ]  [- a8 K8 M
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
7 ^, Z. H3 F' q# Z2 `$ b
7 z5 e+ Y; i% `% |#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
. m0 l; i8 X1 |; n# E# n' p! K$ n+ M, r0 n8 a0 X2 K2 l' j4 |
#define PEI_CR(Record, TYPE, Field, Signature)   \
9 D& P) T: v- R+ r8 d            _CR(Record, TYPE, Field)             . V- d; K0 x/ u9 j! V! @
+ K( \8 n' u0 I* D  c
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \2 ]2 D$ |9 U9 {; \2 F$ ]' L* D( k3 k' y
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
/ u2 ?: D" H8 ?* S/ g( F1 y# p$ ~  n: X; p$ U7 `
void main()0 M/ I. W! Z3 I0 ?& |: ^
{4 ]; b$ M: i( ]! @) ~3 c2 F* w2 M
        PJANY        jany;
9 z( l: V4 j8 p2 N  P9 v2 v( f        POWEN        owen;/ Q6 _3 {* x1 B! q4 h' g
        jany = malloc(sizeof(JANY));% ?" \6 N8 S- a5 Y1 D. c
        owen = malloc(sizeof(OWEN));
1 y7 V* E2 N6 C- G% t        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);4 L+ d- _& o5 E
        free(owen);+ V5 X! {% I1 f6 c
        free(jany);
7 Q, [' H$ [8 {        return;        4 O: U  S0 s: P9 F1 o- _# `
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
/ N9 [+ P" Z' z/ C# x" P: V  |6 G4 w3 T  P
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
1 P2 I. B, E, B) J' [谢谢 “kelvinklee” 指点。
) ^( _. ^+ i8 ^$ Z- |# |0 Lhttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                % p! T! q7 f5 P! U
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
# G8 M; t# Q% a, w' J4 F1 F4 N0 S输入:一个结构体成员的地址指针,该成员所在结构体的结构
1 w- y6 N0 N1 b# x8 }- N9 f输出:该成员所在结构体的地址指针
7 Y- V& }3 h" H/ f4 g; j& j6 B0 v8 m, K  J: E. \
算法:
; x4 ?+ b4 }' o, m' t7 d' l0 X( G+ g1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量! x' i" k$ `3 J2 V3 R  Y
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-19 21:29 , Processed in 2.830593 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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