U-Boot中跳转至内核代码段的代码位置及32位入口点计算代码查询
U-Boot跳转内核及32位入口点计算代码位置
一、bootm/bootz跳转内核的核心代码
- 通用逻辑入口:
common/bootm.c中的bootm_do_exec()函数,该函数会调用对应架构的专属跳转实现。 - 32位ARM架构的具体跳转:
arch/arm/lib/bootm.c里的do_bootm_linux()函数,最终通过kernel_entry()宏(定义于arch/arm/include/asm/system.h)完成跳转,本质是直接跳转到计算好的入口地址执行。
二、32位系统内核入口点计算代码
- 针对32位ARM常用的zImage格式:入口点计算逻辑在
arch/arm/lib/bootm.c的do_bootm_linux()中,会读取zImage头部0x24偏移处的32位start字段(代码段起始偏移),结合loadaddr得出实际入口地址:入口地址 = loadaddr + 头部存储的代码段偏移。 - 若使用uImage格式:uImage头部(
struct image_header,定义在include/image.h)包含ih_ep字段,直接存储内核入口地址,bootm命令会直接读取该值作为跳转目标,无需额外计算。 - 其他32位架构(如MIPS、PowerPC):对应代码在
arch/<架构名>/lib/bootm.c中,逻辑类似,均从镜像头部提取信息或直接使用指定地址完成入口点计算。
三、补充说明
fatload仅负责将内核镜像加载到指定loadaddr,入口点计算和跳转逻辑完全由bootm/bootz命令处理,核心代码均集中在上述架构相关的bootm实现文件中。
内容的提问来源于stack exchange,提问作者전기현
相关产品推荐
相关产品推荐

