BOOTLOONGARCH.EFI启动报"cannot allocate memory"错误 [已解决]
ad_h
按照孙老师github上的CLFS教程交叉编译并制作出liveusb,在3A5000机器时引导时报“cannot allocate memory”,进入UEFI Shell手动运行"BOOTLOONGARCH.EFI"也报同样错误,无法进一步启动grub(附件“cannot*allocate*memory.jpg”)。
辅助信息:
======
1. BOOTLOONGARCH.EFI改为BOOTLOONGARCH64.EFI的方法已经试过了,问题依旧;
2. 安装Loongnix 2.1可以正常引导,看了下它的EFI文件名也是BOOTLOONGARCH.EFI;
3.使用loongarch64/gnu-efi (github.com)编出示例程序AllocatePages.c(在3A5000的Loongnix 2.1环境中编译),在UEFI Shell中运行AllocatePage.efi示例也报错(按源码中的示例执行:“AllocatgePage.efi 2 3 5 200000”,返回的错误code是14),运行memmap,给出的内存地址都是“90000000*****”的地址,具体请看附件“memmap.jpg”;
4. 今天看到论坛中新世界/旧世界的内容,我想是否我板子的固件是旧世界的,而做出的CLFS是属于新世界的?我把固件(包括板子信息)和UEFI Shell版本信息都提供出来,具体请看附件"固件和主板信息.jpg"和"UEFI*Shell*版本.png"(机器是自己从淘宝买的3A5000整机)
5.grub2编译时与教程中的步骤有出入,不确定是否有关系。按教程步骤需要打两个补丁“grub-2.06-loongarch-li_to_liw.patch”、“grub-2.06-fix-initrd.patch”,但似乎它们都不适于与目前github中clone出的代码了:
5.1. 其中“grub-2.06-loongarch-li_to_liw.patch”找不到“grub-core/lib/loongarch64/efi/loongarch64_asm.S,” 而"grub-core/lib/loongarch64/relocator.c"中已经有了"li.w"的内容,不需要再打patch;
5.2. “grub-2.06-fix-initrd.patch”中涉及的“grub-2.06.orig/grub-core/loader/loongarch64/linux.c”的相关内容已经没有了,patch打不上去。github上查看该文件的history,发现patch要修改的内容在2021/12/29最后一次commit中(sha:198e55e)已经删除;
c. 因此判断这两个补丁可能已不适用目前代码,所以跳过这两步继续执行后续操作,直到制作出BOOTLOONGARCH.EFI都没有再出现错误
6. 如果需要其它信息请告知
其它:
===
目前对UFEI调试不熟,手头也没有串口线、也还没能调试环境来查看EFI程序运行过程中更详细的信息,下一步准备学习这些内容来debug看看内部到底发生了什么
杜比
clfs 5.0 以上版本,需要刷新版固件,相关主题可以在社区里查找
ad_h
杜比 好的谢谢,我查了一下,新固件是指这个吗:loongson/Firmware: Firmware Of LoongArch Machines (github.com)
杜比
ad_h 可以通过如下的主题,了解自己的主板,然后在loongson/Fireware里找是否有对应的固件。
https://bbs.loongarch.org/d/76-smbios/14
刷机推荐使用固件里面的shell,有个spi命令,具体用法可以看它的帮助
有了充足的准备再刷固件,毕竟刷机有风险,动手需谨慎
ad_h
杜比 多谢!我先消化您给的这些内容,网购的烧录器在路上,到了就试。
我昨天先用https://github.com/yangxiaojuan-loongson/qemu-binary这个环境验证了一下,制作出的CLFS的BOOTLOOGNARCH.EFI可以正常启动,并进入grub rescue
杜比
之前有过关于BOOTLOOGNARCH.EFI的讨论,参见
https://bbs.loongarch.org/d/60-loongarch/17
在真机环境下,文件名后加64能正常引导,是验证的结果,供参考
ad_h
杜比 谢谢。改文件名方式已经试过不起作用,现在已经确认是使用旧世界固件的问题,刷成新固件就好了。
ad_h
A1201主板刷github上的pre-beta8固件可以正常进入到grub,不再出现之前提的问题,因此可以确认之前是用了旧固件引起的。
但目前在“Loading Linux Kernel”后出现“invalid arch-independent ELF magic”。可能gub和kernel用的不太合适,这个不属于这边帖子的范畴了,我自己再搞搞。
至少烧录流程和新固件都走通了,参考了不少各位大佬的帖子,对我这个新手来说收获还是不少的,感谢!