飞腾D2000麒麟linux系统reboot后无法启动的问题
----------原创不易,欢迎关注+点赞收藏。广交嵌入式开发的朋友,讨论技术和产品-------------
硬件平台 :飞腾D2000 + SSD硬盘
软件平台 :UFEI + 麒麟linux V10
为了测试该平台的重启功能是否正常,在麒麟linux启动完成后,用鼠标点击重启或者在命令行输入reboot命令。结果单板大概率停在了UFEI的shell命令行。麒麟系统重启失败。然而单板直接上电启动,是可以正常的进入麒麟系统的。
定位过程比较麻烦,对UFEI启动菜单和加载内核镜像的流程加了很多打印。其中加载镜像并跳转的函数如下

VOID
EFIAPI
EfiBootManagerBoot (
IN EFI_BOOT_MANAGER_LOAD_OPTION *BootOption
)
{
EFI_STATUS Status;
EFI_HANDLE ImageHandle;
EFI_LOADED_IMAGE_PROTOCOL *ImageInfo;
UINT16 Uint16;
UINTN OptionNumber;
UINTN OriginalOptionNumber;
EFI_DEVICE_PATH_PROTOCOL *FilePath;
EFI_DEVICE_PATH_PROTOCOL *RamDiskDevicePath;
VOID *FileBuffer;
UINTN FileSize;
EFI_BOOT_LOGO_PROTOCOL *BootLogo;
EFI_EVENT LegacyBootEvent;
if (BootOption == NULL) {
return;
}
.......
ImageHandle = NULL;
RamDiskDevicePath = NULL;
if (DevicePathType (BootOption->FilePath) != BBS_DEVICE_PATH)
{
Status = EFI_NOT_FOUND;
FilePath = NULL;
EfiBootManagerConnectDevicePath (BootOption->FilePath, NULL);
FileBuffer = BmGetNextLoadOptionBuffer (LoadOptionTypeBoot, BootOption->FilePath, &FilePath, &FileSize);
if (FileBuffer != NULL)
{
RamDiskDevicePath = BmGetRamDiskDevicePath (FilePath);
REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdProgressCodeOsLoaderLoad));
Status = gBS->LoadImage (
TRUE,
gImageHandle,
FilePath,
FileBuffer,
FileSize,
&ImageHandle
);
}
if (FileBuffer != NULL) {
FreePool (FileBuffer);
}
if (FilePath != NULL) {
FreePool (FilePath);
}
结果发现reboot后,UFEI执行到KYLIN系统所在路径传入函数DevicePathType 后,得到空路径。而上电启动流程该函数返回的是合法路径。
难不成是硬盘没有找到?在REBOOT后,UFEI SHELL下执行map命令查看可以引导启动的设备,竟然没有发现M.2硬盘。
执行pci命令,没有扫描到M.2的PCI设备和厂商ID信息。原因找到了,就是D2000没有发现硬盘,UFEI无法从硬盘加载麒麟系统,从而进入SHELL。
为什么扫描不到硬盘?以前在FT2000平台上也遇到过类似问题,原因是硬件问题:硬盘插到我们板上后,信号和地短路了,硬盘和我们板上连接器的结构控制的不行,解决办法是更换连接器,同时弃用该品牌的硬盘。
本文所描述的问题,硬件工程师还没有定位,我估计可能也是类似问题。软件流程是正常的。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)