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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?  g/ z6 F6 A0 n
我调试发现他是取得那个字段的地址。
5 K7 H$ h9 L& z5 r5 U  I大侠能详细解释一下吗?
0 d: i8 T' x, J' y& U
" E( ~+ n$ K. c5 B这段是我Debug的用例。6 [1 r! G7 N0 A( E( V

' G6 V" q9 U) G: S! q: l#include "stdio.h"
6 ^; Q/ g" S! P#include "stdlib.h"
0 B+ a4 \1 l  L4 o6 s# g0 z* z#include "string.h"( P* R' g: q$ I2 M3 }1 p
0 g3 k$ l* ]# n8 Q
#define        CHAR8                unsigned char
' @7 N, U$ W, c3 P3 g% A
4 `/ K7 n2 W! Z$ g" t% W4 Z0 Qtypedef struct _tagjany
1 I0 M! z) ~$ A& W7 a3 @9 u3 c{
1 @8 A+ T4 f& K0 r" l  }        char name[8];
+ Z6 V) L. h. W$ V# u        int  age;
9 i2 \0 W/ B9 ]' ]& C9 S% O) V4 D}JANY, *PJANY;8 q" o% O) Y6 S5 G

1 G) z. `6 A7 p3 itypedef struct _tagowen8 O: _8 u9 h# ?* Q/ h
{
: w- L8 P; X) E. V        JANY jy;: m# B/ ]6 h, R$ A; j7 E) R
        char home[5];( i/ N' [1 S* p/ P* V. M, F
}OWEN, *POWEN;. e1 M- g' K% J5 {$ y4 r
' V+ f' N! u) P9 L5 D% W# @
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
1 u& ^9 f) I' r% u& ]8 R& h; w6 N
# V- l7 E4 t4 G5 Y( T0 M6 P' ~: |3 `#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))+ x  C! y5 W' @  c& f7 s5 X* e

1 K9 t( t' h- T+ d5 R#define PEI_CR(Record, TYPE, Field, Signature)   \; _, a1 z+ k6 `+ N& Z# y" K" H+ N
            _CR(Record, TYPE, Field)            
" f7 x  e9 T* ]0 W! ]  C" z( r! r5 w" c
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \8 x! P9 ]. C% h# ]
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
* Q+ Y2 n- c* }4 V! [' y# e5 ~
7 ^; b2 O6 H- a' ]  [void main(); e  A# m4 L6 ^- ]6 z& ?& W) R
{
3 I, ^+ |1 ?  P" P- v% a/ P! d        PJANY        jany;3 ^3 v; W. V% \  S: k. I! ?! O" I
        POWEN        owen;1 [9 W' L/ a6 y1 O/ I* I, {4 E
        jany = malloc(sizeof(JANY));0 h/ V/ i' S. k0 V6 O; a
        owen = malloc(sizeof(OWEN));
3 @& M; B+ x  F        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
. E3 R% `/ S9 g8 a7 }0 b        free(owen);; p+ B! y* x! x+ l
        free(jany);
; k1 p* H" I/ D        return;       
* B) U  Y% ]+ a/ }3 J}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。3 p7 `) K' F: |0 K: A! ]1 T! ]
- P" a6 q8 ~4 ?' {' ?
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。+ k& @( A. X( ?: w7 o
谢谢 “kelvinklee” 指点。
) `8 K% ?" @! q) Yhttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
+ }" B* T8 d' x3 Q- P* R.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
) S1 X/ ]: e, ^9 I% V& y3 @输入:一个结构体成员的地址指针,该成员所在结构体的结构4 P1 G4 K. `" o% V
输出:该成员所在结构体的地址指针
4 K7 g' s( @) N* G! [# Q! y. s  g3 H/ }& A0 _3 q9 j
算法:1 C9 d; N; P0 Q; j
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
0 B/ K- \% `8 S  U* _9 U# N2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-1 21:24 , Processed in 0.142601 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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