无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: 2011yaya2007777
打印 上一主题 下一主题

[原创] GRUB4DOS for UEFI

    [复制链接]
3601#
发表于 2025-4-10 09:06:55 | 只看该作者
2011yaya2007777 发表于 2025-4-9 14:14
这句话是不是可以这样理解:
你通过U盘或者其他方式启动到出现菜单,其中菜单项包含”title NTBOOT 启动 ...

报 unaligned pointer 这种错误,个人感觉是严重错误。就是,程序含有 bug,居然能够让指针不对齐!32位的程序,应该是 4 字节对齐的。而 8e234252 不是 4 字节对齐。

产生这种错误,个人感觉,大概率是汇编代码有错。如果汇编代码是 grub2 之中的,那就是 grub2 本身含有 bug。相关的代码应该不是 yaya 写的,因为 yaya 自己对这条错误信息好像也并不熟悉(yaya 自己还需要查一下才知道)。

我在基于 grub legacy 做 grub4dos 的时候,就已经发现 grub legacy 里面的堆栈很糟糕。后来,我把堆栈重新设计和整理,基本上不会再有各种死机发生。

也就是说,有可能是堆栈溢出、堆栈冲突之类的错误。递归函数占用过多堆栈,也能导致堆栈溢出。我在 grub4dos 中,把 grub legacy 原有的递归函数统统转为非递归函数;把函数体中的大变量(比如 char str[512]; 之类的)都放到函数体之外(变成 static char str[512];);把函数体中的嵌套函数,也提取出来,放到函数体之外(前面也添加 static 指示符)。总之,尽一切可能,最大限度地节约堆栈的使用,减少死机发生。这个工作是很繁重的,不能留下任何一个死角,全部改造完成,工作量很庞大。当时我身体还不错,彻底完成了。

但愿 grub2 不会在这方面有问题。

点评

这个是grub2内存管理部分报的错误。 具体来说,是free了不该free的内存时就会报这个错。 比如 会报 unaligned pointer  详情 回复 发表于 2025-4-10 10:34
回复

使用道具 举报

3602#
发表于 2025-4-10 10:34:00 | 只看该作者
不点 发表于 2025-4-10 09:06
报 unaligned pointer 这种错误,个人感觉是严重错误。就是,程序含有 bug,居然能够让指针不对齐!32位 ...

这个是grub2内存管理部分报的错误。
具体来说,是free了不该free的内存时就会报这个错。
比如
  1. char* a = grub_malloc(2*sizeof(char));
  2. grub_free(&a[1]);
复制代码

会报 unaligned pointer


点评

明白了,是那些调用 grub_free 的代码,产生了错误。比如,把一个非法指针传给了 grub_free 函数。 那就要检查 grub_free 的调用。看看是不是咱们 grub4dos 的开发者在调用 grub_free 时犯了某个错误,被 grub2  详情 回复 发表于 2025-4-10 21:14
回复

使用道具 举报

3603#
发表于 2025-4-10 11:04:47 | 只看该作者
本帖最后由 minmax 于 2025-4-10 11:05 编辑
2011yaya2007777 发表于 2025-4-9 17:52
ntboot前面应当有路径。它肯定不在根目录。应该支持vhdx吧,没有测试过。实际上是调用微软的efi启动的。

有設定command --set-path=()/grub/WIM 可以正常起動,所以想知道 VHD 有額外啟動參數需要調用?
回复

使用道具 举报

3604#
发表于 2025-4-10 21:14:25 | 只看该作者
本帖最后由 不点 于 2025-4-11 07:51 编辑
wintoflash 发表于 2025-4-10 10:34
这个是grub2内存管理部分报的错误。
具体来说,是free了不该free的内存时就会报这个错。
比如

明白了,是那些调用 grub_free 的代码,产生了错误。比如,把一个非法指针传给了 grub_free 函数。

那就要检查 grub_free 的调用。看看是不是咱们 grub4dos 的开发者在调用 grub_free 时犯了某个错误,被 grub2 的调试(监控)代码检查出来了。

补充一下。个人感觉,无论如何,这是个严重错误。不管根源在哪里,都很严重。

比如说,咱们的开发者从未调用过 grub_free 函数,那么,这个错误就更深刻,差不多可说,一定是 grub2 本身产生的。那就要看堆栈是否有毛病,必要时,加大堆栈空间,或者挪动到一个更合理的位置。最后,就像我前面说的,查找递归函数,全部改写为非递归的;逐一检查函数体,把嵌套函数和大个头的变量移出函数体之外,减少堆栈的使用,最大限度保证安全。如果一个函数经常被调用,调用深度很深,那如果它占用很多堆栈,这就容易触发堆栈溢出。堆栈溢出时,指针就都是非法的了。

回复

使用道具 举报

3605#
 楼主| 发表于 6 天前 | 只看该作者
有設定command --set-path=()/grub/WIM 可以正常起動,所以想知道 VHD 有額外啟動參數需要調用?

你的参数正确。
find --set-root /VHDOS/LTSC2024.VHDX | set vhdd=
/path/ntboot %vhdd%/LTSC2024.VHDX winload=/Windows/System32/boot/winload.efi minint=1
boot

ntboot支持vhdx有点问题。
你测试一下这个。

ntboot.rar

964.37 KB, 下载次数: 3, 下载积分: 无忧币 -2

点评

可以開機進 WIN 但是 M$ WINDOWS 方塊 LOGO 變小 無法正確進到桌面 不要顯示這個比較快也減少問題  详情 回复 发表于 5 天前
回复

使用道具 举报

3606#
发表于 5 天前 | 只看该作者
本帖最后由 minmax 于 2025-4-15 09:25 编辑
2011yaya2007777 发表于 2025-4-12 17:09
你的参数正确。
find --set-root /VHDOS/LTSC2024.VHDX | set vhdd=
/path/ntboot %vhdd%/LTSC2024.VHD ...

ntboot.rar
可以開機進 WIN
NTBOOT 這個外部命令 無法用 makemod.exe 打包
Err read file ntboot,a000



回复

使用道具 举报

3607#
发表于 4 天前 | 只看该作者

向开发者致敬!
回复

使用道具 举报

3608#
发表于 3 天前 | 只看该作者
新技术层出不穷,疲于适用,前一个还没弄明白,又惶忙捡起下一个

点评

不,不,不, 你应该庆幸,你不曾被旧技术套牢。 如果你昨天好不容易终于学精了某个旧技术,今天发现,世界变了,旧技术已经淘汰,你作何感想? 你应该庆幸,你跳过了旧技术,直接来到新技术。  详情 回复 发表于 3 天前
回复

使用道具 举报

3609#
发表于 3 天前 | 只看该作者
2010happly 发表于 2025-4-15 08:55
新技术层出不穷,疲于适用,前一个还没弄明白,又惶忙捡起下一个

不,不,不,

你应该庆幸,你不曾被旧技术套牢。

如果你昨天好不容易终于学精了某个旧技术,今天发现,世界变了,旧技术已经淘汰,你作何感想?

你应该庆幸,你跳过了旧技术,直接来到新技术。

回复

使用道具 举报

3610#
 楼主| 发表于 前天 10:30 | 只看该作者
报 unaligned pointer 这种错误,个人感觉是严重错误。就是,程序含有 bug,居然能够让指针不对齐!32位的程序,应该是 4 字节对齐的。而 8e234252 不是 4 字节对齐。

这个问题终于搞清楚了。

据minmax发给我的消息中讲:
“出現選單就報以下錯,執行的話也是 aligned pointer 8e234252”
是因為引入了一行很舊的指令行(不顯示版本),
call Fn.0 0x40000 "!BAT\necho -P:0000 $[0000]\t\t\t\t\t\t\t\t\t\0" && initscript (md)0x200+1
拿掉就好了

这是错误地沿用了G4D的菜单。因为G4E不能随便使用内存,必须使用函数分配。否则会破坏已有数据。
比如:
grub_free(abc);
而abc指针正好在 0x40000范围,比如指针值是0x678900,被污染后成了8e234252、

点评

有一说一,感觉对这种以前的trick类的这种用硬编码地址啊、非公开内容啊啥的东西,应该至少在g4e中要么予以直接移除,要么直接文档化、命令化,要不然全是屎山、或者引起难以排查的bug。既然开了新分支,就应该尽量  详情 回复 发表于 前天 12:59
太好了!又丰富了知识宝库。 好的,这就排除了对于 “grub2 代码造成堆栈错误”的怀疑。 所以,大家(广大用户们)应该尽快从 grub4dos for BIOS 中走出来,尽量早点摆脱。 应该以 g4e 为主。  详情 回复 发表于 前天 12:34
厉害!知其然更知其所以然  详情 回复 发表于 前天 11:42
回复

使用道具 举报

3611#
发表于 前天 11:42 | 只看该作者
2011yaya2007777 发表于 2025-4-16 10:30
这个问题终于搞清楚了。

据minmax发给我的消息中讲:

厉害!知其然更知其所以然
回复

使用道具 举报

3612#
发表于 前天 12:34 | 只看该作者
2011yaya2007777 发表于 2025-4-16 10:30
这个问题终于搞清楚了。

据minmax发给我的消息中讲:

太好了!又丰富了知识宝库。

好的,这就排除了对于 “grub2 代码造成堆栈错误”的怀疑。

所以,大家(广大用户们)应该尽快从 grub4dos for BIOS 中走出来,尽量早点摆脱。

应该以 g4e 为主。
回复

使用道具 举报

3613#
发表于 前天 12:45 | 只看该作者
赞一个!
回复

使用道具 举报

3614#
发表于 前天 12:59 | 只看该作者
2011yaya2007777 发表于 2025-4-16 10:30
这个问题终于搞清楚了。

据minmax发给我的消息中讲:

有一说一,感觉对这种以前的trick类的这种用硬编码地址啊、非公开内容啊啥的东西,应该至少在g4e中要么予以直接移除,要么直接文档化、命令化,要不然全是屎山、或者引起难以排查的bug。既然开了新分支,就应该尽量一切从新开始。

点评

能把BIOS下grub4dos的map功能移植到BIOS的grub2下就好了。 但是grub4dos目前代码太乱太多了,我搞不明白。 目前在研究syslinux的memdisk。  详情 回复 发表于 昨天 12:18
说说我的一管之见。 旧的 grub legacy 架构,毛病很多。我前面的帖子里已经提到堆栈问题。grub4dos 对此进行了大规模的改造,才形成了目前的样子。比如说,把 32 位主代码空间挪动到物理地址 3M~4M 之间,这就腾  详情 回复 发表于 前天 18:21
回复

使用道具 举报

3615#
 楼主| 发表于 前天 14:24 来自手机 | 只看该作者
本帖最后由 2011yaya2007777 于 2025-4-16 16:46 编辑

现在高人是不少,但是。使用G4E批处理或者外部命令编程的人少之又少。像以前大块头的作品如RUN,SISO,还有hotkey等等。有些所谓的未公开内容,我理解是当前实现了某种功能,开发者正在使用,但是可能不完善,所以没有正式发布。
对于硬编码,确实简单方便,使得程序小巧。不可能移除,再说移到那里?如果想使用这些变量,函数的入口,在asm.S中有定义。
回复

使用道具 举报

3616#
发表于 前天 18:21 | 只看该作者
sunsea 发表于 2025-4-16 12:59
有一说一,感觉对这种以前的trick类的这种用硬编码地址啊、非公开内容啊啥的东西,应该至少在g4e中要么予 ...

说说我的一管之见。

旧的 grub legacy 架构,毛病很多。我前面的帖子里已经提到堆栈问题。grub4dos 对此进行了大规模的改造,才形成了目前的样子。比如说,把 32 位主代码空间挪动到物理地址 3M~4M 之间,这就腾出大量实模式空间,用于别的目的(包括增大了堆栈的空间,很重要!)。由于 grub legacy 没有分配内存的机制,所以,就采取了绝对地址的调用方式。这方面确实很混乱。

g4e 应该按照 g4e 自己应有的架构去设计。不用考虑与 g4d 的兼容性。当然,起初要照顾 g4d 的用户,所以,就较多地考虑了与 g4d 的兼容性。但是,当 g4d 逐渐成为历史,也就没必要再去考虑兼容性了。

g4e 应该有个文档,把那些与 g4d 不兼容的部分列出来。

另外,在解析菜单命令时,还要采取措施,禁止那些不兼容的用法。

比如,当用户使用 call Fn 时,报错,返回 false(表示失败),让用户知道这条命令不再支持。

又比如,当用户使用 gfxmenu 时,也要报错(返回 false),让用户知道这个用法是不正确、不适用的。

g4d 和 g4e 两者的 menu.lst 的位置本来就不一样,所以,原则上不会产生混乱。

回复

使用道具 举报

3617#
 楼主| 发表于 前天 19:45 来自手机 | 只看该作者
call Fn命令支持的。只是使用实模式地址要注意,只能使用常规内存。有时候uefi会占用部分常规内存。因此最好使用函数分配内存。

点评

不应该在没有向UEFI申请内存的情况下直接写入数据。 在有CSM的情况下,UEFI一般会把低地址内存全部锁住,不给你分配,就算你写入了也没有效果。 如果有CSM,且UEFI没有锁住低地址内存,那也不应该直接写入。  详情 回复 发表于 昨天 06:19
既然 call Fn 是支持的,那就要设法规避与 UEFI 占用的常规内存的冲突。 确实,grub_free 的出错信息,本身就表示问题很严重,属于内存冲突。堆栈溢出是内存冲突的一种。 应该给出一个说明文档,告诉用户如何  详情 回复 发表于 昨天 05:31
回复

使用道具 举报

3618#
发表于 昨天 05:31 | 只看该作者
本帖最后由 不点 于 2025-4-17 05:50 编辑
2011yaya2007777 发表于 2025-4-16 19:45
call Fn命令支持的。只是使用实模式地址要注意,只能使用常规内存。有时候uefi会占用部分常规内存。因此最 ...

既然 call Fn 是支持的,那就要设法规避与 UEFI 占用的常规内存的冲突。

确实,grub_free 的出错信息,本身就表示问题很严重,属于内存冲突。堆栈溢出是内存冲突的一种。

应该给出一个说明文档,告诉用户如何使用 call Fn 以及如何使用外部命令和批处理命令才是安全的。

如果用户执行了某条“合法”的命令,却导致死机,那只能说,问题出在 g4e 的代码上。

【补充】忽然明白了,UEFI 系统要占用常规内存空间,这挤占了(压缩了)g4e 可以安全使用的空间。而在 BIOS 的时候,BIOS 系统可是不会随便占用常规内存空间的,除了“中断向量表”、“BIOS 数据区”、“扩展的 BIOS 数据区”之外。所以,在旧的 g4d 下能够使用的内存,在 g4e 中就可能会产生内存冲突(而死机)。

点评

如果主板的UEFI支持CSM的话,会把前面的内存锁定防止普通uefi程序申请占用,以便切换到Legacy BIOS模式后Legacy BIOS的bootloader能够使用这些内存。  详情 回复 发表于 昨天 09:27
回复

使用道具 举报

3619#
 楼主| 发表于 昨天 06:11 来自手机 | 只看该作者
本帖最后由 2011yaya2007777 于 2025-4-17 06:13 编辑

现在没几个人对编写批处理或者外部命令感兴趣。如果真有感兴趣的人,并且明白g4d的旧代码,看一下本篇开头,以及RUN抛砖引玉那篇,就会明白不同之处及应当注意点事。

点评

本人的使用,极其简单。基本就是在 “一盘走天下【自由拼装修改版】”当中使用罢了。不曾用到批处理之类的。外部命令也没用到。 您提到的那些文档,我从未看过,因为我的应用范围太狭窄,用不到那些知识。我只需  详情 回复 发表于 昨天 09:59
回复

使用道具 举报

3620#
发表于 昨天 09:27 | 只看该作者
不点 发表于 2025-4-17 05:31
既然 call Fn 是支持的,那就要设法规避与 UEFI 占用的常规内存的冲突。

确实,grub_free 的出错信息 ...

如果主板的UEFI支持CSM的话,会把前面的内存锁定防止普通uefi程序申请占用,以便切换到Legacy BIOS模式后Legacy BIOS的bootloader能够使用这些内存。

点评

那我觉得这还是挺严重的一个问题,需要仔细对待。旧的 call Fn 之类的绝对地址使用方式,以及 g4e 对于绝对地址的占用,就可能与 UEFI、CSM 产生内存冲突。比如说,旧的 g4d 的批处理程序占据了某个绝对地址,这本身  详情 回复 发表于 昨天 10:10
回复

使用道具 举报

3621#
发表于 昨天 09:59 | 只看该作者
2011yaya2007777 发表于 2025-4-17 06:11
现在没几个人对编写批处理或者外部命令感兴趣。如果真有感兴趣的人,并且明白g4d的旧代码,看一下本篇开头 ...

本人的使用,极其简单。基本就是在 “一盘走天下【自由拼装修改版】”当中使用罢了。不曾用到批处理之类的。外部命令也没用到。

您提到的那些文档,我从未看过,因为我的应用范围太狭窄,用不到那些知识。我只需要看发布包中的样板 menu.lst 就够了。

为了方便那些需要批处理编程的人,应该把必要的知识都放在发布包中,而不是放在某个帖子中。在帖子中的,不属于 “正式文档”。在 Readme 中的,才算是正式文档。

点评

我也基本一样,对于g4e主要的命令知识都来自于菜单中的样板菜单。  详情 回复 发表于 昨天 13:33
回复

使用道具 举报

3622#
 楼主| 发表于 昨天 10:01 来自手机 | 只看该作者
所以在UEFI模式下,不要有常规内存的概念,只要使用内存,就分配一块。
回复

使用道具 举报

3623#
发表于 昨天 10:10 | 只看该作者
wintoflash 发表于 2025-4-17 09:27
如果主板的UEFI支持CSM的话,会把前面的内存锁定防止普通uefi程序申请占用,以便切换到Legacy BIOS模式后 ...

那我觉得这还是挺严重的一个问题,需要仔细对待。旧的 call Fn 之类的绝对地址使用方式,以及 g4e 对于绝对地址的占用,就可能与 UEFI、CSM 产生内存冲突。比如说,旧的 g4d 的批处理程序占据了某个绝对地址,这本身就有可能与 UEFI 相冲突。这在 BIOS 下是不会有冲突的,因为 BIOS 系统不会占据 chenall 为批处理设定的内存位置。

这让我想到了 Ventoy。Ventoy 没有与 g4d 兼容的包袱。所以,Ventoy 就不存在这方面的问题。
回复

使用道具 举报

3624#
发表于 昨天 12:18 | 只看该作者
sunsea 发表于 2025-4-16 12:59
有一说一,感觉对这种以前的trick类的这种用硬编码地址啊、非公开内容啊啥的东西,应该至少在g4e中要么予 ...

能把BIOS下grub4dos的map功能移植到BIOS的grub2下就好了。
但是grub4dos目前代码太乱太多了,我搞不明白。
目前在研究syslinux的memdisk。

点评

继续操作 BIOS,不知有啥想法?依我的看法,for BIOS 不用再继续搞了。继续搞,就是浪费时间,就是浪费生命。 UEFI 下有了 map,就已经很不错了,这个工作很棒。甚而至于,UEFI 下(即使)不用 map 也有(别的)  详情 回复 发表于 昨天 16:11
回复

使用道具 举报

3625#
发表于 昨天 13:23 | 只看该作者
这个棒,感谢分享。   
回复

使用道具 举报

3626#
发表于 昨天 13:24 | 只看该作者
谢谢楼主分享。
回复

使用道具 举报

3627#
发表于 昨天 13:33 | 只看该作者
不点 发表于 2025-4-17 09:59
本人的使用,极其简单。基本就是在 “一盘走天下【自由拼装修改版】”当中使用罢了。不曾用到批处理之类 ...

我也基本一样,对于g4e主要的命令知识都来自于菜单中的样板菜单。
回复

使用道具 举报

3628#
发表于 昨天 16:11 | 只看该作者
wintoflash 发表于 2025-4-17 12:18
能把BIOS下grub4dos的map功能移植到BIOS的grub2下就好了。
但是grub4dos目前代码太乱太多了,我搞不明白 ...

继续操作 BIOS,不知有啥想法?依我的看法,for BIOS 不用再继续搞了。继续搞,就是浪费时间,就是浪费生命。

UEFI 下有了 map,就已经很不错了,这个工作很棒。甚而至于,UEFI 下(即使)不用 map 也有(别的)启动 ISO 的方法。map 的地位在降低。也就是说,连 map 都要过时了,或者说,已经在“过时”的过程中。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2025-4-18 11:51

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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