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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
" i) c+ p3 M$ k" j+ w8 }' D我调试发现他是取得那个字段的地址。
8 e* H* f8 E1 Q% A大侠能详细解释一下吗?
: R: D7 X: J0 n4 g% I8 `- L
" `: P+ _+ O! ?; }这段是我Debug的用例。
# {0 f* `  `" f" C( a
- Q0 Z6 \1 P% y& W$ _#include "stdio.h"
0 i$ q/ b. H) `2 e! Y- M#include "stdlib.h"
7 c9 p' u5 K. H% ]0 U' z3 j9 j* F! b#include "string.h"  u" R0 J) }' S/ s4 J3 |% |
  }* ], ?* k. _  j+ t* F4 P+ V
#define        CHAR8                unsigned char
/ b& H4 T2 @( @. q! u$ I3 k* O, l/ M: {- t( _# E
typedef struct _tagjany' N" _( O5 o, m' c: c
{
' `; h/ o% R% {& F0 X6 `5 |        char name[8];7 B7 ?% N) ?' g1 n
        int  age;% a; [8 B2 e4 X4 z$ G  U& t
}JANY, *PJANY;
0 L9 z1 T; B  F- n7 s6 b
9 U' j0 x) i6 Z- h) l- u+ ~0 ztypedef struct _tagowen
$ X6 [# t3 Q0 @3 j5 U{
. z) X4 d1 u) {! w6 i/ F        JANY jy;: Q% h; P7 T, i$ G/ B, t
        char home[5];
8 A, n* C# v) d1 {/ q2 E' S. I( c$ C}OWEN, *POWEN;
% k) \! |6 P; @2 p
9 b% ^$ s5 }7 b* |#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
8 @; Z8 }" \5 ~& W) b2 i$ `/ c4 D/ T  p/ t2 f1 F
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))4 D3 _7 o9 U. p9 a- F" R1 K
: X, t, A% M0 h, m. \7 O5 l; C" n" j$ R
#define PEI_CR(Record, TYPE, Field, Signature)   \# Q! j- |. ]6 K% i& [, ]
            _CR(Record, TYPE, Field)             8 ]& T& o8 o1 W6 ?1 C% N
* v: K) t3 C3 \# o6 {. d$ L, f
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \& i6 u( z. R' p9 I% m- R: K
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
. O  T& ~+ P0 W# p4 {3 D$ Y; ~
void main()$ _! p- x- }9 r2 H$ I
{
& W+ E& c5 i" [; S7 ?        PJANY        jany;# J" W3 W8 z" v0 ^
        POWEN        owen;
/ Y; Z$ l8 h6 N6 |. [/ |7 i# W        jany = malloc(sizeof(JANY));
' t& X" e# @8 }" B        owen = malloc(sizeof(OWEN));* y: V1 o  c* {5 O# S' }
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);) ^! ?, V+ Q) \3 w0 k
        free(owen);3 X, \$ r1 {  f. f6 Q1 i
        free(jany);1 j9 D, |" N. W7 W  ~3 b
        return;       
% s3 Z1 q6 k; F9 i* {}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。( _1 u. Y( n. }9 Z, x' |
6 l' w' d$ l2 g& @& O% b/ ]0 Y
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

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

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
" a3 m2 h8 \) W( k$ U5 K.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
& f0 @! Z% {% |  e* r7 O1 N) ?输入:一个结构体成员的地址指针,该成员所在结构体的结构& i1 H2 z' G2 W* \! A) p' t
输出:该成员所在结构体的地址指针0 i0 U. T" u; X2 n) C
8 J6 G$ s, z" r% O  s' F
算法:
2 h( v4 r3 }( D4 w. K1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量7 ?$ X: g2 v# X" @, r: q& m
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-4 07:47 , Processed in 1.758805 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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