C iPXE如何在不调用其名称的情况下执行函数

C iPXE如何在不调用其名称的情况下执行函数,c,ipxe,C,Ipxe,在中,它调用initialize()和startup()。在中的每个函数中,它循环遍历包含已注册函数的表并调用它们: void startup ( void ) { struct startup_fn *startup_fn; if ( started ) return; /* Call registered startup functions */ for_each_table_entry ( startup_fn, STARTUP_FNS

在中,它调用initialize()startup()。在中的每个函数中,它循环遍历包含已注册函数的表并调用它们:

void startup ( void ) {
    struct startup_fn *startup_fn;

    if ( started )
        return;

    /* Call registered startup functions */
    for_each_table_entry ( startup_fn, STARTUP_FNS ) {
        if ( startup_fn->startup )
            startup_fn->startup();
    }

    started = 1;
}
根据评论,我不知道注册的函数在哪里

:

:

\uuu表是我可以查看的内容的结尾。注释说它“声明一个链接器表”。但它如何获得这些功能呢

还有更多,例如\u表格\u条目表格\u开始。。。这张桌子是从哪里来的?它的条目在哪里?这意味着什么:

#define table_start( table ) __table_entries ( table, 00 )
这里的
00
是什么意思

请帮忙。我真的很想理解。谢谢。

(我就是编写相关代码的人。)

链接器脚本指示链接器按字母顺序排列“.tbl.*”节。__table_entry etc宏用于将结构放置到这些节中。理解这一点最简单的方法可能是查看链接器映射,您可以使用例如“make bin/rtl8139.rom.map”生成链接器映射:

在这里,您可以看到各种结构(heap_init_fn、pxe_init_fn、smbios_init_fn)等已连续放置在最终图像中,按初始化顺序排序(01=init_EARLY,用于malloc.c中的heap_init_fn;04=init_NORMAL,用于smbios_settings.c中的smbios_init_fn等)

init.c中的_table_start和_table_end宏生成放置在.tbl.init_fns.00和.tbl.init_fns.99中的零长度数组;然后,init.c中的代码可以使用它们来标识链接器构造的表的开始和结束

希望有帮助

Michael(我就是编写这段代码的人。)

链接器脚本指示链接器按字母顺序排列“.tbl.*”节。__table_entry etc宏用于将结构放置到这些节中。理解这一点最简单的方法可能是查看链接器映射,您可以使用例如“make bin/rtl8139.rom.map”生成链接器映射:

在这里,您可以看到各种结构(heap_init_fn、pxe_init_fn、smbios_init_fn)等已连续放置在最终图像中,按初始化顺序排序(01=init_EARLY,用于malloc.c中的heap_init_fn;04=init_NORMAL,用于smbios_settings.c中的smbios_init_fn等)

init.c中的_table_start和_table_end宏生成放置在.tbl.init_fns.00和.tbl.init_fns.99中的零长度数组;然后,init.c中的代码可以使用它们来标识链接器构造的表的开始和结束

希望有帮助

Michael

顺便说一句,_table()宏是如何定义和使用向量值宏的一个很好的例子。顺便说一句,_table()宏是如何定义和使用向量值宏的一个很好的例子。
#define __table( type, name ) ( type, name )
#define table_start( table ) __table_entries ( table, 00 )
.tbl.init_fns.00
            0x000000000001784c        0x0 bin/blib.a(init.o)
.tbl.init_fns.01
            0x000000000001784c        0x4 bin/blib.a(malloc.o)
            0x000000000001784c                heap_init_fn
.tbl.init_fns.04
            0x0000000000017850        0x4 bin/blib.a(pxe_call.o)
            0x0000000000017850                pxe_init_fn
.tbl.init_fns.04
            0x0000000000017854        0x4 bin/blib.a(settings.o)
            0x0000000000017854                builtin_init_fn
.tbl.init_fns.04
            0x0000000000017858        0x4 bin/blib.a(smbios_settings.o)
            0x0000000000017858                smbios_init_fn
.tbl.init_fns.04
            0x000000000001785c        0x4 bin/blib.a(process.o)
            0x000000000001785c                process_init_fn
.tbl.init_fns.05
            0x0000000000017860        0x4 bin/blib.a(embedded.o)
            0x0000000000017860                embedded_init_fn
.tbl.init_fns.99
            0x0000000000017864        0x0 bin/blib.a(init.o)