这是u-boot的function:
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 environmentn", 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
是一个指向函数的指针。 有人可以帮我理解定义函数的位置吗? 我甚至不知道这个函数的免费精选名字大全,所以我没有把它grep
。
注意:整个u-boot源代码在这里 。
确实kernel_entry
是一个函数指针。 它是从bootm_header_t
类型的被调用images
传递的数据的ep
字段初始化的。 该struct
的定义在include/image.h
。 这是可引导映像头的定义,即内核映像的头,其中包含从引导加载程序引导该映像的基本信息。 显然,要启动它,您需要一个程序入口点,类似于常规C程序中的主要function。
在该结构中,入口点被简单地定义为内存地址( unsigned long
),您列出的代码将其转换为该函数指针。
通过将映像文件的第一个块加载到磁盘上获得的结构,其位置已由引导加载程序已知。
因此,该函数指针指向的实际代码属于不同的二进制文件,并且函数的定义必须位于不同的源代码中。 对于Linux内核,此入口点是一个程序集手动编码函数,其源代码位于head.S
。 此函数高度依赖于arch,您将在内核树中找到许多具有该名称的文件。
以上就是c/c++开发分享在u-boot中,kernel_entry指向哪个函数?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/559621.html