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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?+ L* ]$ u) l1 I+ z- n
我调试发现他是取得那个字段的地址。
  `/ M) b8 }/ F! ?: D大侠能详细解释一下吗?
! `% x. {4 ^1 k0 N3 j' [2 J. c3 O4 y# [  {
这段是我Debug的用例。1 y/ H, ]" A  H+ L
4 e2 A, J' Y* L8 D8 ~. p& F% j
#include "stdio.h"
2 ~: ?4 e4 e3 A3 s/ }5 z4 ~5 Y#include "stdlib.h"" ^7 C! j% _+ G
#include "string.h"
$ v2 r, ?: Z. o' u) J. W6 `( l1 l% ^+ \
#define        CHAR8                unsigned char) k' h# e( T8 U' H' l0 H

  |3 R; y- ?; f, N4 n+ d# e4 etypedef struct _tagjany
$ A( F3 e$ \% s, B1 g/ {: z" `8 B{
* t8 ~: i8 \( A! S8 I        char name[8];: B, Z* {3 r4 Q7 \* \; z) M2 Z
        int  age;
: q$ y7 b9 T; b5 C- Q}JANY, *PJANY;
( q+ X4 U- W# o  t+ v7 F# t$ o& C; d1 C1 O/ n: d, O
typedef struct _tagowen: ~* b2 W% ?. h& e. B
{' F5 `+ N7 C- L0 L! k
        JANY jy;+ b, E, ~- }% ]: Z" r0 ^0 |, J8 @" |
        char home[5];7 F5 Y4 e- F5 h4 U# |" {
}OWEN, *POWEN;
$ r) U8 i4 \+ x
- ?* W9 i0 ~# _) U9 j#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
0 F7 ?. ^5 a: w% w1 H) U' d" m. t$ v: g
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
$ m3 `& C/ L( E
/ c% a8 o7 c' i& I, A3 h4 u; E5 a; f#define PEI_CR(Record, TYPE, Field, Signature)   \
9 h- ?* i+ Q8 `. R: N- Z" h            _CR(Record, TYPE, Field)            
% \* M+ J: @# c9 s9 R* W+ N% e, d0 i3 m1 d
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \, b" [& P8 O  A. t( ?* L( Q
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
& O  v: @& Y7 k. t7 K9 H  Y  a
4 H+ _* @  R8 g9 D& ?- ]void main()
9 Y, x! }# |! c, a7 {4 I{3 H7 O, b" g2 \( |! m4 ]
        PJANY        jany;
# b, {- M8 X. h        POWEN        owen;
: Q3 f" ?. B* o, p; V2 H! v        jany = malloc(sizeof(JANY));! |0 G' T: {2 m, p
        owen = malloc(sizeof(OWEN));2 F/ Z) f2 I# x: s5 J1 U
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
' |0 o" t* r+ k* @        free(owen);
- \/ R: `* |7 T' v+ F$ }        free(jany);' _2 j6 a7 K. q. O! z' V
        return;       
5 E. s2 ?* z5 A) c6 a7 B' x}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
2 Q' F: f# @. ?# P/ k7 c
' s5 o% d! n: k你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。$ Y1 {0 F+ ~( p5 u# b8 H0 `* b5 g2 m
谢谢 “kelvinklee” 指点。) y) j9 x/ {. w* L% I' u* Y5 @& Y
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                $ a% u1 \3 ~5 E" e4 i
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
) Z) V0 C/ s. w. S/ z: |2 u: x输入:一个结构体成员的地址指针,该成员所在结构体的结构
; \8 a  Q& d4 d( r: F0 |) r输出:该成员所在结构体的地址指针# B  a& s$ w  K3 c' X* u

3 ?! m$ u4 S& j算法:
6 H* P. D5 [$ J; `* [1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
4 E1 f# U5 o6 z/ X2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 15:15 , Processed in 0.106009 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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