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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
. B9 @1 r% g4 E! F( l. p% r. R7 x- q我调试发现他是取得那个字段的地址。
1 h: p9 b& x. @大侠能详细解释一下吗?
# g- _4 H7 T* s' v6 `1 n$ U6 Z( Y( i& d9 y( _
这段是我Debug的用例。& f1 \3 [3 F% O/ T8 ^
, |3 }" H9 ]6 m/ ?
#include "stdio.h"
4 O8 O$ k- _, S' L#include "stdlib.h"8 W: r1 C+ u& v7 M4 [, l8 M1 \
#include "string.h"
; _1 I) z2 ?$ l1 C
( P9 N) j9 i$ @6 X% V2 e0 M( v#define        CHAR8                unsigned char- k5 z% V$ O, f5 m2 p

. h9 |. |# F9 j5 ?3 E7 _) g) b0 ?typedef struct _tagjany
0 c- m2 Q) F+ h9 l' B* \" f( s" C# |; |{
' P7 E  y4 ~, h) {7 {        char name[8];/ o8 B- s' M- e, V4 K+ z
        int  age;
2 Q. @: d7 B: J4 c3 z) U5 k}JANY, *PJANY;7 [: t) i: ~0 W$ Y, _" \+ k5 I2 X
  T' s) x; ^; l: X
typedef struct _tagowen
+ y; M2 h- ?$ s. w7 h# o{1 E/ K3 ^$ b2 A5 t: m
        JANY jy;
7 _* V3 ]1 P( M- _# {        char home[5];7 @+ A0 S8 H3 u5 q
}OWEN, *POWEN;
' I& D* a( J2 n- U$ ^
5 K: Z! Q. U' `) Y#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"/ K, c! H  s" b6 Y' a, G
" C/ K5 a- k! b2 B: w4 n) N
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))  M# `) L* T1 k4 z3 W7 o
" ~" Q! ]" h8 p# N5 J1 x( T
#define PEI_CR(Record, TYPE, Field, Signature)   \
6 }$ [4 W6 T& {" Q# x            _CR(Record, TYPE, Field)            
4 m% y$ c$ b$ I
8 w5 z% Q+ T5 B: n#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
6 S+ J9 Y4 m% V9 y$ `" ^  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))3 C, o8 d" i# h+ C& D) S' k' Z

' z1 z) l' O! b, Evoid main()
3 w& D% U- O4 E0 c. Z5 ]{
/ C9 M$ ]6 ?- m0 X        PJANY        jany;
5 _# Y( U3 j; Q+ S        POWEN        owen;' g, m0 S( @  i  G- K* m2 v; V) f
        jany = malloc(sizeof(JANY));% Y; `: l$ c5 d; R. s; s# b
        owen = malloc(sizeof(OWEN));( }7 y$ K$ g% Q4 {4 {4 r! q% o
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
5 F! Y9 U0 _' I% m5 [, [% g0 U        free(owen);
6 ]1 ?9 w1 O: Z6 w  }& k7 T+ S        free(jany);  p/ D8 Z+ d* P
        return;        + A" A! @& f0 ~" |( L" W5 s- W6 P
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
3 C2 m! [. e! K# s% h8 ]. `  S
, y/ G" h5 N: X8 x4 B4 a- i+ i7 A你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
/ p. R3 w' e1 Z1 U谢谢 “kelvinklee” 指点。
' o/ n7 q/ I2 o5 Chttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
% s; j# M8 s, @1 \* @: x8 ].
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
8 Q$ n& p1 r0 e输入:一个结构体成员的地址指针,该成员所在结构体的结构9 F$ T# q1 h; x3 t
输出:该成员所在结构体的地址指针! U+ X  I0 i6 \
( j* |1 `0 o4 X4 s
算法:7 h8 ~8 ^7 p7 f( T% P& a. K
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
2 ?, |$ Z$ [- l2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 16:34 , Processed in 6.556976 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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