无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: 2011yaya2007777
打印 上一主题 下一主题

[原创] GRUB4DOS for UEFI

    [复制链接]
2491#
发表于 2022-10-8 12:04:47 | 只看该作者
本帖最后由 2011whp 于 2022-10-8 12:16 编辑

if "%tempbuf%"=="114" load /efi/grub/ntfs_x64.efi ;; echo 检测到您按了R,加载只读驱动……
改为:if "%tempbuf%"=="114" && echo 检测到您按了R,加载只读驱动……  && load /efi/grub/ntfs_x64.efi
解释:
  @retval的值  每执行一条命令,会被重置。(紧跟 在命令后使用)
   if "%tempbuf%"=="114" load /efi/grub/ntfs_x64.efi  是 一句,不是两句
   行内分块:  ;; 代表无条件 执行下一句     (续真&& 续假|| 续非! 续非假&;  续假|;  分句;;)




在用的一个选择菜单:供参考

!BAT
clear
echo -P:0315      $[0x9c]iso启动方案选择(%~1)
echo -P:0410 =====================================
echo -P:0610  1.  ISO    加载内存启动(svbus必用)
echo -P:0710  2.  ISO 不 加载内存启动()
echo -P:0810  3.  备用
echo -P:0910  4.  备用
echo -P:1010  5.  备用
echo -P:1210 =====================================
echo -P:1310 选 序号 启动:
pause --test-key --wait=40 > nul
echo %@retval% | set aa=
set /a aa=%aa%-48 > nul
echo -P:1325 $[0x9c]%aa%
pause && clear

set wfile=%~1
if "%aa%"=="1"  goto :start1
if "%aa%"=="2"  goto :start2
if "%aa%"=="3"  goto :start3
if "%aa%"=="4"  goto :start4
if "%aa%"=="5"  goto :start5
exit

:start1
clear
echo %wfile% 的  加载内存启动(svbus必用)
map --mem --top %wfile% (0xff)
chainloader (0xff)
boot
exit
回复

使用道具 举报

2492#
发表于 2022-10-10 20:32:38 | 只看该作者
本帖最后由 wintoflash 于 2022-10-10 20:50 编辑

关于 grub4efi 对 Linux 内核支持的改进,我想征求一下 yaya 和大家的意见。
UEFI 下启动 Linux 内核,有很多种方式。

1. 传统的 32 位启动协议 (32-bit Boot Protocol)
这种方式下 Linux 接管时,已经退出了 UEFI 启动服务,Linux 获取不到 UEFI 系统表指针,因此 Linux 启动后无法调用 UEFI 运行时服务。
这种方式的实现也比较复杂,主流 Linux 发行版都没有采用这种方法,因此不予考虑。

2. 64 位启动协议 (64-bit Boot Protocol)
缺点同上,而且不支持 32 位 Linux。

3. EFI 交接协议 (EFI Handover Protocol)
grub4efi 目前使用的就是这种方式。将内核加载到内存后直接跳转到对应位数(32/64)下的入口,同时传递镜像句柄,UEFI 系统表和 Linux 启动参数。
EFI Handover Protocol 目前已经被主线 Linux 废弃:
NOTE: The EFI Handover Protocol is deprecated in favour of the ordinary PE/COFF
entry point, combined with the LINUX_EFI_INITRD_MEDIA_GUID based initrd loading protocol (refer to [0] for an example of the bootloader side of this), which removes the need for any knowledge on the part of the EFI bootloader regarding the internal representation of boot_params or any requirements/limitations regarding the placement of the command line and ramdisk in memory, or the placement of the kernel image itself.

而且这种方式需要内核自己进行重定位。在有些电脑上启动 ntloader 出现问题,就是因为 ntloader 没有进行 self-relocation 导致的。

4. 直接当作 EFI 可执行程序进行启动
这种方式下,我们不用操心内核的加载/重定位,直接把它交给固件来做。我们只要在 initrd 加载到内存后通过某种方式告诉内核就行了。
Linux 官方给出的方法是 initrd loading protocol。bootloader 实现一个 EFI_LOAD_FILE2_PROTOCOL,Vendor GUID 设为 EFI_INITRD_MEDIA_GUID,内核就会自己找到这个 protocol,来读内存中的 initrd。目前 u-boot 使用的就是这种方法。grub2 官方也在考虑支持这种方式。
iPXE 使用的方式是实现一个 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL,把它对应的句柄传给内核,这样内核就能加载上面的 initrd。

目前 grub4efi 支持方法 3,但是方法 3 已经被 Linux 官方废弃,将来有可能会删掉。
因此我考虑改为用方法 4 启动 Linux 内核,弄一个 EFI_LOAD_FILE2_PROTOCOL 来加载 initrd。
这样会造成一定程度的不兼容,就是 64 位 EFI 下不能启动 32 位 Linux (反之亦然)。不过不支持方法 3 的发行版要比不支持方法 4 的发行版要多。
不知道 yaya 有没有什么看法?

-----------------------
u-boot 相关实现:https://github.com/u-boot/u-boot ... cc3a5d717d4739b0fd0
Linux 官方已经在讨论默认取消 EFI Handover Protocol 支持:https://lore.kernel.org/lkml/Y0GOKnD89SOjGzCf@nazgul.tnic/t/
回复

使用道具 举报

2493#
 楼主| 发表于 2022-10-11 07:12:57 | 只看该作者
@wintoflash
你这方面了解的多,你认为怎样好就怎样办。
我个人认为,只要能满足功能,实现起来越简单越好。看来启动 Linux 类型的 PE/COFF 只能是方法 4 了。

我不清楚,由 UEFI 固件启动 Linux 操作系统,按规范传递了 UEFI 系统表,就将控制权交给 Linux 操作系统了,它不进行 self-relocation ?要求 UEFI 固件实现一个 EFI_LOAD_FILE2_PROTOCOL ?
似乎是使用 kernel 和 initrd 加载 Linux 的 PE/COFF,才由 Linux 自己折腾吧。
回复

使用道具 举报

2494#
发表于 2022-10-11 10:12:18 | 只看该作者
2011yaya2007777 发表于 2022-10-11 07:12
@wintoflash
你这方面了解的多,你认为怎样好就怎样办。
我个人认为,只要能满足功能,实现起来越简单越 ...

假如内核和 initrd 不在 ESP 分区,那么内核是无法通过 UEFI 读取 initrd 的。
这样就需要某个约定俗成的方法,预先把 initrd 加载到内存,再告诉内核。

方法四,其实和 chainloader 启动 efi 程序一样,只是 StartImage 前面多了一步加载 initrd。这个是固件提供的功能,固件会做好重定位的。

但是目前用的方法三 (EFI Handover Protocol),是启动管理器把内核随便加载到哪个位置,直接暴力跳转进去,要 Linux 内核自己再进行重定位。

将来的 Linux 发行版有可能不再支持方法三,只能按方法四当成 efi 程序启动了。
回复

使用道具 举报

2495#
 楼主| 发表于 2022-10-11 11:10:26 | 只看该作者
明白了
回复

使用道具 举报

2496#
发表于 2022-10-14 16:44:52 | 只看该作者
看看这个教程,学习GRUB4DOS的使用方法啊
回复

使用道具 举报

2497#
发表于 2022-10-21 20:04:33 | 只看该作者
感谢分享,收藏备用。
回复

使用道具 举报

2498#
发表于 2022-10-21 20:04:47 | 只看该作者
感谢分享,收藏备用。
回复

使用道具 举报

2499#
发表于 2022-10-22 00:30:32 | 只看该作者
大神的作品,下载试试
回复

使用道具 举报

2500#
发表于 2022-10-30 23:51:31 来自手机 | 只看该作者
可惜了
回复

使用道具 举报

2501#
发表于 2022-10-31 11:37:53 | 只看该作者
谢谢楼主。
回复

使用道具 举报

2502#
发表于 2022-11-4 17:34:54 | 只看该作者
本帖最后由 alex20132013 于 2022-11-4 19:49 编辑

2022-10-27 grub4dos-for_UEFI-2022-10-27.7z,无法下载会出现404d:\q1.png
回复

使用道具 举报

2503#
 楼主| 发表于 2022-11-4 18:08:16 来自手机 | 只看该作者
https://github.com/chenall/grub4dos/releases/tag/for_UEFI?notification_referrer_id=NT_kwDOAHvnuLI0Njk1NzU4NTc0OjgxMjAyNDg
回复

使用道具 举报

2504#
发表于 2022-11-4 21:10:46 | 只看该作者
想請問下.
使用WIM檔PE啟動時
有什麼方法可以指定使用特定boot.sdi呢?
回复

使用道具 举报

2505#
发表于 2022-11-6 01:13:48 | 只看该作者
好长时间没来看,终于支持efi了,必须扶持一下。
回复

使用道具 举报

2506#
发表于 2022-11-6 13:43:06 | 只看该作者
本帖最后由 sxgpic 于 2022-11-6 13:45 编辑

有没有办法支持读取 squashfs 压缩镜像内的文件?

这样可以直接启动单个 squashfs 压缩的 Linux 系统,从 squashfs 内部读取 kernel 和 initrd,不用把内核从里面拿出来放别的地方,方便很多。
回复

使用道具 举报

2507#
 楼主| 发表于 2022-11-6 14:03:26 来自手机 | 只看该作者
目前没有办法
回复

使用道具 举报

2508#
发表于 2022-11-6 17:02:09 | 只看该作者
请问一下对gfxmenu 图形菜单不支持了吗?
回复

使用道具 举报

2509#
发表于 2022-11-6 17:06:46 | 只看该作者
建议还是应该与原GRUB4DOS的菜单目录相统一,这样方便适应uefi版的设置。
回复

使用道具 举报

2510#
 楼主| 发表于 2022-11-6 19:06:15 | 只看该作者
请问一下对gfxmenu 图形菜单不支持了吗?

是的,不支持了。但是可以自己设计图形菜单。

bios与uefi的菜单可能一样,也可能不一样,所以分开放置比较好。
回复

使用道具 举报

2511#
发表于 2022-11-6 20:38:46 | 只看该作者
明白了,谢谢!
回复

使用道具 举报

2512#
发表于 2022-11-7 08:18:28 | 只看该作者
还真有这好东西
回复

使用道具 举报

2513#
发表于 2022-11-7 09:22:04 | 只看该作者

建议参考 grub2 的 squashfs 读取代码,添加 G4E 的 squashfs 读取支持。这将是很实用的一个功能。
回复

使用道具 举报

2514#
发表于 2022-11-8 15:55:22 | 只看该作者
虚拟机Qemu 测试 grub4dos-0.4.6a_for_UEFI-2020-12-10.7z 中的 menu.lst  中的 configfile /efi/grub/menu2.lst 无法加载二级菜单。显示:Error 28:          Selected item cannot fit into memory
回复

使用道具 举报

2515#
发表于 2022-11-8 17:22:49 | 只看该作者
哎!!原来版本下错了,不好意思。
回复

使用道具 举报

2516#
发表于 2022-11-8 17:32:45 | 只看该作者
报告一下chenall的网站grub4dos-for_UEFI-2022-10-27.7z不能下载会转到旧本版grub4dos-0.4.6a_for_UEFI-2020-12-10.7z 处很易下载错误的版本。

点评

我也下错了一次  详情 回复 发表于 2022-11-9 10:28
回复

使用道具 举报

2517#
 楼主| 发表于 2022-11-8 17:50:27 来自手机 | 只看该作者
我们是显示404找不到。你怎么会跳转?估计是封网的问题。
回复

使用道具 举报

2518#
发表于 2022-11-9 10:25:47 | 只看该作者
2011yaya2007777 发表于 2022-11-8 17:50
我们是显示404找不到。你怎么会跳转?估计是封网的问题。

感谢丫丫大神,又回到了熟悉的环境,比grub2好布置,还可以给启动项加锁。
回复

使用道具 举报

2519#
发表于 2022-11-9 10:28:06 | 只看该作者
xsaxycn 发表于 2022-11-8 17:32
报告一下chenall的网站grub4dos-for_UEFI-2022-10-27.7z不能下载会转到旧本版grub4dos-0.4.6a_for_UEFI-202 ...

我也下错了一次
回复

使用道具 举报

2520#
发表于 2022-11-12 19:21:11 | 只看该作者
http://grub4dos.chenall.net/categories/for-UEFI/#year_2022
2022-10-27下载地址好像有问题,通过下面的地址可以直接下载:
http://dl.grub4dos.chenall.net/grub4dos-for_UEFI-2022-10-27.7z

友请yaya看下这个帖子:22楼:
http://wuyou.net/forum.php?mod=r ... &fromuid=298214

grub4dos-for_UEFI-2021-10-21可以启动ubuntu-18.04.6-desktop-amd64.iso,√
grub4dos-for_UEFI-2021-11-05启动失败×,看了下changelog,
更新信息(update log): 2021-11-05 43d22e2@yaya . 修复管道符‘|’后面紧接call(或者goto)标签时,必须补空格。issues #341 . 迁就有bug的ISO光盘镜像。
“迁就有bug的ISO光盘镜像。”好像 grub4dos-for_UEFI-2021-11-05有问题,引入了bug。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-4-26 00:59

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表