iPXEソース コードを調べて、起動のこの段階で早い段階で何が起こるかを理解しようとしていますが、いくつかの主要なネストされたマクロ展開が行われており、それについてよく知らず、追跡するのに苦労しています。
ソース ファイル ( core/init.c
) の 1 つに、次のファイルがあります。
void initialise ( void ) {
struct init_fn *init_fn;
/* Call registered initialisation functions */
for_each_table_entry ( init_fn, INIT_FNS )
init_fn->initialise ();
}
だから私はの展開を歩いていfor_each_table_entry
ます。
関連するマクロ定義の一部を次に示します。
#define for_each_table_entry( pointer, table ) \
for ( pointer = table_start ( table ) ; \
pointer < table_end ( table ) ; \
pointer++ )
#define table_start( table ) __table_entries ( table, 00 )
#define table_end( table ) __table_entries ( table, 99 )
#define __table_entries( table, idx ) ( { \
static __table_type ( table ) __table_entries[0] \
__table_entry ( table, idx ) \
__attribute__ (( unused )); \
__table_entries; } )
#define __table_type( table ) __table_extract_type table
#define __table_extract_type( type, name ) type
#define __table_entry( table, idx ) \
__attribute__ (( __section__ ( __table_section ( table, idx ) ),\
__aligned__ ( __table_alignment ( table ) ) ))
#define __table_section( table, idx ) \
".tbl." __table_name ( table ) "." __table_str ( idx )
#define __table_str( x ) #x
#define __table_alignment( table ) __alignof__ ( __table_type ( table ) )
#define __table_name( table ) __table_extract_name table
#define __table_extract_name( type, name ) name
ふぅ、多分それだと思います。私の意見では、とんでもない量のネストされた拡張です。
したがって、何が起こっているのかを確認するために手動で展開しようとすると、次のようになります。
# 1
for_each_table_entry ( init_fn, INIT_FNS )
# 2
for ( init_fn = table_start ( INIT_FNS ) ; \
init_fn < table_end ( INIT_FNS ) ; \
init_fn++ )
# 3
for ( init_fn = __table_entries ( INIT_FNS, 00 ) ; \
init_fn < __table_entries ( INIT_FNS, 00 ) ; \
init_fn++ )
# 4
for ( init_fn = ( { \
static __table_type ( INIT_FNS ) __table_entries[0] \
__table_entry ( INIT_FNS, 00 ) \
__attribute__ (( unused )); \
__table_entries; } ) ; \
init_fn < ( { \
static __table_type ( INIT_FNS ) __table_entries[0] \
__table_entry ( INIT_FNS, 99 ) \
__attribute__ (( unused )); \
__table_entries; } ) ; \
init_fn++ )
# 5
for ( init_fn = ( { \
static __table_extract_type INIT_FNS __table_entries[0] \
__attribute__ (( __section__ ( __table_section ( INIT_FNS, 00 ) ),\
__aligned__ ( __table_alignment ( INIT_FNS ) ) )) \
__attribute__ (( unused )); \
__table_entries; } ) ; \
init_fn < ( { \
static __table_extract_type INIT_FNS __table_entries[0]
__attribute__ (( __section__ ( __table_section ( INIT_FNS, 99 ) ),\
__aligned__ ( __table_alignment ( INIT_FNS ) ) ))
__attribute__ (( unused )); \
__table_entries; } ) ; \
init_fn++ )
# 6
for ( init_fn = ( { \
static __table_extract_type INIT_FNS __table_entries[0] \
__attribute__ (( __section__ ( ".tbl." __table_name ( INIT_FNS ) "." __table_str ( 00 ) ),\
__aligned__ ( __alignof__ ( __table_type ( INIT_FNS ) ) ) )) \
__attribute__ (( unused )); \
__table_entries; } ) ; \
init_fn < ( { \
static __table_extract_type INIT_FNS __table_entries[0]
__attribute__ (( __section__ ( ".tbl." __table_name ( INIT_FNS ) "." __table_str ( 99 ),\
__aligned__ ( __alignof__ ( __table_type ( INIT_FNS ) ) ) ))
__attribute__ (( unused )); \
__table_entries; } ) ; \
init_fn++ )
# 7
for ( init_fn = ( { \
static __table_extract_type INIT_FNS __table_entries[0] \
__attribute__ (( __section__ ( ".tbl." __table_extract_name INIT_FNS "." #00 ),\
__aligned__ ( __alignof__ ( __table_extract_type INIT_FNS ) ) )) \
__attribute__ (( unused )); \
__table_entries; } ) ; \
init_fn < ( { \
static __table_extract_type INIT_FNS __table_entries[0]
__attribute__ (( __section__ ( ".tbl." __table_extract_name INIT_FNS "." #99,\
__aligned__ ( __alignof__ ( __table_extract_type INIT_FNS ) ) ))
__attribute__ (( unused )); \
__table_entries; } ) ; \
init_fn++ )
聖なる地獄のバットマン、私はそれだと思います。つまり、そこにはもっとマクロがあるように見えるので、私は混乱しているかもしれませんが、オブジェクトタイプのマクロ定義は見当たりません
__table_extract_type
__table_extract_name
__table_entries
__attribute__
__aligned__
- デフあります。のため
__aligned__attribute__
に、多分私はそれを台無しにしましたか?
- デフあります。のため
__section__
__alignof__
私の展開は正しかったでしょうか?もしそうなら、これはどのように有効なコードですか? これは低レベルの C/ASM のものですか? 組み立ての基本は知っていますが、ここ数年使用していないので、ここで何が起こっているのかわかりません。