linux-kernel – 如何在解压缩失败时找到ARM Linux入口点?

linux-kernel – 如何在解压缩失败时找到ARM Linux入口点?,第1张

概述我试图通过U-boot在i.MX6的自定义板上启动 Linux(CPU内核是ARM Cortex A9) 我们似乎成功移植了Das U-Boot(2009.08).但是在最后的U-Boot消息中启动Linux失败:“启动内核……” 这是我的相关环境: bootargs=console=ttymxc1,115200 vmalloc=400M root=/dev/mmcblk0p1 rootwait 我试图通过U-boot在i.MX6的自定义板上启动 Linux(cpu内核是ARM Cortex A9)

我们似乎成功移植了Das U-Boot(2009.08).但是在最后的U-Boot消息中启动linux失败:“启动内核……”

这是我的相关环境:

bootargs=console=ttymxc1,115200 vmalloc=400M root=/dev/mmcblk0p1 rootwait consoleblank=0 earlyprintk vIDeo=mxcfb0:dev=lcd,LCD-ORTUS,if=RGB24 vIDeo=mxcfb1:dev=hdmi,1280x720M@60,if=RGB24 calibration tsdev=tsc2004 fbmem=10M,28Mbootcmd=ext2load mmc 0:1 10800000 /boot/uImage ; bootm 10800000

启动输出是

Loading file "/boot/uImage" from mmc device 0:1 (xxa1)  4043552 bytes read  ## Booting kernel from Legacy Image at 10800000 ...     Image name:   linux-3.0.35     Image Type:   ARM linux Kernel Image (uncompressed)     Data Size:    4043488 Bytes =  3.9 MB     Load Address: 10008000     Entry Point:  10008000     Verifying Checksum ... OK     Loading Kernel Image ... OK  OK  Starting kernel ...

当我objdump内核时,在地址80008000处,我看到了arch / arm / kernel / head.S的入口点,而不是arch / arm / boot / compressed / head.S.

我看到的是,内核甚至没有解压缩.我尝试添加一些寄存器 *** 作代码来发送压缩/ head.S中的GPIO信号,但没有响应.

我的问题是,我怎样才能确保U-Boot正在调用正确的入口点?

完全相同的内核二进制文件使用相同的U-Boot命令在飞思卡尔的参考板上成功启动.

编辑:我在U-Boot中添加了一些痕迹.在调用内核之前,指针theKernel是10008000而不是10800000.这是否意味着U-boot在错误的位置跳转?

解决方法

We seem to have ported Das U-Boot successfully.

有证据表明这是一个错误的假设.

Just before calling the kernel,the pointer theKernel is 100

We seem to have ported Das U-Boot successfully.

and not 1

We seem to have ported Das U-Boot successfully.

00.

您使用的是哪个版本的U-Boot?
在2012.10和2013.04版本的U-Boot中,变量theKernel仅由AVR32和MIPS等拱门的代码声明和使用.
没有应该使用内核的ARM代码.

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))images->ep;./arch/microblaze/lib/bootm.c:      (ulong) theKernel,rd_data_start,(ulong) of_flat_tree);./arch/microblaze/lib/bootm.c:  theKernel (commandline,(ulong) of_flat_tree);./arch/mips/lib/bootm.c:    voID (*theKernel) (int,char **,int *);./arch/mips/lib/bootm.c:    theKernel = (voID (*)(int,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,int *);./arch/mips/lib/bootm_qemu_mips.c:  theKernel = (voID (*)(int,int *))images->ep;./arch/mips/lib/bootm_qemu_mips.c:      (ulong) theKernel);./arch/mips/lib/bootm_qemu_mips.c:  theKernel(0,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将机器类型编号(aka arch_ID)正确传递给内核.
您需要验证是否在U-Boot中正确定义了此机器类型编号.

U-Boot的配置文件是什么样的?

I trIEd adding some register manipulation code to signal GPIOs in compressed/head.S with no response.

您是否理智检查此代码以确保其按预期工作?
您是否从U-Boot命令行尝试了GPIO *** 作?

My question is,how can I make sure U-Boot is calling the correct entry point?

对于ARM arch,它是跳转到bootm命令中指定的地址.
由于uImage加载地址和bootm指定相同的0x1

We seem to have ported Das U-Boot successfully.

00地址,因此应该是好的(假设U-Boot已正确配置并为ARM构建).

Just before calling the kernel,the pointer theKernel is 100

We seem to have ported Das U-Boot successfully.

and not 1

We seem to have ported Das U-Boot successfully.

00. Does this mean U-boot is jumPing at the wrong location?

是.
如果检查源代码(对于AVR32或MIPS),您会发现从映像头分配了内核,特别是入口点值.然后U-Boot会跳转到这个位置.
但真正的问题是你的ARM Cortex A9不应该使用这个代码或这个变量.
似乎没有为正确的拱门配置U-Boot和/或可能无法正确定义机器类型.

更正:

正如OP指出的那样,旧版本的U-Boot确实使用了变量theKernel,甚至用于ARM拱门.

U-Boot输出行:

Loading Kernel Image ... OK

表示U-Boot已经(成功)将内核映像(没有映像信息头)从0x1

We seem to have ported Das U-Boot successfully.

00的bootm地址(加上报头长度的偏移量0x40)复制到加载地址0x100

We seem to have ported Das U-Boot successfully.

.此内存移动 *** 作由common / cmd_bootm.c中的过程bootm_load_os()执行.

因此,您报告的0x100

We seem to have ported Das U-Boot successfully.

的值对于内核是正确的.
没有迹象表明U-Boot跳到了错误的位置.

如前所述,您应该验证是否正确定义了机器类型.该值将在arch/arm/plat-mxc/include/mach/uncompress.h中的__arch_decomp_setup()中使用,以便在内核引导之前的解压缩期间输出文本.

总结

以上是内存溢出为你收集整理的linux-kernel – 如何在解压缩失败时找到ARM Linux入口点?全部内容,希望文章能够帮你解决linux-kernel – 如何在解压缩失败时找到ARM Linux入口点?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1049170.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存