这是 u-boot 的函数:
static void boot_jump_linux(bootm_headers_t *images, int flag)
{
#ifdef CONFIG_ARM64
void (*kernel_entry)(void *fdt_addr);
int fake = (flag & BOOTM_STATE_OS_FAKE_GO);
kernel_entry = (void (*)(void *fdt_addr))images->ep;
debug("## Transferring control to Linux (at address %lx)...\n",
(ulong) kernel_entry);
bootstage_mark(BOOTSTAGE_ID_RUN_OS);
announce_and_cleanup(fake);
if (!fake)
kernel_entry(images->ft_addr);
#else
unsigned long machid = gd->bd->bi_arch_number;
char *s;
void (*kernel_entry)(int zero, int arch, uint params);
unsigned long r2;
int fake = (flag & BOOTM_STATE_OS_FAKE_GO);
kernel_entry = (void (*)(int, int, uint))images->ep;
s = getenv("machid");
if (s) {
strict_strtoul(s, 16, &machid);
printf("Using machid 0x%lx from environment\n", machid);
}
debug("## Transferring control to Linux (at address %08lx)" \
"...\n", (ulong) kernel_entry);
bootstage_mark(BOOTSTAGE_ID_RUN_OS);
announce_and_cleanup(fake);
if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len)
r2 = (unsigned long)images->ft_addr;
else
r2 = gd->bd->bi_boot_params;
if (!fake)
kernel_entry(0, machid, r2);
#endif
}
我从相关问题中了解到:尝试理解函数指针的用法 https://stackoverflow.com/questions/24409821/trying-to-understand-the-usage-of-function-pointer that kernel_entry
是一个指向a功能。有人可以帮助我理解该函数的定义位置吗?我什至不知道这个函数的名称,所以我失败了grep
it.
NOTE:整个u-boot源代码是here https://github.com/Xilinx/u-boot-xlnx/blob/master/arch/arm/lib/bootm.c.
Indeed kernel_entry
是一个函数指针。它是从初始化的ep
传入的数据片段的字段被称为images
,类型bootm_header_t
。那的定义struct
is in include/image.h
。这是可引导映像标头的定义,即内核映像的标头,其中包含从引导加载程序引导该映像的基本信息。显然,要启动它,您需要一个程序入口点,类似于常规 C 程序中的 main 函数。
在该结构中,入口点简单地定义为内存地址(unsigned long
),您列出的代码将其转换为该函数指针。
该结构是通过在磁盘上加载映像文件的第一个块而获得的,引导加载程序已经知道其位置。
因此,该函数指针指向的实际代码属于不同的二进制文件,并且该函数的定义必须位于不同的源代码中。对于Linux内核,这个入口点是一个汇编手工编码的函数,其源代码位于head.S
。该函数高度依赖于架构,您会在内核树中找到许多同名的文件来实现它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)