平台:rk3399+linux5.10
问题:发现启动时有一个内核警告信息
Kernel image misaligned at boot, please fix your bootloader!
后面的数字是我打印的地址信息。
不知道这个内核搞一个这样的警告是什么原因,我就没有继续深挖啦。
一、通过搜索,源码中找到这个报警告的位置
1.1 在arch/arm64/kernel/setup.c 文件中 有一个setup_arch函数中发现该警告信息:
看这个if的判断是,efi没有开启的情况下,判断内核的这个地址是否满足对齐要求,不满足时,报出该警告信息,但是不会作出其他操作。
搜了一下对齐要求,看来是2MB字节。
1.2 我因为没有使用uefi,是在内核中把该配置关闭了。
所以if的函数efi_enabled是返回0,那就是要进行对齐判断。
二、这个打印的地址是个虚拟地址,也就是内存地址了。
2.1 因为内核是被uboot这种启动引导加载进内存的,所以这个地址跟uboot相关。
2.2 那就去uboot中找,怎么设置内核的加载地址的。
根据打印的提示,Booting IMAGE kernel at 0x00280000 with fdt at 0x8300000...
找到这个点。
2.3 找到526行打印的信息
kernel_addr_r 就是内核加载到内存的地址,但是这个变量的值来自环境变量(env_get这个函数是读取环境变量的值)。
2.4 因为目前rk3399没有把环境变量保存到emmc,那肯定就是使用了uboot中的默认环境变量值。
找到rk3399_common.h (因为grep -nr kernel_addr_r 打印的内容太多了,我因为截图方便,重新加了一层rk3399的过滤,文件的内容已经被我修改了。)
2.5 打开rk3399_common.h,并修改
2.6 重新编译并下载即可。
三、警告问题已解决。
3.1 对初学者的一些建议吧:
3.1.1 这里确实有一些判断是经验,比如内核的地址,判断为uboot的内核加载的地址。
3.1.2 内核是uboot加载到内核的,这个还是要比较清楚,所以加载的地址是uboot决定的。
3.1.3 环境变量的情况,也要根据实际开发板的情况进行判断,rk3399呢,我接触了几块,基本都没有把环境变量设置到flash的情况,所以我可以里面判断它肯定是默认环境变量。
3.1.4 当然我自己也是半吊子,如果能给您帮助或启发,这是我的荣幸。这是我目前去解决一个问题的大体思路,或许可以稍微参考一下。有其他问题,欢迎私信我啦。