我们似乎已经成功移植了 Das U-Boot。
有证据表明这是一个错误的假设。
就在调用内核之前,指针 theKernel 是 10008000 而不是 10800000。
您使用的是哪个版本的 U-Boot?
在 U-Boot 的 2012.10 和 2013.04 版本中,该变量theKernel
仅由 AVR32 和 MIPS 等架构的代码声明和使用。
没有应该使用的 ARM 代码theKernel
。
u-boot-2012.10$ find . -print | xargs grep theKernel
./arch/avr32/lib/bootm.c: void (*theKernel)(int magic, void *tagtable);
./arch/avr32/lib/bootm.c: theKernel = (void *)images->ep;
./arch/avr32/lib/bootm.c: theKernel, params_start);
./arch/avr32/lib/bootm.c: theKernel(ATAG_MAGIC, params_start);
./arch/microblaze/lib/bootm.c: void (*theKernel) (char *, ulong, ulong);
./arch/microblaze/lib/bootm.c: theKernel = (void (*)(char *, ulong, ulong))images->ep;
./arch/microblaze/lib/bootm.c: (ulong) theKernel, rd_data_start, (ulong) of_flat_tree);
./arch/microblaze/lib/bootm.c: theKernel (commandline, rd_data_start, (ulong) of_flat_tree);
./arch/mips/lib/bootm.c: void (*theKernel) (int, char **, char **, int *);
./arch/mips/lib/bootm.c: theKernel = (void (*)(int, char **, char **, int *))images->ep;
./arch/mips/lib/bootm.c: (ulong) theKernel);
./arch/mips/lib/bootm.c: theKernel(linux_argc, linux_argv, linux_env, 0);
./arch/mips/lib/bootm_qemu_mips.c: void (*theKernel) (int, char **, char **, int *);
./arch/mips/lib/bootm_qemu_mips.c: theKernel = (void (*)(int, char **, char **, int *))images->ep;
./arch/mips/lib/bootm_qemu_mips.c: (ulong) theKernel);
./arch/mips/lib/bootm_qemu_mips.c: theKernel(0, NULL, NULL, 0);
./arch/nds32/lib/bootm.c: void (*theKernel)(int zero, int arch, uint params);
./arch/nds32/lib/bootm.c: theKernel = (void (*)(int, int, uint))images->ep;
./arch/nds32/lib/bootm.c: (ulong)theKernel);
./arch/nds32/lib/bootm.c: theKernel(0, machid, bd->bi_boot_params);
u-boot-2012.10$
请解释您如何能够跟踪不应在 ARM 处理器上定义或分配的变量。
U-Boot 打印“Starting kernel ...”之后的下一个输出应该是“Uncompressing Linux...”。
对于飞思卡尔拱门,此文本输出取决于U-Boot将machine type number
(aka ) 正确传递给内核。
您需要验证这在 U-Boot 中是否正确定义。 arch_id
machine type number
你的 U-Boot 配置文件是什么样的?
我尝试添加一些寄存器操作代码来向compressed/head.S 中的GPIO 发送信号,但没有响应。
您是否仔细检查了此代码以确保其按预期工作?
您是否尝试过 U-Boot 命令行中的 GPIO 操作?
我的问题是,如何确保 U-Boot 调用了正确的入口点?
对于 ARM 架构,它是跳转到bootm命令中指定的地址。
由于 uImage 加载地址和bootm指定相同的 0x10800000 地址,这应该很好(假设 U-Boot 已正确配置并为 ARM 构建)。
就在调用内核之前,指针 theKernel 是 10008000 而不是 10800000。这是否意味着 U-boot 跳错了位置?
是的。
如果您检查源代码(对于 AVR32 或 MIPS),您会发现它theKernel
是从图像标题分配的,特别是入口点值。U-Boot 然后会跳转到这个位置。
但真正的问题是您的 ARM Cortex A9 不应该使用此代码或此变量。
似乎 U-Boot 没有为正确的拱门配置和/或机器类型可能没有正确定义。
更正:
正如 OP 所指出的,旧版本的 U-BoottheKernel
甚至在 ARM 架构中也使用了该变量。
U-Boot输出线:
Loading Kernel Image ... OK
表示 U-Boot 已经(成功)将内核映像(没有映像信息头)从bootm
地址 0x10800000(加上头长度的偏移量 0x40)复制到加载地址 0x10008000。此内存移动操作由common/cmd_bootm.cbootm_load_os()
中的过程执行。
所以你报告的 0x10008000 的值是正确的theKernel
。
没有迹象表明 U-Boot 跳到了错误的位置。
如前所述,您应该验证机器类型是否正确定义。该值将__arch_decomp_setup()
在arch/arm/plat-mxc/include/mach/uncompress.h 中使用,以便在内核启动之前的解压缩期间输出文本。