无忧启动论坛

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

[发布] 增强 GRUB4DOS 菜单编辑功能,支持动画,支持精简字库,支持图形菜单

    [复制链接]
发表于 2023-1-29 12:28:02 | 显示全部楼层
wintoflash 发表于 2023-1-29 12:23
主线是不接受这些想法的。以前bean移植过lua,进了主线。后来官方又把lua从主线里面删了,弄得bean很不高 ...

从保守的角度来讲。
这种破坏性的更新,那是不可能会出现在小更新里的。
怕不是下个大版本才有可能。
回复

使用道具 举报

发表于 2023-1-29 12:29:04 | 显示全部楼层
本帖最后由 sunsea 于 2023-1-29 12:40 编辑
求道者 发表于 2023-1-29 12:25
所以说不能用复杂点的语法。
dos系跳转就是goto。
编程上也不推荐goto。

我个人感觉还行。反正这个环境也不能要求太高,以短小精悍为主,cmd系语法挺够用的。有更多需求那就是外部命令了。不能拿正经编程要求脚本。不过正经搞起来lua什么的确实还行,但我估计开发者没这个精力。

另外挺好奇g4e下面那些原来在0x82XX的内部变量啥的现在在哪,要是能系统性整理下这些文档化不太够的内部变量啥的在哪挺好。

回复

使用道具 举报

发表于 2023-1-29 12:29:29 | 显示全部楼层
wintoflash 发表于 2023-1-29 12:24
uefi下不存在这个问题。

那就挺好。
回复

使用道具 举报

发表于 2023-1-29 12:47:09 | 显示全部楼层
求道者 发表于 2023-1-29 12:28
从保守的角度来讲。
这种破坏性的更新,那是不可能会出现在小更新里的。
怕不是下个大版本才有可能。

bean移植lua的时候grub2的版本是1.9x,在2.0发布前被官方删了。他们都是一些gnu旧时代的老古董,比较排斥非gnu的东西。
所以bean后来不鸟官方了,弄了个burg。
回复

使用道具 举报

发表于 2023-1-29 13:07:24 来自手机 | 显示全部楼层
本帖最后由 求道者 于 2023-1-29 13:33 编辑
wintoflash 发表于 2023-1-29 12:47
bean移植lua的时候grub2的版本是1.9x,在2.0发布前被官方删了。他们都是一些gnu旧时代的老古董,比较排斥 ...


难说,毕竟在国外许可证问题是真的会引来官司。
大清自有国情在此。
开源协议有没法律效力。
只是道德层面的约束,当然没人在意许可证。
这是很大的问题。
如果许可证没法律效应就不可会有openwrt。

甚至说Linus选择GNU协议也是为了项目的延续。
钱不钱的我不在乎,就是不喜欢非自由。
你用了我的库还非自由?
nmsl!
你能赚钱更好,我只关注开源,贡献代码能让项目活得更好,让商业也能驱动开源。
而不是为爱发电。
国内很多项目就是因为国情在此,还在纠结钱的那点鸡毛蒜皮的小事,没办法做大的。
Linus是北欧人,吃穿不愁,当然是更多的想到了项目的未来,为爱发电必然无法长久,特别是linus这种体量的项目。
国内的人diss GNU就让我觉得很搞笑,层次还是低。
商业公司选择bsd许可证,不是为了方便开发者。
是方便自己随时闭源。
这种事太多了。

国内这个环境唯一的好处大概是可以无视许可证乱搞吧。
不过你真拿微软泄漏的源代码搞东西,微软搞死你也是分分钟的事吧,只看愿不愿意。
回复

使用道具 举报

发表于 2023-1-29 13:58:39 | 显示全部楼层
sunsea 发表于 2023-1-29 12:08
g4d用的lzma必须要求记录文件原始大小。好像当年采用lzma时说的一个意义就是文件大小在开头,很方便。zst ...
话说uefi下应该不存在实模式下内存限制导致尽可能砍代码的问题吧?

看到 sunsea 版主提到这个问题,我得解释一下。在解释之前,首先说明,下面这个解释并不重要,因为无论怎么解释,其结果都是要 “砍代码”,只不过 “砍代码” 的原因,不是由实模式造成的,而是因 grub1 缺乏内存分配机制造成的。

legacy bios 下,原始的 grub legacy 确实是受到实模式内存的限制。但 grub4dos 后来把代码从 0M 向上平移,挪动到 3M 的位置。也就是说,此后,本质上是可以使用任意多的内存的。但问题是,grub legacy 缺乏内存分配机制,没有内存分配函数,所以,grub4dos 的各个开发者都是用自己的方式来(任意)使用固定地址的内存,然后公布自己使用了哪些内存地址,以便让别的开发者了解,这样来减少发生冲突的可能性。这就是为什么在 grub4dos 中存在很多内部变量,它们有着固定地址。一个典型的固定地址内存的例子是,多国语言文字的点阵字模,占用好多 MB 的空间,使用的就是固定地址。别的变量空间就不可以与这里的点阵字模空间发生重叠。

就是说,本质上不是实模式的限制造成的,而是缺乏内存分配机制(各个开发者都在使用固定地址的内存碎片),导致 grub4dos 中的主体代码空间被挤压,不敢随便扩大(因为主体代码增长以后,会与其他固定地址的内存碎片发生冲突)。


回复

使用道具 举报

 楼主| 发表于 2023-1-29 14:31:21 来自手机 | 显示全部楼层
不点说得很到位。g4d的内存使用很随意。
回复

使用道具 举报

发表于 2023-1-29 14:38:47 | 显示全部楼层
求道者 发表于 2023-1-29 13:07
难说,毕竟在国外许可证问题是真的会引来官司。
大清自有国情在此。
开源协议有没法律效力。

grub官方不接受lua不是许可证的问题。
他们就是不想在项目的关键部分引入一个外部的项目。(虽然说lua就是适合这种情况的)
比如Linux的使用这么广泛,GNU他们就是看不顺眼,觉得Linux还是不够“清真”,非得再搞个半死不活的GNU Hurd。
回复

使用道具 举报

发表于 2023-1-29 15:03:34 | 显示全部楼层
不知该不该插话。我曾经提交 grub4dos 的代码(当时还没有准备建立 grub4dos 项目),人家连一封回信都没有。bean 的代码能被采纳,我感觉已经可以满意了。后来又被剥离出来,也算是可以理解的吧。

大家都是自由的。软件的官方管理者有着管理的自由,他想怎么做,就怎么做。其他开发者有着自己建立新分支的自由,同样也是想怎么做就怎么做。大家是平等的。谁也管不着谁。
回复

使用道具 举报

发表于 2023-1-29 15:27:57 | 显示全部楼层
不点 发表于 2023-1-29 13:58
看到 sunsea 版主提到这个问题,我得解释一下。在解释之前,首先说明,下面这个解释并不重要,因为无论 ...

感谢解释!那只能说这个问题算个历史包袱了吧,不过好处应该是g4d应该现在以修bug为主了不轻易加功能了,变化不大,所以也能接受……不知道g4e有没有计划清理下这种容易互相冲突的内存使用……要不然给后面又继续造成一大堆历史包袱……
回复

使用道具 举报

 楼主| 发表于 2023-1-29 17:44:37 | 显示全部楼层
不知道g4e有没有计划清理下这种容易互相冲突的内存使用……要不然给后面又继续造成一大堆历史包袱……

这点g4e相对完善些。
回复

使用道具 举报

发表于 2023-1-29 17:54:06 | 显示全部楼层
接着前面的闲话继续说,希望不至于冲淡了讨论的正题。

我倒是觉得,gnu 搞 hurd,应该搞下去。我唯一抱怨的,是他们 hurd 的开发进展速度太慢。我认可他们坚持搞 hurd 的做法。

linux 虽然软件丰富,已成规模,但我还是希望有别的系统来竞争,或者抗衡。我目前还是喜欢多元化。

一个项目的管理者、维护者,有着自己的偏爱。我在与 chenall 一起维护的一段时间里,就曾经拒绝采纳某个补丁。当时是有双重不放心(就是不信任):对补丁(的内容以及技术)不放心,对补丁的作者不放心。因此只能选择拒绝。而对于 grub4dos 各个时期曾经的开发、维护者,我都是完全放心,而且是双重放心:对他们的技术水平放心,对他们参与开发维护的目的放心。

当被拒绝的时候,这很可能已经表明,存在着概念层面上的差异,换句话说,两者不在一个轨道上。这种情况下,被拒绝了其实是好事。要加强自己对于真相的理解和把握。这里面没有什么 “对” 的和 “错” 的之分。要理解对方拒绝的理由,多猜一猜,会有哪些理由。猜到的理由多了,也就更接近真相了,那么,抱怨也就会减少了。
回复

使用道具 举报

发表于 2023-1-29 18:17:20 | 显示全部楼层
本帖最后由 求道者 于 2023-1-29 18:26 编辑
wintoflash 发表于 2023-1-29 14:38
grub官方不接受lua不是许可证的问题。
他们就是不想在项目的关键部分引入一个外部的项目。(虽然说lua就 ...

引入二进制黑盒子确实不清真,总有人不会妥协的。
但大部分人肯定能够忍受。
比方说,商业级的GPU有SR-IOV,而消费级有芯片相同的卡。
AMD这种对开源友好的厂商,都会用驱动里二进制bold和固件锁死这部分功能。
其他厂家别说了。
你如果是开发这部分的码农,你也会上头,无法接受,觉得不清真。
但显然大部分人不会管这东西。

然后一些旧GPU型号通过硬刷BIOS,改驱动,安装额外模块,就能用上这些功能。
不清真的东西在Linux下多了去了。
厂家没开源的bold里多少藏了点乱七八糟的东西。
比方说INTEL的无线固件强制开启了AX210/200的LAR,无法关闭,偏偏现有驱动他们没做好,导致AX210/200无法当AP用,不然的话就有便宜WIFI6路由可以用了,但牙膏厂就是把驱动里的禁用LAR关了(5.4之后,LAR禁用开关失效),然后驱动有没整好,然后就没有然后了,遇到这种你能怎么样?这东西就是由无线网卡不开源的固件锁死的,一点办法都没有,这种东西多了去了,都不能算是不清真,简直是汤里的老鼠屎。


https://github.com/coolsnowwolf/lede/issues/9976

回复

使用道具 举报

发表于 2023-1-29 18:39:14 | 显示全部楼层
2011yaya2007777 发表于 2023-1-29 17:44
这点g4e相对完善些。

那挺好,新开一个分支还是少给后面造成历史包袱就好。现在g4e有把各种内部变量和记录命令返回值什么的变量文档化的可能吗……?
回复

使用道具 举报

发表于 2023-1-29 18:54:27 | 显示全部楼层
本帖最后由 求道者 于 2023-1-29 19:00 编辑

wintoflash氏,你那个grub2分支停止维护是了吧?
但是wimboot还能编译吗?
移植到更新版的GRUB2能搞吗?
似乎没法从iso9660引导BOOTMGR.EFI。

回复

使用道具 举报

发表于 2023-1-29 19:00:11 | 显示全部楼层
本帖最后由 wintoflash 于 2023-1-29 19:01 编辑
求道者 发表于 2023-1-29 18:54
wintoflash氏,你那个grub2分支停止维护是了吧?
但是wimboot还能编译吗?
移植到更新版的GRUB2能搞吗?

我的grub2分支里面wimboot是依赖于map的,不能独立出来用。
https://github.com/Mexit/MultiOS-USB/issues/4
这里面有我单独移植的一个uefi下用的wimboot模块,官方grub2 20.4/2.06, redhat grub2 应该都可以用。当然,功能少了很多,和原版wimboot基本上一样。
回复

使用道具 举报

发表于 2023-1-29 19:02:28 | 显示全部楼层
本帖最后由 求道者 于 2023-1-29 19:08 编辑
wintoflash 发表于 2023-1-29 19:00
我的grub2分支里面wimboot是依赖于map的,不能独立出来用。
https://github.com/Mexit/MultiOS-USB/issu ...

顺便问一下,grub2没法从iso9660引导BOOTMGR.EFI吗?
Screenshot_20230129_190212.png

Screenshot_20230129_190711.png


回复

使用道具 举报

发表于 2023-1-29 19:13:28 | 显示全部楼层
求道者 发表于 2023-1-29 19:02
顺便问一下,grub2没法从iso9660引导BOOTMGR.EFI吗?

我觉得这个帖子已经跑题了。
你这是启动loopback挂载的ISO里面的bootmgfw.efi?有啥用?

两方面的问题:1.官方grub2 chainloader加载efi时对根设备的处理有问题,这个我已经反馈给官方了,我的分支里面修了。2. bootmgfw.efi自己对光驱的处理有问题,启动后会报bcd错误。这个需要对传递的设备路径做特殊处理,我懒没做。
回复

使用道具 举报

发表于 2023-1-29 19:19:26 | 显示全部楼层
本帖最后由 求道者 于 2023-1-29 19:21 编辑
wintoflash 发表于 2023-1-29 19:13
我觉得这个帖子已经跑题了。
你这是启动loopback挂载的ISO里面的bootmgfw.efi?有啥用?

我在做混合ISO。
用来在UEFI下做USB-CDROM启动。(U盘量产了一个CD-ROM的LUN)。
几乎所有的文件都塞在iso9660下。

现在这个情况。
wimboot能抢救吗?
回复

使用道具 举报

 楼主| 发表于 2023-1-29 19:26:57 | 显示全部楼层
现在g4e有把各种内部变量和记录命令返回值什么的变量文档化的可能吗……?

基本上与g4d相同。懒得弄。需要的话,你看一看asm.s文档。
回复

使用道具 举报

发表于 2023-1-29 19:27:47 | 显示全部楼层
求道者 发表于 2023-1-29 19:19
我在做混合ISO。
用来在UEFI下做USB-CDROM启动。(U盘量产了一个CD-ROM的LUN)。
几乎所有的文件都塞在 ...

可以。我当初移植wimboot就是为的这个。
回复

使用道具 举报

发表于 2023-1-29 19:36:05 | 显示全部楼层
wintoflash 发表于 2023-1-29 19:27
可以。我当初移植wimboot就是为的这个。

行吧,我编译看看。
回复

使用道具 举报

发表于 2023-1-29 19:45:35 | 显示全部楼层
wintoflash 发表于 2023-1-29 19:13
我觉得这个帖子已经跑题了。
你这是启动loopback挂载的ISO里面的bootmgfw.efi?有啥用?
1.官方grub2 chainloader加载efi时对根设备的处理有问题

对了这个补丁在哪?
干脆顺便编译了。
回复

使用道具 举报

发表于 2023-1-29 20:04:06 | 显示全部楼层
回复

使用道具 举报

发表于 2023-1-29 21:58:53 | 显示全部楼层
wintoflash 发表于 2023-1-29 20:04
https://lists.gnu.org/archive/html/grub-devel/2022-08/msg00334.html

编译还蛮费时间的。
回复

使用道具 举报

发表于 2023-1-30 00:06:17 | 显示全部楼层
本帖最后由 求道者 于 2023-1-30 01:24 编辑

打了补丁了似乎没用。
此BUG似乎只出现在iso9660下。
还是同样的报错。
commit='2f4430cc0a44fd8c8aa7aee5c51887667ad3d6c3'
https://git.savannah.gnu.org/git/grub.git


然后我把ISO刻录到U盘上,在实体机里能启动到LBA1的GRUB里,但是GRUB似乎无法检测到iso9660。
在QEMU下也可以模拟USB-CDROM。
同样的结果。
  1. mkisofs -V "BOOTISO" -A "FirPE Boot ISO" -U -max-iso9660-filenames -D -R -J -joliet-long -hide-joliet boot.catalog -no-emul-boot -boot-load-size 4 -b grldr -eltorito-alt-boot -no-emul-boot -eltorito-platform efi -eltorito-boot efiboot.img -o ~/efiboot.iso .
复制代码

efiboot.iso
链接: https://pan.baidu.com/s/1klHl9beuoGhkfW61BSxwgg&pwd=53d7
密码: 53d7

  1. diff --git a/grub-core/loader/efi/chainloader.c b/grub-core/loader/efi/chainloader.c
  2. index 7557eb269..75e9292a9 100644
  3. --- a/grub-core/loader/efi/chainloader.c
  4. +++ b/grub-core/loader/efi/chainloader.c
  5. @@ -32,6 +32,7 @@
  6. #include <grub/efi/api.h>
  7. #include <grub/efi/efi.h>
  8. #include <grub/efi/disk.h>
  9. +#include <grub/efi/memory.h>
  10. #include <grub/command.h>
  11. #include <grub/i18n.h>
  12. #include <grub/net.h>
  13. @@ -239,11 +240,7 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
  14.    if (! file)
  15.      goto fail;

  16. -  /* Get the root device's device path.  */
  17. -  dev = grub_device_open (0);
  18. -  if (! dev)
  19. -    goto fail;
  20. -
  21. +  dev = file->device;
  22.    if (dev->disk)
  23.      dev_handle = grub_efidisk_get_device_handle (dev->disk);
  24.    else if (dev->net && dev->net->server)
  25. @@ -266,19 +263,16 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),

  26.    if (dev_handle)
  27.      dp = grub_efi_get_device_path (dev_handle);
  28. -
  29. -  if (! dp)
  30. +  
  31. +  if (dp != NULL)
  32.      {
  33. -      grub_error (GRUB_ERR_BAD_DEVICE, "not a valid root device");
  34. +      file_path = make_file_path (dp, filename);
  35. +      if (file_path == NULL)
  36.        goto fail;
  37. -    }

  38. -  file_path = make_file_path (dp, filename);
  39. -  if (! file_path)
  40. -    goto fail;
  41. -
  42. -  grub_printf ("file path: ");
  43. -  grub_efi_print_device_path (file_path);
  44. +      grub_printf ("file path: ");
  45. +      grub_efi_print_device_path (file_path);
  46. +    }

  47.    size = grub_file_size (file);
  48.    if (!size)
  49. @@ -287,7 +281,7 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
  50.                   filename);
  51.        goto fail;
  52.      }
  53. -  pages = (((grub_efi_uintn_t) size + ((1 << 12) - 1)) >> 12);
  54. +  pages = (grub_efi_uintn_t) GRUB_EFI_BYTES_TO_PAGES (size);

  55.    status = efi_call_4 (b->allocate_pages, GRUB_EFI_ALLOCATE_ANY_PAGES,
  56.                               GRUB_EFI_LOADER_CODE,
  57. @@ -370,6 +364,7 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
  58.      }
  59.    loaded_image->device_handle = dev_handle;

  60. +  /* Build load options with arguments from chainloader command line. */
  61.    if (argc > 1)
  62.      {
  63.        int i, len;
  64. @@ -400,7 +395,6 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
  65.      }

  66.    grub_file_close (file);
  67. -  grub_device_close (dev);

  68.    /* We're finished with the source image buffer and file path now. */
  69.    efi_call_2 (b->free_pages, address, pages);
  70. @@ -411,9 +405,6 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),

  71.   fail:

  72. -  if (dev)
  73. -    grub_device_close (dev);
  74. -
  75.    if (file)
  76.      grub_file_close (file);
复制代码



回复

使用道具 举报

发表于 2023-1-30 20:18:49 | 显示全部楼层
本帖最后由 求道者 于 2023-1-30 20:20 编辑
sunsea 发表于 2023-1-29 12:08
g4d用的lzma必须要求记录文件原始大小。好像当年采用lzma时说的一个意义就是文件大小在开头,很方便。zst ...
  1.       
  2. 用法:lzma [选项]... [文件]...
  3. 使用 .xz 格式压缩或解压缩文件。

  4.   -z, --compress      强制压缩
  5.   -d, --decompress    强制解压缩
  6.   -t, --test          测试压缩文件完整性
  7.   -l, --list          列出 .xz 文件的信息
  8.   -k, --keep          保留(不要删除)输入文件
  9.   -f, --force         强制覆写输出文件和(解)压缩链接
  10.   -c, --stdout        向标准输出写入,同时不要删除输入文件
  11.   -0 ... -9           压缩预设等级;默认为 6;使用 7-9 的等级之前,请先考虑
  12.                       压缩和解压缩所需的内存用量!(会占用大量内存空间)
  13.   -e, --extreme       尝试使用更多 CPU 时间来改进压缩比率;
  14.                       不会影响解压缩的内存需求量
  15.   -T, --threads=数量  使用最多指定数量的线程;默认值为 1;设置为 0
  16.                       可以使用与处理器内核数量相同的线程数
  17.   -q, --quiet         不显示警告信息;指定两次可不显示错误信息
  18.   -v, --verbose       输出详细信息;指定两次可以输出更详细的信息
  19.   -h, --help          显示本短帮助信息并退出
  20.   -H, --long-help     显示长帮助信息(同时列出高级选项)
  21.   -V, --version       显示软件版本号并退出

  22. 如果没有指定文件,或者文件为"-",则从标准输入读取。

  23. 请使用英文或芬兰语向 <xz@tukaani.org> 报告软件错误。
  24. 请使用中文向 TP 简体中文翻译团队 <i18n-zh@googlegroups.com>
  25. 报告软件的简体中文翻译错误。
  26. XZ Utils 主页:<https://tukaani.org/xz/>
复制代码


没这选项

点评

-eos : write end of stream marker 是这个吗?  详情 回复 发表于 2023-1-30 20:34
那就不知道了。反正我记得Igor Pavlov的lzma.exe是可以输出给g4d能正确使用的lzma的。下载地址在7z的官方网站有个叫LZMA SDK的文件里。  详情 回复 发表于 2023-1-30 20:23
回复

使用道具 举报

发表于 2023-1-30 20:23:49 | 显示全部楼层

那就不知道了。反正我记得Igor Pavlov的lzma.exe是可以输出给g4d能正确使用的lzma的。下载地址在7z的官方网站有个叫LZMA SDK的文件里。
回复

使用道具 举报

发表于 2023-1-30 20:26:43 | 显示全部楼层
大佬腻害呀
回复

使用道具 举报

发表于 2023-1-30 20:34:29 | 显示全部楼层
  1. LZMA 22.01 (x86) : Igor Pavlov : Public domain : 2022-07-15

  2. Usage:  lzma <command> [inputFile] [outputFile] [<switches>...]

  3. <command>
  4.   e : Encode file
  5.   d : Decode file
  6.   b : Benchmark
  7. <switches>
  8.   -a{N}  : set compression mode : [0, 1] : default = 1 (max)
  9.   -d{N}  : set dictionary size : [12, 30] : default = 24 (16 MiB)
  10.   -fb{N} : set number of fast bytes : [5, 273] : default = 128
  11.   -mc{N} : set number of cycles for match finder
  12.   -lc{N} : set number of literal context bits : [0, 8] : default = 3
  13.   -lp{N} : set number of literal pos bits : [0, 4] : default = 0
  14.   -pb{N} : set number of pos bits : [0, 4] : default = 2
  15.   -mf{M} : set match finder: [hc4, bt2, bt3, bt4] : default = bt4
  16.   -mt{N} : set number of CPU threads
  17.   -eos   : write end of stream marker
  18.   -si    : read data from stdin
  19.   -so    : write data to stdout
复制代码


  -eos   : write end of stream marker
是这个吗?

点评

Igor Pavlov的话直接使用这个程序正常压缩即可得到正确文件。  详情 回复 发表于 2023-1-30 20:37
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-3-29 12:59

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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