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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?8 F& u" N6 s2 X9 @$ ?
我调试发现他是取得那个字段的地址。
0 Q8 G+ r5 p) R  \( m& U大侠能详细解释一下吗?
& e4 d6 ], {& ^$ E, q- `5 G0 I+ X# Z7 C
这段是我Debug的用例。
: F2 t7 \6 x( f/ S% Q" i- L" t* G9 S; U( M! {' W1 o# a1 c5 ]+ o
#include "stdio.h"+ V  u) o1 T6 U8 `, ?
#include "stdlib.h"
! \0 D# Z& C; v: }7 d* @) |+ R' u#include "string.h"
; }* x' M9 g! i$ e( Y/ p3 h5 c* r  j1 D2 C) w
#define        CHAR8                unsigned char
) O8 X3 |# z  R/ N- m! @& h- H7 U6 d5 \
typedef struct _tagjany
/ o" F% `/ s3 O" k{
) [. o& ]8 H6 X4 @& W% g( C) p        char name[8];, p8 q4 r3 |% Z: {! E" S3 h5 Y5 T
        int  age;7 A8 B5 g1 n; Q  C( p" h
}JANY, *PJANY;
/ I/ o: t; s0 [. q4 H* C
8 Y+ R. S% @( i3 v. D2 D- Htypedef struct _tagowen5 e& I1 S2 h7 x6 Y+ L
{* G% @( [0 |/ I% s+ g: I
        JANY jy;
! l* m* U9 y& U) y% G( n        char home[5];: M9 n, {8 t+ V" T; V5 `! g* c, P
}OWEN, *POWEN;# f7 u' z7 i  J4 o
' Q( f, s3 }0 P
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
. U4 {+ o9 ]3 m/ w, [- R- s( k  X+ V) t. n( B# S
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))  h0 U) l( m6 ?6 H- N1 [
- q% I- |5 V5 [/ i; Y/ [# R2 W' b
#define PEI_CR(Record, TYPE, Field, Signature)   \
7 x; d3 u$ ?: S9 m$ K# f            _CR(Record, TYPE, Field)            
0 g5 W6 N, V: W) x0 v  a6 E3 }
0 d3 a5 l7 u) ~2 }#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \7 y* j" F2 F, u$ ?7 y
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
3 Z+ j- @# ^8 m+ d! f3 Q% ?
# E: O. y4 |0 }+ N4 [8 C. |0 ?void main()1 l. u9 P! V% _8 M
{  s$ i: R3 Q7 e3 H8 ^4 e
        PJANY        jany;# m2 a6 Y# j5 F2 K- X5 |9 C, O
        POWEN        owen;
+ a3 a, ~2 f# N        jany = malloc(sizeof(JANY));
# g1 S* @2 F7 t, V9 h) R3 {/ S' G        owen = malloc(sizeof(OWEN));( b* k. }& @" n: K
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);7 F5 R+ d# Y$ l- H" S& Y$ r4 Q2 r' p
        free(owen);0 \7 S- q3 F6 }& _9 f" O( \
        free(jany);0 Q  r1 Y* k' \# G* D
        return;       
1 A7 V" m8 {% X}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
2 ?5 O2 c9 w3 F$ t: X. T5 n# x1 \. s
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。% ]" t: ^$ q! N# K; v( _$ F. ]- g! W& j9 \
谢谢 “kelvinklee” 指点。; J8 F, `2 [  w+ Y
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
( Q/ b1 j8 e; v& G& {; E.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
0 e1 O( J4 ]  e+ K& G输入:一个结构体成员的地址指针,该成员所在结构体的结构
" V* x4 l8 a- y2 L5 n7 c3 V输出:该成员所在结构体的地址指针
% j8 \! w$ ~- L2 c. J$ `: r% W  W+ v7 {
算法:$ l$ q- H- d+ Q9 X+ J; V6 f5 h8 r
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
; C0 H  {+ z  Y2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 02:52 , Processed in 0.075140 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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