【发布时间】:2014-06-27 02:14:32
【问题描述】:
这是u-boot's bootm.c 中启动内核的函数:
/* Subcommand: GO */
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
}
我很难理解kernel_entry 是如何在这里工作的。特别是在倒数第二行中,它被用作:
kernel_entry(0, machid, r2);
那么kernel_entry()的定义在哪里?我在整个 u-boot 和内核源代码中找不到。
更新
我在这里重新表述我的问题:
假设kernel_entry 是一个指向函数的指针,并被定义为:
bootm_headers_t *images
kernel_entry = (void (*)(int, int, uint))images->ep;
然后在程序的某个地方被称为:
kernel_entry(0, machid, r2);
我理解作为一个指针,kernel_entry 应该存储一个函数的地址。但我想了解对这三个参数执行哪些操作。为什么我们会有这些论点?
【问题讨论】:
-
kernel_entry = (void (*)(int, int, uint))images->ep; -
函数会对这三个参数(即 int、int、uint)执行什么操作?
-
它不是一个函数,它是一个指针转换,因此您可以使用 3 个参数调用 kernel_entry,前两个参数为
int,第三个参数为uint -
谢谢。你能解释一下'kernel_entry = (void (*)(int, int, uint))images->ep;'中到底发生了什么吗?并作为答案回复?
-
您介意格式化代码以使其可读吗?