gpt4 book ai didi

c - 在u-boot中,kernel_entry指向哪个函数?

转载 作者:太空宇宙 更新时间:2023-11-03 23:27:02 25 4
gpt4 key购买 nike

这是 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
}

我从相关问题中了解到:Trying to understand the usage of function pointer kernel_entry 是指向a 函数的指针。有人可以帮助我了解该功能的定义位置吗?我什至不知道这个函数的名称,所以我未能grep它。

注意:整个u-boot源代码是here .

最佳答案

确实kernel_entry是一个函数指针。它从传入的名为 images 的数据片段的 ep 字段初始化,类型为 bootm_header_tstruct 的定义在 include/image.h 中。这是可引导镜像 header 的定义,即内核镜像的 header ,其中包含从引导加载程序引导该镜像的基本信息。显然,要启动它,您需要一个程序入口点,类似于常规 C 程序中的 main 函数。

在该结构中,入口点被简单地定义为内存地址 (unsigned long),您列出的代码将其转换为该函数指针。

该结构是通过将镜像文件的第一个 block 加载到磁盘上获得的,引导加载程序已经知道其位置。

因此该函数指针指向的实际代码属于不同的二进制文件,函数的定义必须位于不同的源代码中。对于 linux 内核,这个入口点是一个汇编手工编码函数,其源代码在 head.S 中。此功能高度依赖于 arch,您会在内核树中找到许多实现它的同名文件。

关于c - 在u-boot中,kernel_entry指向哪个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24423960/

25 4 0