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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?9 g) r* s3 e' |1 e
我调试发现他是取得那个字段的地址。! s% n3 [5 h4 m
大侠能详细解释一下吗?# @- X" p: E, x: n; H- l
" }! H3 m; L" L# J1 {
这段是我Debug的用例。* F7 R( P, l+ a3 `! k% ~) h9 U

, X1 m# ?& P1 ~+ c#include "stdio.h"
/ f" S$ a1 P6 g) _7 f( a#include "stdlib.h"
! U# `  t- S' Z, O- \#include "string.h"
/ h. ^& ]8 i5 s( t7 d7 o4 X+ i$ j1 U9 N3 j0 f
#define        CHAR8                unsigned char6 w% w, i8 ]" m( s: F# E

8 P& _- m# X/ Q" }8 ^2 q" Ltypedef struct _tagjany4 x4 S/ z: b) _& G1 s; i9 T7 C' K
{
' h0 [2 c4 i3 `  d9 w2 f        char name[8];; V# `- Z1 B% w& b: E
        int  age;
3 u+ [3 @8 Q. ]: v' N( p* W" k/ [}JANY, *PJANY;5 {  R, u+ W4 A1 ~7 g
: @" _! {( _8 Y& t' }
typedef struct _tagowen+ n1 ~* v- @" Y& i, z2 x/ W* |
{
3 b- }, w1 p) }' N: a, v        JANY jy;/ J7 T& H* m3 C# q
        char home[5];
1 B2 T, M0 M: S& [8 e( b% f}OWEN, *POWEN;
5 H+ }  v8 @: Z& V" X; C. r
; `0 ^3 Y2 i& n) ^; f( y  T#define PEI_CORE_HANDLE_SIGNATURE "owen.lu". `4 B! @, q7 e. l9 c

- m0 U* s) F/ _% f2 \#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
6 P5 F+ G  N6 }% ^
: \! t* j9 U# X5 \; i5 Y#define PEI_CR(Record, TYPE, Field, Signature)   \
* N5 W4 c; Y+ Z. T- z            _CR(Record, TYPE, Field)            
7 d% a( Q! ^) g- ?( B. ]. ?
3 Z# R) {& P) E. r5 U' J#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
/ s( Y$ T7 A* m) c- w3 z% K- ]  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
, Q; z2 D% l8 w( D4 _. j
# @1 E" @! f$ K- x5 U# ^void main()
% u4 v3 {( ^6 G0 [{
0 ^# Y0 \0 R' t4 |) z' V, {5 M        PJANY        jany;3 a1 }: v- n3 {8 @7 K9 \
        POWEN        owen;
3 l# T1 D6 V  t+ ^& p1 f. i        jany = malloc(sizeof(JANY));
( i  t0 V  Q% O1 ]        owen = malloc(sizeof(OWEN));
) G2 @0 m  |) a        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
, t8 e9 o( V6 `        free(owen);
& M% q  |5 u+ W) e        free(jany);
) S" M! X0 O9 Q. J8 i        return;       
5 o0 w' A. e: h9 T, }}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
" Y, A) H1 F# q" a3 I1 ?1 h
6 J! o' B$ \3 w' W) n2 d) a你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
$ E# R7 c5 ]( @  F; n4 d谢谢 “kelvinklee” 指点。! }& b) }% a( a4 U( b% x
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                # `" ]+ P& M0 A, Z: K! B
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
5 t& z+ g  P- B1 p( m输入:一个结构体成员的地址指针,该成员所在结构体的结构
/ g9 [7 _1 W+ U( O4 x输出:该成员所在结构体的地址指针% r  s/ Q" `% v2 v, ^, b3 r
. O* H; T7 {5 B
算法:5 D3 l/ \, q* |. ]
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
0 ~, X. p/ l$ S2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-18 20:06 , Processed in 1.068726 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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