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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
( K! s. h5 J. c7 ]我调试发现他是取得那个字段的地址。! p* H& D! M% `7 u
大侠能详细解释一下吗?
, n- F" u. ?4 {' b$ F+ X0 W7 |, t0 C, R1 w; k4 y
这段是我Debug的用例。
' q% M* p5 n. o7 s9 o' F
" V) W; ^; [# H) T#include "stdio.h"( Z/ e' b  c. |* T0 Q9 F+ N0 l
#include "stdlib.h"/ C  Q; d/ k3 |+ p3 y
#include "string.h"
) ]9 k( `( R, J/ P1 g* ~7 z) q$ ~
9 }2 {9 U. |5 Z#define        CHAR8                unsigned char
! @9 p- y! Y* b3 D7 y9 `7 p; E" y6 C; K, `) g1 u
typedef struct _tagjany
  _& O0 z0 x$ O0 ^1 e3 |{
4 `9 p7 ^5 i: E, C) r+ s' k- B        char name[8];
' |, t$ {' L. W        int  age;! J8 Q5 ?/ ?4 f: B0 D; [/ y$ x2 P
}JANY, *PJANY;
0 v& {9 b! j% ]( Z2 S* ?2 Q2 \6 l+ P! Y! L) y( L
typedef struct _tagowen
7 h2 L2 N0 n: Z3 y( R9 o$ a{1 B* v0 _6 w$ e; [) C+ M
        JANY jy;: n* t% `2 \) H& r: Q
        char home[5];
' \% C8 l# N* N& f. |4 \}OWEN, *POWEN;
" \+ W0 Z6 K+ j
9 v' i; R' L( r! z5 x#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"5 w- |3 E* |8 C6 S

- j% Z/ P( U, \: h+ _3 `8 |0 U/ _3 Z0 l#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
2 c- m7 T4 q0 c* ?" H
  a) d5 r) [6 y: f; ?9 L$ ]9 N* @#define PEI_CR(Record, TYPE, Field, Signature)   \
: f9 {" Y1 |! n+ k" ^" `            _CR(Record, TYPE, Field)             6 r  W3 x. R& D9 Y! ~$ I  X+ O

" l4 y$ q) }7 ^; }+ x#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
+ I) t# P; M0 F, P& N# }9 K" ^  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))+ ?# [- |& q. B) o# p5 ?; G8 g8 s
8 x7 b8 U) S1 b( n, u
void main()$ `  p! C  d# r# F$ a% t5 V
{
3 M3 }/ I; f% L4 f/ V$ i+ L        PJANY        jany;4 k2 M+ [( q! b' \# T5 Y
        POWEN        owen;
' t4 F8 W$ Z9 A" E7 q; q( m        jany = malloc(sizeof(JANY));
& X9 a$ \$ C6 J* z, ]        owen = malloc(sizeof(OWEN));
. l& D2 \2 K3 P  w) @        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
; R; `6 ~, e4 a5 O: s        free(owen);2 |* d' N8 P6 ]* r' B5 Q, @
        free(jany);
" R0 T+ _5 G1 O; P' A8 E' R        return;       
/ j$ x0 ]: r. h, S( G}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
. y$ c6 d& ~3 D4 y  I
6 |4 b# y+ j' ?4 C* F1 f7 A你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
& X$ _- l3 c  e! j" @3 W谢谢 “kelvinklee” 指点。
" N: B' c9 M0 `/ a& o* phttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
% @+ D5 i  g3 q# ]& G.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
, m. U& z$ A# }: q输入:一个结构体成员的地址指针,该成员所在结构体的结构
7 x: a1 d$ e, t) F输出:该成员所在结构体的地址指针9 F5 t. [& r( H9 `) _% \
: ~0 t  @" G9 G$ o! O5 |
算法:6 C, L3 y. F) L& ?- h
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量( a# w- L. m5 [, c4 Q9 N
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-12 08:06 , Processed in 0.097292 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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