无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 8075|回复: 140
打印 上一主题 下一主题

[求助] 为什么U盘引导ubuntu live ISO 出错?

  [复制链接]
1#
发表于 2022-11-12 14:00:24 | 显示全部楼层
本帖最后由 不点 于 2022-11-12 14:03 编辑

liu 版主,假如 ubuntu 不再支持 isoscan/filename=..... 这个参数呢?

找不到 iso 文件的信息,是 ubuntu 的启动代码发出的,不是 grub4dos 发出的。

grub4dos 能把控制权递交给 ubuntu,任务就完成了。后续的事,与 grub4dos 无关。

grub4dos 的鞭子再长,也不能伸到 ubuntu 的里面去操纵 ubuntu 的启动过程。

点评

最近的几个ubuntu发行版,15-20都是支持isoscan/filename=启动参数的,我测试过几个版本都支持。以后估计ububtu应该也不会放弃。 could not find the iso /pe/ubuntu.iso这样的提示应该是grub4dos抛出的,我分析  详情 回复 发表于 2022-11-12 14:23
回复

使用道具 举报

2#
发表于 2022-11-12 14:40:06 | 显示全部楼层
liuzhaoyzz 发表于 2022-11-12 14:23
最近的几个ubuntu发行版,15-20都是支持isoscan/filename=启动参数的,我测试过几个版本都支持。以后估 ...

我刚刚注意到,他在使用 UEFI。

UEFI 下的 光盘仿真命令,与 bios 下一样吗?

我看他的写法,完全是 bios 下的写法。

liu 版主,您熟悉 UEFI 下的 grub4dos,那么,究竟与 bios 下的写法一样不一样呢?

点评

BIOS/UEFI版本的grub4dos,命令方面从最终用户来说感觉不到有太大的区别。比如常用的find,map,kernel,initrd这样子的命令。其他的命令ls,geometry,cat,displaymem等等感觉没啥变化。 略有区别的可能是内部变量地  详情 回复 发表于 2022-11-12 14:50
回复

使用道具 举报

3#
发表于 2022-11-12 15:27:33 | 显示全部楼层
liuzhaoyzz 发表于 2022-11-12 14:50
BIOS/UEFI版本的grub4dos,命令方面从最终用户来说感觉不到有太大的区别,这与yaya的努力有关。比如常 ...

平时基本不用 g4e,偶尔用过。貌似 g4e 的 map 用法,变化很大耶。我印象中,是 yaya 的样本菜单里面的 map 命令,就与 bios 的不一样。详细情况,可能 liu 版主了解。我只是提醒:不要因为用法差别而导致楼主的问题出现。

点评

我发在3楼的菜单,是我实测可以启动的菜单,适用于g4d/g4e,从最终用户来讲没有感觉到有什么区别。  详情 回复 发表于 2022-11-12 15:38
回复

使用道具 举报

4#
发表于 2022-11-12 16:08:31 | 显示全部楼层
liuzhaoyzz 发表于 2022-11-12 15:38
我发在3楼的菜单,是我实测可以启动的菜单,适用于g4d/g4e,从最终用户来讲没有感觉到有什么区别。

不如您自己下载 ubuntu 试试,看究竟成功不成功,以便推断楼主问题的症结在哪里。现在光是问和答,看似省力,其实费劲。
回复

使用道具 举报

5#
发表于 2022-11-12 18:57:55 | 显示全部楼层
liuzhaoyzz 发表于 2022-11-12 18:45
Index of /ubuntu-releases/18.04.6/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror https://mi ...

赞!赞!赞!还是版主厉害!找到 bug 了。
回复

使用道具 举报

6#
发表于 2022-11-12 22:02:29 | 显示全部楼层
2011yaya2007777 发表于 2022-11-12 21:01
我觉得使用 kernel 和 initrd 函数启动 linux,与 2021-11-05 补丁没有关系,而是与 2021-10-21 补丁有关 ...

多年以来,一直被 gcc 编译器困扰,是相当难受的事情。

如果有可能的话,转换编译器。比如转换到 clang。
回复

使用道具 举报

7#
发表于 2022-11-12 23:19:11 | 显示全部楼层
yaya 测试正常,但 liu 版主测试出问题,楼主也遇到失败。

这个现象,说明不稳定。

不稳定的原因,除了 gcc 编译出的 cpu 指令含有错误以外,另一种可能性,就是代码体积变大以后,覆盖了原先存放变量的数据空间。还有一种常见的可能性是,堆栈空间给的太小,有些主板的 int 中断调用需要较多的堆栈空间,从而发生了堆栈溢出,造成失败,或死机。

出问题的时候,要看失败的现象:是不是死机了。没死机,与死机,是不一样的,有着不一样的原因。这能帮助判断出问题的大致方向。
回复

使用道具 举报

8#
发表于 2022-11-13 06:09:33 | 显示全部楼层
liuzhaoyzz 发表于 2022-11-12 18:45
Index of /ubuntu-releases/18.04.6/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror https://mi ...

这个图片:blksize=800,也就是 2KB,也就是光盘的 blksize。既然是光盘,为何还要检查其分区表是否合法?应该跳过检查才对啊?
回复

使用道具 举报

9#
发表于 2022-11-13 10:56:49 | 显示全部楼层
本帖最后由 不点 于 2022-11-13 11:13 编辑
2011yaya2007777 发表于 2022-11-13 08:04
原来在DOS下编译16位代码,有设置堆栈的问题。后来在32位保护模式,好像只设置代码段和数据段。现在在gcc ...

肯定有堆栈的。只要是 x86 intel amd 的 cpu,肯定有堆栈。32 位和 64 位,都离不开堆栈。尤其是 32 位、64位,此时消耗的堆栈,反而更多,c 语言函数里面的数组声明,就占用堆栈。比如 char buf [ 512 ]; 就占用 512 字节的堆栈。所以,最好不要在函数体里面声明很大的数组,而应该在函数体外面用 static char buf [ 512 ]; 的形式来声明一个大数组。

如果实在找不到设置堆栈的地方,那么,堆栈就是在实模式下设置好了。只需要确认,堆栈设置的位置是否合理便可。grub4dos for bios 里面的堆栈设置,应该是合理的,不用担心 bios 的 int 调用会发生堆栈溢出问题。但需要注意:刚才说的保护模式的 C 语言函数,不可占用过多堆栈。把那些不安全的地方,修改成安全的(就是函数外部的 static 数组)。


忽然想到,你现在是 EFI 模式。它有没有实模式,我也不知道。我是说,它开机进入实模式还是保护模式,我不知道。但无论如何,它是有堆栈的。你可以用一个程序片段,把主板 EFI 的堆栈探测出来。如果你觉得它设置的地方不对,你可以调整到一个你认为更安全的地方。如果它设置得没问题,你只需要像刚才所说,把 c 语言函数体里面的大数组声明,提取出来,放到函数体之外,并用 static 来声明即可,目的是尽量不占用堆栈。

点评

UEFI下g4e/grub2作为OSloader,一直工作在保护模式下。886楼: http://wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=422652&pid=4201424&fromuid=298214  详情 回复 发表于 2022-11-13 11:30
回复

使用道具 举报

10#
发表于 2022-11-13 11:32:54 | 显示全部楼层
本帖最后由 不点 于 2022-11-13 11:44 编辑
2011yaya2007777 发表于 2022-11-13 08:04
原来在DOS下编译16位代码,有设置堆栈的问题。后来在32位保护模式,好像只设置代码段和数据段。现在在gcc ...

你能否把 grub2 for efi 的堆栈相关代码贴出来,我看看。岁数大了,没有体力能查看庞大的 grub2 代码了。

它有可能设置得不合理。因为 ventoy 的图形模式,就很不稳定。我觉得,堆栈设置,是个可变因素,是个疑点。当然,grub2 里面的 bug,决不会只有少数几处。它在 legacy 时代,就有许多 bug,扔在那里没人管。所以,我认为 grub2 很难达到实用的程度,如果后来仍旧没人严肃处理其中的 bug 的话。yaya 你是开发者,我只跟你这么说,让你心中有数。其他人看到了的话,只当做没看到好了。


补充:我不了解 EFI 的内存布局。我只熟悉传统 bios 的内存布局。请 yaya 顺便把 efi 的内存布局简要介绍一下。

回复

使用道具 举报

11#
发表于 2022-11-13 11:48:50 | 显示全部楼层
liuzhaoyzz 发表于 2022-11-13 11:30
UEFI下g4e/grub2作为OSloader,一直工作在保护模式下。886楼:
http://wuyou.net/forum.php?mod=r ... 1 ...

好的,工作在保护模式,也行。现在关心的是堆栈空间太小,引起堆栈溢出。我不知道,grub4dos for efi 是否基于 grub2。如果不是的,那么,堆栈又是如何设置的?如果根本没设置,那就是继承 EFI 默认设置。然而,yaya 说了,grub2 efi 里面,有对堆栈进行设置的代码。也就是说,堆栈确实应该重新设置到一个更安全的位置。
回复

使用道具 举报

12#
发表于 2022-11-13 12:05:23 | 显示全部楼层
关于堆栈设置,可以以后再慢慢处理。现在我们还不知道堆栈应该怎么设置,那就是,采用 EFI 默认的设置。

目前我们应该立即行动的,就是前面说的,不让 c 语言函数体里面含有大数组。

另外一个值得提及的事情是:grub legacy 里面,有函数体里面套着另一个函数体(内嵌函数)的现象。这是极其糟糕的。在 grub4dos for bios 中我已经把这类毛病全部修正了。内嵌函数,也是占用堆栈。

所以,yaya 要注意,把函数体里面的大数组以及内嵌函数(如果存在的话),全都提取出来,放到函数体外面。这会大大提高稳定性。至少不会让稳定性变差。
回复

使用道具 举报

13#
发表于 2022-11-13 12:17:09 | 显示全部楼层
2011yaya2007777 发表于 2022-11-13 11:11
这个是遇到过。刚开始调试uefi时,函数出错误,把函数体内部的数组移动到外部,就通过了。

那就好。另外,如果你借用了 grub2 的部分代码,要注意,其中有可能存在着内嵌函数的情况。内嵌函数就是添乱,不要让函数体里面套着另一个函数体。

如果这些问题都没有,但仍然失败,那就要看,是不是代码体积太大,覆盖了数据空间?或者堆栈太小,不够(各种主板下的) EFI 函数调用的使用。
回复

使用道具 举报

14#
发表于 2022-11-13 12:29:16 | 显示全部楼层
liuzhaoyzz 发表于 2022-11-13 08:28
我之前都是在vmware虚拟机中测试的,因为需要频繁重启电脑,有时候会死机比较伤硬盘,chkdsk /f c:有时候 ...

这个貌似很容易解决。加个判断:如果是光盘(blksize=0x800),就不检查分区表。当然了,如果不是死在此处,那就不好说了。也许是检查时没死机,以后某一时刻才死机。
回复

使用道具 举报

15#
发表于 2022-11-13 16:43:11 | 显示全部楼层
wintoflash 发表于 2022-11-13 16:19
GRUB 2 UEFI 下不会设置堆栈。它只是可以设置堆栈保护 (stack guard),而且这个功能是可选的。
UEFI  ...

既然无需设置堆栈,那就不设置它了。内嵌函数去掉了,那很好。yaya 再确认下,看看以前获取的 grub2 函数,有没有必要更新到最新版。

如果堆栈没问题,code 和 data 也永远不发生交叉冲突,那么,剩下的故障,就只能怀疑 gcc 编译器了。

我知道转换编译器不容易。但是,你很难找到一个 “满意” 的 gcc 版本。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-12 17:07

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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