gpt4 book ai didi

c - 试图理解函数指针的用法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:53:46 24 4
gpt4 key购买 nike

这是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 变量及其类型的声明,它是一个指向函数的指针,该函数采用intintuint 并返回 void(可能是最令人困惑的部分),在这里:

void (*kernel_entry)(int zero, int arch, uint params);

赋值,images->ep被转换成想要的签名函数指针,并放入变量中:

kernel_entry = (void (*)(int, int, uint))images->ep;

最后调用函数:

kernel_entry(0, machid, r2);

请注意,如果定义了 CONFIG_ARM64,则 kernel_entry 指向的函数具有不同的签名:

void (*kernel_entry)(void *fdt_addr); //takes one void* param and returns void

关于c - 试图理解函数指针的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24409821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com