无忧启动论坛

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

[原创] GRUB4DOS for UEFI

    [复制链接]
361#
 楼主| 发表于 2021-5-22 11:53:28 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2021-5-22 11:55 编辑
搞了半天,根本不是不能装载的问题

command_path 默认是 (bd)/efi/grub/
定义了 command --set-path=()/EFI/grub/ext,则 command_path 是 ()/EFI/grub/ext/

在命令行可以正确执行 *.com 外部命令
hotkey.mod   不带路径
/EFI/grub/ext/hotkey.mod   带路径

在命令行可以正确执行没有尾缀 .com 的外部命令
/EFI/grub/ext/hotkey   带路径
不可以这样
hotkey


g4d的热键可以了

grub4dos-0.4.6a_hotkey.rar

170.84 KB, 下载次数: 35, 下载积分: 无忧币 -2

点评

老大,现在这个表现形式的效果是达到了,但是,我前面已经说了,装载hotkey或hotkey.mod也没什么问题,现在主要的问题是: 只要运行了hotkey,在title之前必须要执行一下root ()/EFI/grub或者root ()/EFI/grub/ext  详情 回复 发表于 2021-5-22 12:27
回复

使用道具 举报

362#
 楼主| 发表于 2021-5-22 13:00:05 来自手机 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2021-5-22 13:01 编辑

没有必要。你把子菜单里的hotkey,修改为/efi/grub/ext/hotkry就可以了。我这里测试过了。

点评

G4D没有g4e像我描述的问题,完全成功  详情 回复 发表于 2021-5-22 13:20
为了避免不必要的错误,我现在是用一个菜单menu.lst来测试的  详情 回复 发表于 2021-5-22 13:03
回复

使用道具 举报

363#
 楼主| 发表于 2021-5-22 19:08:02 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2021-5-22 19:09 编辑

测试外部命令死机的原因找到了。
为了同时测试g4e和g4d,在根目录下放置了grldr和g4d的hotkey,在/efi/grub/放置了g4e的hotkey.
启动uefi,进入命令行,执行hotkey,死机。

查找外部命令的顺序如下:
如果是以 '(' 或 '/' 开头的FILE认为是一个绝对路径的文件.直接打开。
否则
1.先查找用INSMOD加载的命令。
2.使用当前root下的同名文件。
3.使用默认位置里面的同名文件。

没有使用INSMOD加载hotkey,所以在当前root下查到hotkey,执行它。
这个hotkey是g4d的,必然死机!
删除根目录的hotkey,再试一试,一切OK!

点评

如果把title全部去掉,不会死机,直接进命令行,再运行hotkey,只出现用法说明,没有安装的信息,说明hotkey已经安装了,这也说明安装hotkey后,title语句引起了死机,两者冲突了  详情 回复 发表于 2021-5-23 06:45
还是没找到,我们不是这么玩的。G4D的放在BOOT/GRUB/EXT下,G4E放在/EFI/gurb/ext下。  详情 回复 发表于 2021-5-22 22:49
回复

使用道具 举报

364#
 楼主| 发表于 2021-5-25 12:14:00 来自手机 | 显示全部楼层
是的

点评

我上面提到的hotkey与GZ压缩BMP格式背景图片相冲突的问题解决没有  详情 回复 发表于 2021-5-25 19:35
回复

使用道具 举报

365#
 楼主| 发表于 2021-5-25 20:18:13 来自手机 | 显示全部楼层
不知道为什么这个gz压缩的bmp与热键冲突。换其他的没有这个现象。

点评

用原文件不压缩的BMP可以通过  详情 回复 发表于 2021-5-25 20:57
是不是解压以后文件有点大,BMP本来就大些  详情 回复 发表于 2021-5-25 20:50
回复

使用道具 举报

366#
 楼主| 发表于 2021-5-25 21:37:16 来自手机 | 显示全部楼层
可能是。也许是压缩软件的问题。或许是版本问题?使用jpg格式挺好,体积小,不用压缩。

点评

那请重新发布一下支持新版hotkey的g4e和g4d吧  详情 回复 发表于 2021-5-25 21:49
最先的G4D不支持JPG,后来支持了也没改,沿用至今,现在改JPG占空间更小  详情 回复 发表于 2021-5-25 21:47
回复

使用道具 举报

367#
 楼主| 发表于 2021-5-25 21:57:06 来自手机 | 显示全部楼层
还有点小改动,就快完了。

点评

这个hotkey是不是也有32位64位之分,现在32位中黑屏来不起,如果是mod性质应该有32位和64位的区别  详情 回复 发表于 2021-5-29 06:07
回复

使用道具 举报

368#
 楼主| 发表于 2021-5-29 07:21:55 来自手机 | 显示全部楼层
所有的外部命令目前都是64位的。

点评

能不能像DOS一样用command --set-path=a;b;c形式给外部命令或批处理设搜索路径?  详情 回复 发表于 2021-5-29 10:43
能编译32位的吗?  详情 回复 发表于 2021-5-29 07:32
回复

使用道具 举报

369#
 楼主| 发表于 2021-5-29 08:30:52 | 显示全部楼层
grub4dos的.mod文件是怎么制作的,有没有开源的工具可以制作.mod文件?

FILE.MOD 是使用 makemod 程序生成的外部命令合集,免去多次使用insmod加载外部命令的麻烦。也可以使用Fbinsttool工具来制作 FILE.MOD 文件。
使用 insmod FILE.MOD 加载。

makemod这个工具没有找到。
不知道 FILE.MOD 的内部结构。chenall 应当清楚。
回复

使用道具 举报

370#
 楼主| 发表于 2021-5-29 08:44:39 | 显示全部楼层
这两天把grub2的grub-mkimage程序单独给弄了出来

以前你在64位操作系统编译,需要grub-mkimage64(chenall 却不需要),而在32位系统编译,需要 grub-mkimage。现在单独弄了出来,可否合二为一?

grub-mkimage64 编译使用 grub_pe64_optional_header,而 grub-mkimage 编译使用 grub_pe32_optional_header 。
bootx64.efi 无论使用 grub_pe64_optional_header 还是 grub_pe32_optional_header ,都可以正常运行,使用 grub_pe32_optional_header 体积小一些,建议统一为 grub_pe32_optional_header 。

点评

这是另一码事。github actions 的 linux 环境是没有 32 位库的,只能执行纯 64 位 linux 程序,所以我放了个 64 位的。 你确定吗?我看 grub-mkimage 的源码,好像是根据目标镜像是 i386-efi 还是 x86_64-efi  详情 回复 发表于 2021-5-29 10:32
回复

使用道具 举报

371#
 楼主| 发表于 2021-5-29 08:57:23 | 显示全部楼层
而且还可以向 EFI 中附加任意文件。不过我还没想好这部分在 grub4dos 里面如何对接,是应该附加 .mod 还是附加外部命令/字库之类的东西。

我觉得把外部命令打包成 FILE.MOD 比较好。
现在是程序启动时判断有无预置菜单,有就加载。
将来程序可以判断有无预置 MOD,有就使用 insmod 加载。

建议再增加一个参数来区别预置菜单及 MOD,不知有无必要。
如:mkimage.exe -p /efi/grub -o BOOTX64.EFI -O x86_64-efi -c menu.lst -m fat fwsetup ver cpuid
grub-mkimag 把 fat fwsetup ver cpuid 打包为 FILE.MOD 。

字库现在就可以附加在预置菜单末尾,如:
0000:0000000000000000000000000000000000000000000000000000000000000000#,DotSize=16
91CD:00000000000001E03E0002007FF022203FE022203FE002003FE002007FF00000
73B0:00000000000000007BE0122012A012A07AA012A012A011401940625004300000
7528:00000000000000003FE0222022203FE0222022203FE022202220222040E00000
5047:00000000000010001EF02A102A106EF028002EF028902E90286028A029100000
88C5:000000000000488028800FF0188028804BE002007FF0050018A06A400C300000
8FD9:0000000000002100108007F00020722011401080114012201410280047F00000
4E2A:0000000000000200020005000880124062300200020002000200020002000000
83DC:00000000000008807FF0088000E07F002440128002007FF00A80124062300000
5355:000000000000104008803FE022203FE022203FE002007FF00200020002000000
53EF:00000000000000007FF0002000203F202120212021203F202020002000E00000
542F:000000000000020001001FF0101010101FF010001FF0181028102FF048100000
52A8:00000000000000803880008001F07C9010902090289044907D10011002600000

点评

insmod 加载mod或外部命令,能自己判断出外部命令的体积大小吗? 比如 insmod (md)0x1234+2,这样会导致加载的mod文件大小有问题。  详情 回复 发表于 2021-5-29 14:00
回复

使用道具 举报

372#
 楼主| 发表于 2021-5-29 10:07:04 | 显示全部楼层
wintoflash 请教一下,官网编译的外部命令不带 .MOD,而本地编译的外部命令带 .MOD。
都是一样的编译指令,不知为什么。按 grub4dos 的本意,.MOD 是外部命令的集合。所以单个外部命令不应当带.MOD。有没有办法编译时不带.MOD,或者编译完毕去掉这个尾缀。

点评

我这边编译出来的不带.mod啊???  详情 回复 发表于 2021-5-29 11:08
回复

使用道具 举报

373#
 楼主| 发表于 2021-5-29 11:07:14 | 显示全部楼层
你确定吗?我看 grub-mkimage 的源码,好像是根据目标镜像是 i386-efi 还是 x86_64-efi 来判断使用的 pe 头的。

源码是这样的,所以他区分 32/64 。而事实上所以 grub_pe32_optional_header  编译的 64 位可以正常运行。

点评

试了一下,确实可以正常运行。不过两者的体积是一样大的。 加 '-E' 参数强制使用 pe32 头。 [attachimg]480818[/attachimg]  详情 回复 发表于 2021-5-29 12:01
回复

使用道具 举报

374#
 楼主| 发表于 2021-5-29 11:13:30 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2021-5-29 11:15 编辑

g4eext->Makefile

%.o: %.c
$(CC) $(CFLAGS) -Iinclude/ $< -o $@
%.mod: %.o
$(OBJCOPY) -O binary $< $@
$(MV) $@ bin/$$(basename -s .mod $@)
.PHONY: prepare
prepare:
$(MKDIR) -p bin
.PHONY: clean
clean:
$(RM) -f *.o *.mod bin/*
回复

使用道具 举报

375#
 楼主| 发表于 2021-5-29 12:53:56 来自手机 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2021-5-29 12:58 编辑

应当节省0xc00字节

点评

pe_size = ALIGN_UP (header_size + core_size, GRUB_PE32_FILE_ALIGNMENT) + ... GRUB_PE32_FILE_ALIGNMENT 应该是 4096,所以可能不会改变文件大小。  详情 回复 发表于 2021-5-29 14:35
回复

使用道具 举报

376#
 楼主| 发表于 2021-5-29 14:24:38 来自手机 | 显示全部楼层
能。首先打开文件,获得filemax。
回复

使用道具 举报

377#
 楼主| 发表于 2021-5-29 15:36:52 | 显示全部楼层
32位头0x400,64位头0x1000,大0xc00。
我编译的 5.28 版本的 BOOTX64.EFI,比官网的小 0x2000,即 8k。

点评

不具有可比性。你应该在你的电脑上用官网的kernel.img生成bootx64.efi,再和官网的bootx64.efi对比。  详情 回复 发表于 2021-5-29 15:45
回复

使用道具 举报

378#
 楼主| 发表于 2021-5-29 22:10:53 来自手机 | 显示全部楼层
这个ext.mod是使用上面提出来的2个工具之一生成的吗?
回复

使用道具 举报

379#
 楼主| 发表于 2021-5-30 08:32:48 | 显示全部楼层
加 '-E' 参数强制使用 pe32 头。

这个参数不起作用。编译后仍然是 pe64 头。

点评

[attachimg]480925[/attachimg] [attachimg]480926[/attachimg]  详情 回复 发表于 2021-5-30 09:44
回复

使用道具 举报

380#
 楼主| 发表于 2021-5-30 10:49:12 | 显示全部楼层
我觉得pe头不只是Magic不同,头部尺寸也不同。pe32是0x400字节,pe64是0x1000字节。

预置模块加载成功了!
修改:
     GRUB_MOD_ADDR = grub_malloc (0x100000);   //模块缓存
     mod_end = GRUB_MOD_ADDR;
   }
-   if (substring(skip_to(0,arg) - 4,".mod",1) == 0)
+//   if (substring(skip_to(0,arg) - 4,".mod",1) == 0)
    {
       if (!command_open(arg,1))
          return 0;
@@ -3597,6 +3717,11 @@ static int insmod_func(char *arg,int flags)
       //skip grub4dos moduld head.
       if (strcmp(p_mod->name.sn,"\x05\x18\x05\x03\xBA\xA7\xBA\xBC") == 0)
         ++p_mod;
+      else
+      {
+        grub_free(buff);
+        goto external_command;
+      }
       while ((char *)p_mod < buff_end && grub_mod_add(p_mod))
       {
          p_mod = (struct exec_array *)(p_mod->data + p_mod->len);
@@ -3604,6 +3729,8 @@ static int insmod_func(char *arg,int flags)
       grub_free(buff);
       return 1;
    }
+
+external_command:
    switch(command_open(arg,0))
回复

使用道具 举报

381#
 楼主| 发表于 2021-5-30 10:50:52 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2021-5-30 10:52 编辑

现在问题是,编译后没有 bootx64.efi.

mkdir: can't create directory '/tmp/grub4dos-temp/x86_64-efi': File exists
./build: line 144: /mnt/.31/home/dev/grub4dos/mkimage.i386: Permission denied
7-Zip 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_US,Utf16=on,HugeFiles=on,1 CPU)
Scanning

/tmp/grub4dos-temp/BOOTX64.EFI:  WARNING: No more files               
/tmp/grub4dos-temp/BOOTIA32.EFI:  WARNING: No more files   

点评

chmod +x mkimage.i386 chmod +x mkimage  详情 回复 发表于 2021-5-30 10:58
回复

使用道具 举报

382#
 楼主| 发表于 2021-5-30 13:05:38 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2021-5-30 13:07 编辑

$SOURCE_DIR/chmod +x mkimage -d $GRUB4DOS_TEMP/x86_64-efi .....  报错
$SOURCE_DIR/(chmod +x mkimage) -d $GRUB4DOS_TEMP/x86_64-efi .....  报错
chmod +x $SOURCE_DIR/mkimage -d $GRUB4DOS_TEMP/x86_64-efi ...... 报错
(chmod +x $SOURCE_DIR/mkimage) -d $GRUB4DOS_TEMP/x86_64-efi ...... 报错

点评

chmox +x是加上可执行权限。加上之后再执行mkimage。  详情 回复 发表于 2021-5-30 13:52
回复

使用道具 举报

383#
 楼主| 发表于 2021-5-30 14:12:24 来自手机 | 显示全部楼层
sh make   报错;   chmox +x mske  这样?

点评

先执行 chmod +x mkimage.i386 给这个文件加上可执行权限。 然后执行./mkimage.i386 看看能不能用。  详情 回复 发表于 2021-5-30 14:22
回复

使用道具 举报

384#
 楼主| 发表于 2021-5-30 15:45:28 | 显示全部楼层
先执行
chmod +x mkimage
chmod +x mkimage.i386
再执行
make
就行了。

再以后就有权限了,不用重复赋权。
谢谢 wintoflash !
回复

使用道具 举报

385#
 楼主| 发表于 2021-5-30 15:47:08 | 显示全部楼层
修改为如下,效率高一些:
@@ -3575,7 +3695,8 @@ static int insmod_func(char *arg,int flags)
     GRUB_MOD_ADDR = grub_malloc (0x100000);   //模块缓存
     mod_end = GRUB_MOD_ADDR;
   }
-   if (substring(skip_to(0,arg) - 4,".mod",1) == 0)
+   if (substring(skip_to(0,arg) - 4,".mod",1) == 0
+          || (arg[0] == '(' && arg[1] == 'm' && arg[2] == 'd' && arg[3] == ')'))
    {
       if (!command_open(arg,1))
          return 0;
@@ -3597,6 +3718,11 @@ static int insmod_func(char *arg,int flags)
       //skip grub4dos moduld head.
       if (strcmp(p_mod->name.sn,"\x05\x18\x05\x03\xBA\xA7\xBA\xBC") == 0)
         ++p_mod;
+      else
+      {
+        grub_free(buff);
+        goto external_command;
+      }
       while ((char *)p_mod < buff_end && grub_mod_add(p_mod))
       {
          p_mod = (struct exec_array *)(p_mod->data + p_mod->len);
@@ -3604,6 +3730,8 @@ static int insmod_func(char *arg,int flags)
       grub_free(buff);
       return 1;
    }
+
+external_command:
    switch(command_open(arg,0))
    {
       case 2:

点评

我是这样想的: 执行insmod xxx.mod -- 加载mod 执行insmod xxx -- 加载外置命令 执行insmod不带参数 -- 加载内置的mod  详情 回复 发表于 2021-5-30 16:07
回复

使用道具 举报

386#
 楼主| 发表于 2021-5-30 16:28:29 | 显示全部楼层
这样简单一些
if (substring(skip_to(0,arg) - 4,".mod",1) == 0  ||  flags == 101)

run_line (embed_mod_cmd, 101);

点评

我是这样改的。 主要是不想把处理模块方面的代码放在 disk_io.c 里面,感觉怪怪的。  详情 回复 发表于 2021-5-30 17:18
回复

使用道具 举报

387#
 楼主| 发表于 2021-5-30 18:46:34 | 显示全部楼层
执行insmod不带参数 -- 加载内置的mod

如果在命令行执行 insmod ,会产生问题。

点评

重复执行的话,只是会提醒 "xxx already loaded"。 要不就这样: if (arg == NULL || *arg == '\0') - return 0; + return flags == 101 ? insmod_embed () : 0;  详情 回复 发表于 2021-5-30 19:00
回复

使用道具 举报

388#
 楼主| 发表于 2021-6-1 20:25:41 来自手机 | 显示全部楼层
32位efi,就是个鸡肋,食之无味,弃之可惜。没有几个人真真使用32位真实机。大部分是在搞测试,研究,或者搞启动管理器,想包罗万象得集大成。

点评

那确实,现在有强迫症,觉得没32位总不完整不完美的样  详情 回复 发表于 2021-6-2 10:02
确实。估计跑ia32 uefi的设备数量比arm64 uefi还要少。  详情 回复 发表于 2021-6-1 22:25
回复

使用道具 举报

389#
 楼主| 发表于 2021-6-2 09:55:55 | 显示全部楼层
@wintoflash 补丁已经提交官网。
把3处 ‘FOR_MODULES (header)’ 整合到一起了。
回复

使用道具 举报

390#
 楼主| 发表于 2021-6-2 09:57:36 | 显示全部楼层
用最新版本替换这个版本,又出现这个问题了。多个菜单切换花屏。

你使用今天的版本试一试。如果仍然有问题,请提供可重复问题的菜单。

点评

用了6.2的版本还是出现花屏。有时候启动ramos菜单中的ramos启动项时卡界面。截屏如下: 我用的菜单如下: 主菜单 graphicsmode -1 1280 splashimage /efi/grub/0.jpg #foreground FFFF  详情 回复 发表于 2021-6-2 23:40
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-16 12:34

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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