linux5.10的一个警告Kernel image misaligned at boot, please fix your bootloader!

平台:rk3399+linux5.10

问题:发现启动时有一个内核警告信息

Kernel image misaligned at boot, please fix your bootloader!

后面的数字是我打印的地址信息。

不知道这个内核搞一个这样的警告是什么原因,我就没有继续深挖啦。

linux5.10的一个警告Kernel image misaligned at boot, please fix your bootloader!_第1张图片

一、通过搜索,源码中找到这个报警告的位置

1.1  在arch/arm64/kernel/setup.c 文件中 有一个setup_arch函数中发现该警告信息:

linux5.10的一个警告Kernel image misaligned at boot, please fix your bootloader!_第2张图片

看这个if的判断是,efi没有开启的情况下,判断内核的这个地址是否满足对齐要求,不满足时,报出该警告信息,但是不会作出其他操作。

搜了一下对齐要求,看来是2MB字节。

1.2 我因为没有使用uefi,是在内核中把该配置关闭了。

所以if的函数efi_enabled是返回0,那就是要进行对齐判断。

二、这个打印的地址是个虚拟地址,也就是内存地址了。

2.1 因为内核是被uboot这种启动引导加载进内存的,所以这个地址跟uboot相关。

linux5.10的一个警告Kernel image misaligned at boot, please fix your bootloader!_第3张图片

2.2 那就去uboot中找,怎么设置内核的加载地址的。

根据打印的提示,Booting IMAGE kernel at 0x00280000 with fdt at 0x8300000...

linux5.10的一个警告Kernel image misaligned at boot, please fix your bootloader!_第4张图片

找到这个点。

2.3 找到526行打印的信息

linux5.10的一个警告Kernel image misaligned at boot, please fix your bootloader!_第5张图片

kernel_addr_r 就是内核加载到内存的地址,但是这个变量的值来自环境变量(env_get这个函数是读取环境变量的值)。

2.4 因为目前rk3399没有把环境变量保存到emmc,那肯定就是使用了uboot中的默认环境变量值。

找到rk3399_common.h (因为grep -nr kernel_addr_r 打印的内容太多了,我因为截图方便,重新加了一层rk3399的过滤,文件的内容已经被我修改了。)

linux5.10的一个警告Kernel image misaligned at boot, please fix your bootloader!_第6张图片

2.5 打开rk3399_common.h,并修改

linux5.10的一个警告Kernel image misaligned at boot, please fix your bootloader!_第7张图片

2.6 重新编译并下载即可。

linux5.10的一个警告Kernel image misaligned at boot, please fix your bootloader!_第8张图片

三、警告问题已解决。

3.1 对初学者的一些建议吧:

3.1.1 这里确实有一些判断是经验,比如内核的地址,判断为uboot的内核加载的地址。

3.1.2 内核是uboot加载到内核的,这个还是要比较清楚,所以加载的地址是uboot决定的。

3.1.3 环境变量的情况,也要根据实际开发板的情况进行判断,rk3399呢,我接触了几块,基本都没有把环境变量设置到flash的情况,所以我可以里面判断它肯定是默认环境变量。

3.1.4 当然我自己也是半吊子,如果能给您帮助或启发,这是我的荣幸。这是我目前去解决一个问题的大体思路,或许可以稍微参考一下。有其他问题,欢迎私信我啦。
 

你可能感兴趣的:(linux,运维,服务器)