2018年7月12日 星期四

EDK常見的Macro - CR

在追EDK的Source Code時,會常看見Macro CR()的使用,其意義在於利用某個struct成員的記憶體位址,來獲得該struct的起始記憶體位址, 以此可以在記憶體操作上做更靈活的運用, 通常用於EFI Protocol。


#define CR (Record, TYPE, Field) \
  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))


Record - Struct成員的記憶體位址
TYPE - Struct所宣告的型態
Field - Struct成員使用的名稱


CR拆解


1. &(((TYPE *) 0)->Field)
取得Struct成員在Struct中的offset

2. (CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)
用Struct成員的實際記憶體位址減去Offset,就可得到Struct的記憶體位址

3. (TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field))
再轉型回Struct的宣告型態


沒有留言:

張貼留言