无忧启动论坛

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

[原创] GRUB4DOS for UEFI

    [复制链接]
181#
发表于 2021-6-16 22:23:02 | 显示全部楼层
获取 uefi 环境变量的外部命令 getenv
getenv.zip (6.73 KB, 下载次数: 7)
可能还有点bug,不过懒得改了。图一乐。


图1:utf-16 字符串
图2:utf-8 字符串
回复

使用道具 举报

182#
发表于 2021-6-17 12:35:29 | 显示全部楼层
liuzhaoyzz 发表于 2021-6-17 11:42
号外号外

grub4dos-for_UEFI里面,menu.lst的demo版本里面很多是中文啊,两位大神不考虑下国际友人吗?
...

全球有二百多个国家和地区,目前有超过六千种语言。
近八十亿人口中,使用英语作为母语或第二语言的仅有不到十五亿人。
剩下的六十多亿人,包括我和yaya在内的大多数中国人都需要用翻译软件才能看懂英语。
我没有看出用英语的必要性。
回复

使用道具 举报

183#
发表于 2021-6-17 19:52:17 | 显示全部楼层
2011yaya2007777 发表于 2021-6-17 15:23
赞成wintoflash的说法。
现在翻译软件使用也方便,国际友人自行翻译好了。
如果我事先把中文使用百度翻译 ...


@2011yaya2007777 你确定 grub_efi_system_table 和 grub_efi_image_handle 应该用 SYSVAR 而不是 SYSVAR_2 吗?
你改完之后 ver, cmdline, date, time 等要用 efi 系统表的外部命令就坏了。
另外
#if defined(__i386__)
  #define extent long
#else
  #define extent quad
#endif

        .extent        ABS(EXT_C(grub_efi_image_handle))   //14  void *
//VARIABLE(map_start_sector)
        .extent        ABS(EXT_C(grub_efi_system_table))   //15  struct grub_efi_system_table

#define        SYSVAR(x)        (*(unsigned long long *)((*(unsigned long long *)IMG(0x8308)) + (x<<3)))
所以 在外部命令里面应该用 unsigned long 吧。
编译器也会报警:warning: initialization makes pointer from integer without a cast
回复

使用道具 举报

184#
发表于 2021-6-19 19:27:51 | 显示全部楼层
本帖最后由 wintoflash 于 2021-6-19 19:34 编辑
2011yaya2007777 发表于 2021-6-19 11:39
已经修正,提交官网。

另外,在外部命令里,增加

ADDR_RET_STR 有点问题啊。
  1. char uefi_ver[11];
  2.   efi_system_table_t *st = grub_efi_system_table;
  3.   grub_uint16_t uefi_major_rev = st->hdr.revision >> 16;
  4.   grub_uint16_t uefi_minor_rev = st->hdr.revision & 0xffff;
  5.   grub_uint8_t uefi_minor_1 = uefi_minor_rev / 10;
  6.   grub_uint8_t uefi_minor_2 = uefi_minor_rev % 10;
  7.   sprintf (uefi_ver, "%u.%u", uefi_major_rev, uefi_minor_1);
  8.   if (uefi_minor_2)
  9.     sprintf (uefi_ver, "%s.%u", uefi_ver, uefi_minor_2);
  10.   printf ("%s\n", uefi_ver);
  11.   ADDR_RET_STR = uefi_ver;
  12.   return 1;
复制代码

报错:
ver.c:42:16: error: lvalue required as left operand of assignment
   ADDR_RET_STR = uefi_ver;
                ^

-------------------
这个东西是怎么用的?没效果啊?
  1. static int main(char *arg,int key)
  2. {
  3.   get_G4E_image();
  4.   if (! g4e_data)
  5.     return 0;
  6.   unsigned long var = 0x12345678;
  7.   return sprintf (ADDR_RET_STR, "0x%lx", var);
  8. }
复制代码

回复

使用道具 举报

185#
发表于 2021-6-27 12:28:48 | 显示全部楼层
xianglang 发表于 2021-6-27 12:14
原来是这样,能不能改回象G4D那样,map 了 ISO 或者 IMG 之类,也可以指定启动设备,而不是象现在这样全 ...

uefi下还有可能用f6?
回复

使用道具 举报

186#
发表于 2021-7-22 15:17:02 | 显示全部楼层
saiz 发表于 2021-7-22 13:34
是的.用GURB2是可以用LOOPBACK去啟動
不過ISO檔內沒有你說的LOOPBACK.CFG

具体是用什么命令启动的,贴出来。
回复

使用道具 举报

187#
发表于 2021-7-22 21:10:38 | 显示全部楼层
saiz 发表于 2021-7-22 20:26
各位大大.我突然遇到一個新問題...
原本WIM類型已OK可啟動.
我在研究LINUX類型OK後

vmware和一些机器的bios有点问题,必须切到文本模式才能正常显示输出。
grub4dos不要加载图形模式。
grub2 可以用 terminal_output console。
回复

使用道具 举报

188#
发表于 2021-7-22 22:54:14 | 显示全部楼层
saiz 发表于 2021-7-22 22:29
wintoflash大大
我依你說的把grub4efi menu.lst內有關圖形介面的先//掉了
開機也是變文字介面了.連中文 ...



看仔细。
另外 initrd=xxx 参数是传递给 ntloader 进行解析的,所以不能用 grub 格式的路径。
回复

使用道具 举报

189#
发表于 2021-8-9 13:18:51 | 显示全部楼层
@2011yaya2007777 可以把这个函数弄出来供外部命令使用吗?
  1. struct grub_disk_data *get_device_by_drive (unsigned int drive)
复制代码
回复

使用道具 举报

190#
发表于 2021-8-17 17:54:44 | 显示全部楼层
@chenall 建议启用github上grub4dos的讨论功能,这样一些不适合在issues里面提的问题可以放在在讨论里面,相当于一个论坛。
settings->features

回复

使用道具 举报

191#
发表于 2021-9-1 20:31:59 | 显示全部楼层
plusv 发表于 2021-9-1 18:41
不知何故,
每個版本 文件都會有很大的差異 ?


回复

使用道具 举报

192#
发表于 2021-9-6 11:32:22 | 显示全部楼层
2011yaya2007777 发表于 2021-9-6 10:42
依据 chenall 的 NTBOOT 启动机理,采用了 wintoflash 在  ntloader 中 修改 BCD 的代码,作为练手,
在 G ...

支持
回复

使用道具 举报

193#
发表于 2021-9-6 17:55:48 | 显示全部楼层
我这半年估计都没法用电脑,可能帮不上什么忙。
我后来的设想是,弄成外部命令形式,bootmgfw.efi/bootmgr路径要从命令行接收,同时支持ntboot和wimboot类型的启动。
由于chenall的ntboot也年久失修了,有很多问题,所以我也考虑同时支持bios/uefi。
回复

使用道具 举报

194#
发表于 2021-9-16 18:52:24 | 显示全部楼层
sunsea 发表于 2021-9-16 11:48
这事是微软给不给我们发证书的事情,不是我们想不想支持的事情。应该是不可能的。

当然是可能的。只要愿意接受阉割,就可以申请签名。
阉割指的是 不能启动未认证操作系统、不能执行未认证代码(外部命令/模块)、不能让用户改写内存、不能让用户向磁盘写入数据等。
回复

使用道具 举报

195#
发表于 2021-9-19 19:21:53 | 显示全部楼层
本帖最后由 wintoflash 于 2021-9-19 19:29 编辑
邪恶海盗 发表于 2021-9-19 19:06
bootmfgw.efi
这个已经有解决办法了,我问的是Grub4dos for UEFI对于这个的处理

Win7 启动的时候会调用 int10h / VBE,因此需要在uefi上模拟 BIOS int10h 和 VBE。
目前 UEFISeven 和 VgaShim 的模拟都不是很完美,并不能保证在大多数机器上正常工作。
另一种解决方法就是修改bootmgfw.efi/winload.efi,不让他调用, Flashboot 用的就是这种方法。

总之,这不是 G4E 本身导致的问题,这个问题也只会在一个停止维护的系统上出现,而且也有一些不完美的解决方案。因此,G4E 不会去尝试 ”修复“ 这个问题。
回复

使用道具 举报

196#
发表于 2021-10-1 13:35:42 | 显示全部楼层
keygen 发表于 2021-10-1 12:51
外部命令slic好像有点小问题
grub4dos-for_UEFI-2021-09-08.7z
BOOTX64.EFI + slic

0908的slic与0424的相比,核心代码没有变动。
请用中间的几个版本进行测试,看看是不是g4e本身的问题。
回复

使用道具 举报

197#
发表于 2021-10-26 16:34:16 | 显示全部楼层
本帖最后由 wintoflash 于 2021-10-26 16:38 编辑
hhh333 发表于 2021-10-26 16:08
加也加入了,bootx64.efi体积增加了,但用不了。还是要外置才能用。

这个是打包命令hotkey已经拷贝到 ...

-m xxx.mod。要用打包工具把外部命令打包成 *.mod
https://github.com/chenall/grubutils/releases/tag/latest
里面应该有makemod.exe
回复

使用道具 举报

198#
发表于 2021-11-9 12:48:36 | 显示全部楼层
hhh333 发表于 2021-11-9 12:19
干脆直接整合到主程序中算了,省得我发命令,还要找外置,一堆在大的麻烦。默认就直接支持不香吗?菜单不 ...

这跟是否整合没有关系。
不放在主程序里面,主要是考虑保证与bios下功能的一致性。
bios下这个功能是外置的,efi下就应当外置。
回复

使用道具 举报

199#
发表于 2021-11-10 10:12:46 | 显示全部楼层
liuzhaoyzz 发表于 2021-11-10 07:34
我觉得把必要的模块外置不是个太好的设计。

对于BIOS下面的g4d或者grub2来说,因为受制于MBR扇区数,放 ...
外置模块必须与grub2主引导相匹配,不匹配的话就会出错,而且insmod、delmod之类的命令增加了模块加载的复杂性

(对开发者来说) 更简单了。Windows都不能完全解决这个问题,何况其他项目。
我个人觉得UEFI下面的g4e还是把必要的模块内置到主引导文件g4ebootx64.efi里面更好吧。

必须尽量保证bios/uefi的一致性。否则,就等于是两个软件。会增加用户的使用难度和开发者的开发难度。

以上只是我个人的看法和意见。

点评

确实windows就是有问题,比如bootmgr对于WIN7 8来讲,只需要这一个文件就可以启动vhd,后来WIN10把vhd启动功能从中分离了,叫做bootvhd.dll,导致的结果是bootmgr与bootvhd.dll版本不匹配,vhd就会启动失败。而bootv  详情 回复 发表于 2021-11-10 10:23
回复

使用道具 举报

200#
发表于 2021-11-19 20:29:16 | 显示全部楼层
keygen 发表于 2021-11-19 20:22
无法map--mem 启动 grubfm.iso

这个不支持UEFI启动。
要用grubfm_multiarch.iso

点评

收到,明白!  详情 回复 发表于 2021-11-19 20:35
回复

使用道具 举报

201#
发表于 2021-12-20 18:13:01 | 显示全部楼层
loongson 发表于 2021-12-20 15:29
linux 的链接不支持?vmlinuz链接到具体版本,提示bad file?

你说的是ext4的符号链接吗?
我看grub4dos源码里面是有对符号链接的支持的。
回复

使用道具 举报

202#
发表于 2022-1-29 21:43:23 | 显示全部楼层
2011whp 发表于 2022-1-29 19:38
偶尔 发现这个 ,iso内软盘 是 2KB块 ?,启动是正常的,不知有没有 其它方面的 影响
看了下,win11的 ,e ...

块大小是2048是正确的。对于光盘,就应该是2048。光盘里面的软盘也自然就是2048。
回复

使用道具 举报

203#
发表于 2022-3-23 20:35:42 | 显示全部楼层
2011wyy 发表于 2022-3-23 20:30
厉害,我也来试试

其实用 启动ISO里的BOOT.SDI,可以直接启动WIM

如何启动?
回复

使用道具 举报

204#
发表于 2022-3-23 22:06:43 | 显示全部楼层
2011wyy 发表于 2022-3-23 21:21
请看我的古老帖子:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=372214

没看明白和你说的有什么联系。
回复

使用道具 举报

205#
发表于 2022-3-25 16:45:09 | 显示全部楼层
510819776 发表于 2022-3-25 11:50
那就是我的主板冷复位功能有问题了,不管是grub2efi  还是efishell 或是bios界面 我按键盘三个按键重启也 ...

弄一个小一点的可以重现问题的ext2分区,压缩下传给yaya看看
回复

使用道具 举报

206#
发表于 2022-4-18 19:43:17 | 显示全部楼层
2012msg 发表于 2022-4-13 12:07
我什么都不懂,所以曾经乱猜这个软件版本会不会是根据“GRUB Legacy”(grub efi?)改编的。从这里找到的htt ...

GRUB4DOS BIOS 版本是基于 Grub Legacy的。
UEFI 版本并没有参考 Grub Legacy。
回复

使用道具 举报

207#
发表于 2022-10-2 16:45:16 | 显示全部楼层
shabi114514 发表于 2022-10-2 15:59
g4e用wimboot提示kenrel too old

不支持。
wimboot只能用ipxe加载。
回复

使用道具 举报

208#
发表于 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/
回复

使用道具 举报

209#
发表于 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 程序启动了。
回复

使用道具 举报

210#
发表于 2023-1-4 17:52:05 | 显示全部楼层
286958 发表于 2023-1-4 16:15
支持外部命令 loadslic吗?

uefi下有slic外部命令。但是能不能用并没有测试。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-1 15:03

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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