记录一下用开发板上已有的uboot启动内核的艰辛
开发板跑的uboot是arm(32位),想让当前的uboot启动64位的内核,开发板的硬件(Core)是支持64位的,那么问题来了,32位的uboot支持64位的linux内核吗,一番搜索也没找到,就姑且认为支持吧。
内核镜像、设备树文件、initrd镜像准备好后,制作its,准备将内核镜像、设备树文件、initrd镜像生成itb在uboot上启动。
将itb加载到内存后,bootm itb进行启动,启动失败,日志如下
Starting kernel ...
"Synchronous Abort" handler, esr 0x02000000
elr: ffffffffe4401000 lr : 0000000060105fb4 (reloc)
elr: 0000000080008000 lr : 00000000fbd0cfb4
x0 : 0000000090000000 x1 : 0000000000000000
x2 : 0000000000000000 x3 : 0000000000000000
x4 : 0000000080008000 x5 : 0000000000000001
x6 : 0000000000000008 x7 : 0000000000000000
x8 : 00000000fbbc3d80 x9 : 0000000001008000
x10: 000000000a200023 x11: 0000000000000002
x12: 0000000000000002 x13: 00000000000102c4
x14: 00000000fbbc3dfc x15: 00000000fbd09318
x16: 0000000000001080 x17: 0000040080000000
x18: 00000000fbbc6d70 x19: 00000000fbdcecb8
x20: 0000000000000000 x21: 0000000080008000
x22: 0000000000000001 x23: 00000000fbbe3bf8
x24: 0000000000000000 x25: 00000000fbdb56c0
x26: 00000000a00000e8 x27: 0000000000000400
x28: 00000000a15c1ddf x29: 00000000fbd0cf7c
Resetting CPU ...
resetting ...
U-Boot
又是一番搜索,然而并没找到解决办法,怀疑是32位的uboot不支持64位的内核镜像,但仅仅是怀疑,想着利用qemu 起 64位的uboot,然后uboot 起64位的内核镜像,要是可以就证实怀疑的观点了,qemu 起64位的uboot 里输入了help ,看到了booti命令,
booti - boot arm64 Linux Image image from memory
想着是不是必须用booti来启动64位的linux 内核镜像?于是将initrd镜像编译进Linux内核镜像里
这一步需要修改内核配置项以及设置initrd镜像路径
内核配置项做如下修改:
General setup -->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
设置路径
General setup -->
(your_initrd_path) Initramfs source file(s)
然后在uboot命令行加载内核镜像和设备树文件到内存中,下面命令进行启动
booti iamge_adr - fdt_adr
booti格式 booti addr [initrd[:size]] [fdt]
其中:addr是kernel Image文件所在的memory地址;[initrd[:size]]是initrd在memory中的位置和size,可以不指定,使用“-”代替即可;fdt是flat device tree(就是传说中的dtb文件)在memory中的地址,在ARM64中,它是必选的。
终于进到走进内核启动了。
所以32位的uboot是可以跑64位的内核镜像的,应该是硬件(Core)支持64位的指令集,所以就可以跑。
bootm、booti、bootz 这三个启动内核的命令有待进一步深究才能知道这里错误的原因。