一直当成 “不校验”。 |
最后,关于命令序列的顺序,作一说明。我看到 blank007 使用如下序列: map --mem /msdos/msdos.gz (fd0) map --hook rootnoverify (fd0) chainloader (fd0)+1 最后两条命令的顺序,在本例中无关紧要。但在别的情况下,可能就不一样了。注意,最后,有一条被省略的 boot 命令。 在菜单中,boot 命令是可以省略的。但菜单会自动增加了一条 boot 命令。所以,无论是否省略, boot 命令都是存在的。 好的,为了明确起见,我就这么写(命令顺序已经有意颠倒过来了,这才是正确无误的): map --mem /msdos/msdos.gz (fd0) map --hook chainloader (fd0)+1 rootnoverify (fd0) boot 解释一下。rootnoverify 有什么用呢?它是确定当前驱动器的号码,在 assembly 层面上,它的最终目的是想要改变 DL 寄存器的值,但它自己改变不了,是让 boot 命令来做这个工作的。 注意,这条 rootnoverify 命令的服务对象是谁?它是为 boot 命令做准备的,是服务于 boot 命令的。 正是 boot 命令,才抓取当前驱动器的号码,把它赋值给 CPU 的 DL 寄存器,然后把控制权交给操作系统的引导代码。 所以说,rootnoverify 之后,就应该立即执行 boot 命令,而不是插入别的命令后,再执行 boot 命令。 如果插入的命令修改了 rootnoverify 的结果,那 boot 命令就会抓取 boot 本身执行时刻的当前驱动器号码,把它赋给 DL,而不是 rootnoverify 命令指定的驱动器号码。 而上述 chainloader 命令碰巧不改变当前驱动器号码,所以,插入了 chainloader 命令,也没有影响。 但并非所有的 chainloader 命令都不改变当前驱动器号码。 有些 chainloader 命令是会改变当前驱动器号码的。chainloader 命令的参数 --edx=.... 就可以改变驱动器号码。 当 chainloader 一个光盘的时候:chainloader (0xff) 或 chainloader (hd32) 之类的命令,不需要 rootnoverify (0xff) 或 rootnoverify (hd32) 之类的命令,因为 chainloader (...) 本身就能改变当前驱动器号码为虚拟光盘的号码。 然而,如果 chainlaoder (...) 之后,不是立即执行 boot,而是又插入了别的什么命令,则在后续执行 boot 之前,需要用一条 rootnoverify (...) 命令来确保当前驱动器是虚拟光盘,而不是别的盘号。 |
不点 发表于 2021-11-30 10:48 多谢大侠!!! |
好的,这个帖子中的测试,是个很好的资料。那么我就根据实验数据,说说相关的问题,并给出自己的分析。 GNU GRUB 官方网站上关于 uppermem 的描述是这样的: https://www.gnu.org/software/grub/manual/legacy/uppermem.html 13.3.37 uppermem— Command: uppermem kbytes Force GRUB to assume that only kbytes kilobytes of upper memoryare installed. Any system address range maps are discarded. |
最终测试结果 经过各位大侠的指点和帮助,以及自己的一些努力,终于得到了确实的结果。下面就做个汇报。 一、测试环境: 2009年左右的上网本,内存2G,CPU都是ATOM,硬盘 160G/256G。一为神舟小本、一为联想小本(固态硬盘)。分区格式:ext2/ext3/ntfs/fat/fat32。 去年出的神舟优雅x4,内存8G,固态硬盘512G,分区GPT ,安装 win 10 x64。 几个优盘。 软件:Qemu x86 /x64 ,GNU Grub 0.95 /0.97 ,grub4dos 0.4.6a (2021-11-19)。memdisk 6.03。 ultraiso 、WinImage (制作软盘镜像)、grubinst 1.4 (安装 grub4dos) 二、测试过程 在上网本的环境下(内存2G),安装 GNU GRUB 0.95 /0.97 到优盘(fat/fat32格式,主引导记录 usb-zip + v2,分区引导记录 gnu grub 0.95/0.97 ),无论是否加 uppermem 65536 命令, 执行: kernel /boot/grub/memdisk c=173 h=4 s=36 floppy initrd /boot/msdos/msdos.gz 都能进入DOS环境。 grub4dos 0.46a 下没有 uppermem 命令,但上述命令也正常执行,正常进入DOS环境。 神舟优雅x4环境下,启用 qemu x86 (最多只能分配1G内存) 测试优盘,结果与上网本中相同。 —————————————————————————— 神舟优雅x4环境下,启用 qemu x64 (最多分配3G内存,所以分了3G) 测试优盘,情况有所不同。 gnu grub 0.95 /0.97 执行: kernel /boot/grub/memdisk c=173 h=4 s=36 floppy initrd /boot/msdos/msdos.gz 提示错误,不能加载 msdos.gz 。 执行: uppermem 65536 kernel /boot/grub/memdisk c=173 h=4 s=36 floppy initrd /boot/msdos/msdos.gz 正常进入DOS。 grub4dos 0.4.6a 执行: kernel /boot/grub/memdisk c=173 h=4 s=36 floppy initrd /boot/msdos/msdos.gz 正常进入dos。 执行: map --mem /msdos/msdos.gz (fd0) map --hook rootnoverify (fd0) chainloader (fd0)+1 正常进入DOS。 三、结论与说明: 我在话题的一次发言,言及 grub4dos 0.4.6a 下加载DOS镜像,出现的死机等现象,这与 gnu grub /grub4dos 及 uppermem 无关。有些程序不能运行或死机,是其自身问题。 grub4dos 0.4.6a 的 map 命令,在3G以内的内存环境下,没有问题。memdisk 也是如此。 3G以上内存的情况,暂时没有办法测试。 内存<=2G时,gnu grub 0.95/0.97/grub4dos,memdisk、uppermem 命令都能正常工作。 内存>2G时,gnu grub 0.95/0.97 先执行 uppermem 65536 后,再调用 memdisk ,可以正常工作。grub4dos 0.4.6a 正常工作。3G以上内存的情况,暂时没有办法测试。 四、其它 1.意外找到自己多年前用过的 gnu grub 0.97 。支持制作成光盘启动、支持ext2/fat/ntfs/iso9660文件系统。内存超过2G时,需先执行uppermem 65536 等限制可用内存大小,才能用memdisk加载镜像。 2.意外找到另外一个版本的 gnu grub 0.97 ,发行日期:2021.08.27。支持ext2/fat/jfs/minix/xfs 文件系统。内存超过2G时,无需执行 uppermem 65536 等限制可用内存大小,即可直接使用 memdisk 加载镜像。 下载地址: https://packages.debian.org/sid/grub-legacy 3.grub4dos 0.4.6a 中,暂时没有必要复活 uppermem 命令。 4. 2G内存可能是某些软件的分水岭。 再次感谢各位大侠的热忱指导和帮助!!! |
blank007 发表于 2021-11-29 06:43 不要用 WinImage,以前就有报告,它制作出来的 img 文件(DOS盘镜像文件)是含有扇区错误的,也就是说,不可用。 请用 imdisk 重新制作您的 img,或者,用 Linux 下的工具也行,如果有的话。 |
在 chenall 的站点上,保存了我的一个根据 cute mouse 改编的鼠标驱动。当初的目的,是作为 grub4dos 的外部命令来运行。您可以把它当作 DOS 的命令来运行,取代 DOS 下的其他鼠标驱动。如果您觉得原始的 cute mouse 更可靠,您也可以找原始的 cute mouse,说不定它可能还有新版提供呢。 不一定能成功,但试试也无妨。 https://github.com/chenall/grubutils/blob/master/grubutils/wee/utils/weemouse.asm 这是源代码,您需要编译它。注释里面含有编译的说明。 |
diskgenius 4.3 dos 版,直接死机。pqdi2002 的 dos版,直接死机。 img 里面的 DOS,是 MSDOS,还是 FreeDOS?这是有差别的。FreeDOS 不太稳定,在扩展内存处理方面有 bug。很多程序都会使用扩展内存,这就可能出问题了。 其次,MSDOS 的版本,也有差异。请尽量使用 Win98se 里面的 DOS。 config.sys 里面,去掉那些导致死机的驻留程序,那就彻底无忧了。 比如,鼠标驱动,它不稳定,就去掉它。虽然没有鼠标很难受,但与死机比起来,还是去掉它更划算。 去掉中文模块,如果它导致其他软件死机的话。 可以试试保持 config.sys 是空的,不使用扩展内存。 可以找找别人的 config.sys,或查阅资料,看看如何填写与扩展内存相关的命令。 |
blank007 发表于 2021-11-28 22:19 这不行。xorboot 有可能带来影响。测试过程中,请尽量直接使用 grub4dos,不要在前面插入未知步骤。测试完了之后,您随便,爱用啥用啥。 grub4dos 的开发过程中,在 grub4dos 之前插入 ntldr 和 bootmgr 是测试过的,也是 grub4dos 官方文档明确支持的。也就是说,您可以放心地用 ntldr 和 bootmgr 来启动 grub4dos。但是,grub4dos 的开发者从未测试过 xorboot 下的情况。那么,由此带来的变数,grub4dos 的开发者是回答不了的,一般都是拒绝回答。 万一 xorboot 带来了影响,而您很晚才发现这一点,那您辛苦的测试,都白做了。 |
可以顺利进入DOS系统,但也会出现一些问题。比如,容易死机、鼠标失灵。总之会有一些问题。 死机、鼠标失灵。 看到鼠标,我想说,鼠标不仅是失灵的问题,而是还可能会导致死机的问题。 鼠标驱动难以做好。尤其是,新的硬件不一定支持 DOS 的鼠标驱动。 建议您去掉鼠标驱动,轻装上阵,卸载包袱,才能成功。 如果实在想用鼠标驱动的话,那我建议您试试 dosbox,这是个非常强大的 DOS 仿真工具,能够运行在 Windows 的各个系列,包括 64 位架构,也能运行在各种不同架构的 Linux 下。dosbox 使用虚拟的硬件,这有个好处就是,不受真实硬件升级换代所带来的不兼容性的影响,因此,大大提高了成功率。 我猜,也许,这正是您这个问题的症结所在。 如果您是想玩 DOS 游戏,那么 dosbox 就是最好的方案了。 |
谢谢 blank007 的测试。早都遗忘了的命令,您还能记得,应该是 grub4dos 的早期支持者。向您表示深深敬意! 首先,我多年来一直对 bug 高度重视,从未有丝毫懈怠。所以,首要的问题是确定,是否不该删除 uppermem 命令。如果不该删除而删除了,那就是 bug,必须修复 bug。根据您的描述,uppermem 未能起到作用,说明这个问题有了答案,不用恢复 uppermem 命令了。 其次,是要尽力帮您解决在启动 dos 的 img 方面遇到的问题,尤其是,当我发现您是早期支持者时,更感到不可懈怠! 接下来,我们不再讨论 uppermem 问题了,而是着力解决您的具体问题。我们也不要使用 uppermem 命令了,这是尽量避免它可能带来的不确定因素,导致新问题的产生。 首先,启动 DOS 的 img,有两种方式: 1、用 memdisk,就是您提到的方式。这个方式完全不采用 grub4dos 的仿真代码,仿真是由 memdisk 来完成的。 2、用 grub4dos 内置的仿真代码。grub4dos 有很多版本,您首先使用最新的 0.4.6a 系列来测试,如果失败,再用 0.4.5c 的最后一次发布来测试。如果仍然失败,而您还不死心,可以选几个更早期的 grub4dos 来试验。 测试的命令序列大致是这样的: map --mem /grub/msdos.img (fd0) map --hook chainloader (fd0)+1 rootnoverify (fd0) boot 注意 map 命令可能不支持 zip 格式的压缩文件。您需要先解压 zip,生成原始的 img 文件。 另外,map 支持 gz 格式的压缩文件,新版还支持 lzma 等格式的压缩文件。如果您实在想用压缩的 img 文件,建议用 gz 格式,这样旧版也能支持。 好的,您就先用上述两种方式分别进行测试,看看会不会有什么差别。 |
本帖最后由 blank007 于 2021-11-28 22:07 编辑 不点 发表于 2021-11-28 19:29 用 这个版本试了 ,结果很相似: uppermem 65536 之后,启动dos,用mem查看,内存都是8位数的字节。 但也有差别: , 使用 0.97 后,diskgenius 4.3 dos 版直接死机。用 grub4dos 9.4.3 , diskgen 4.3 dos 版正常运行。 pqdi2002 的 dos版, 0.97 环境下,直接死机。grub4dos 0.4.3 下卡死。 补充:还没有直接使用 grub4dos 0.4.3 启动 dos 镜像。是用 grub4dos 0.4.6a 启动 grub4dos 0.4.3 后,再启动dos镜像的。 |
无论是否执行 uppermem 65536 命令,效果...... :死机、或者退出。 这不就有结论了吗?等于说 uppermem 命令是无效的。 说明问题不在这里。 感谢您辛苦测试,给我们带来了结果,和认识。 |
不点 发表于 2021-11-28 19:29 我再看看这里。 |
先谢过各位大侠的热忱指导! 楼上两位大侠说的地方都是源码。 我在这里找到了一个有成品的。看日期还是今年 8月 的。 经过初步测试,里面有 uppermem 命令。但无论是否执行 uppermem 65536 命令,效果似乎和 grub4dos 0.4.6 对 Msdos 的一些程序都差不多,尤其是对 保护模式的程序 :死机、或者退出。 下面是下载地址: Debian -- 在 sid 中的 grub-legacy 软件包详细信息 https://packages.debian.org/sid/grub-legacy .deb 文件解包后,所有需要的文件 在 \usr\lib\grub\i386-pc下. 我是在 grub4dos 0.4.6a 下使用如下命令调用它的: chainloader --force --load-segment=0 --load-offset=0x8000 --boot-cs=0 --boot-ip=0x8200 /boot/grub/stage2.bin 这里。把 grub 的 stage2 改名为 stage2.bin 了。不然grub4dos 不认它。 - 另外,在它里面执行 root (hd0,3),它把我优盘上的fat32认成了fat。如果不使用 root (hd0,3) ,它就不能 configfile 其它菜单文件,说是不能mount设备。我的优盘只有一个分区,使用 ultraiso 写成 usb-zip+ v2 模式。 硬盘上的 ntfs 分区也说是未知的分区。 |
blank007 发表于 2021-11-28 18:32 http://git.savannah.gnu.org/cgit/grub.git/log/?h=grub-legacy |
blank007 发表于 2021-11-28 18:32 为您找到 grub 0.97 的镜像项目: https://github.com/jezze/grub-legacy |
昨天 liuzhaoyzz 版主提出让 grub4dos 支持 grub2 的 loopback 命令。 今天,我想到了这个帖子,就找到这里了。 当然,liuzhaoyzz 版主所提的问题,没有限定在 legacy bios。但我的回答,都是限于 legacy bios 层面的,不涉及 UEFI,因为我目前不怎么接触 UEFI 的电脑。 楼主所说的 uppermem 命令,是通过 int15 接口,让内存减小。有些操作系统,只能在低内存运行,不支持大内存,win98 就只能支持 1G 或 2G 内存(具体数字记不清楚了),而在更大的内存下无法启动进入桌面。前面说了,用 map 的办法可以达到同样的目的。 今天想说的是,一个多年以前被删除的命令,在当时最可能有人反对的时候,都没人反对,而如今却有人对此产生疑问了。知道这条命令的人不多,楼主是高手。能来到此处提问,也是缘分吧。 楼主仍然可以找到很老的 gnu grub 0.97,可以试试 uppermem 命令究竟能否解决楼主所遇到的问题。我猜根本解决不了,因为所描述的故障就不是这个方向。如果担心 gnu grub 0.97 难以启动成功,那可以找早期的 grub4dos,那时候还没删掉这条命令。果真能证明 uppermem 有效,而前面提到的 map 方法无效,那就可以让 yaya 把这条命令恢复出来。虽然这么多年过去了,也没人使用这条命令,不等于说这条命令完全可以被删除。你只要能证明它不可取代,我想,那就有理由让 yaya 把它恢复出来,或者以某种新的方式再实现一条具有同样功能的命令,或者考虑到要节约内存,可以在现有的某个命令中增加参数来实现。 |
本帖最后由 不点 于 2021-9-7 20:21 编辑 补充一下,印象中,这个命令好像是我删除的。有的命令或功能是因为用处不大而删除,有的命令或功能是因为存在问题无法解决而删除。精简了以后,grub4dos 才可能增加新功能。否则,早就出现内存冲突,无法使用了。 再有一点要说明。bios 是处于淘汰的状态,不要指望 bios 能够正常运转。dos 严重依赖 bios,所以,dos 的失败,那是意料之中的。昨天的 dos 可能好好的,今天就可能会失败。因为 bios 可能偷偷更新了。你要是想猜测问题出在哪里,通常在没人帮忙的情况下,估计会累死,很难猜得到。不一定是内存方面的问题。大量的问题出在 int xx 的调用上。你很难知道究竟是哪个中断调用不被支持了(或者被故意破坏掉了)。 dos、bios,以及 grub4dos for bios,这都要进入博物馆了,谁还去调试它? DOS 出了问题,难以确定问题在什么地方。不要想当然地判定,问题一定在你认为的那个地方。出问题的地方太多,可能性太多,所以,难以定位。 这是生产厂家、垄断控制者共同决定了的。你作为用户,你是没有决定权的,或者说是没有发言权也一样。 他们不想让你继续使用,你偏要继续使用。你这本质上是在跟他们作对,与他们的目的和要求相冲突。 那么,出了问题,那是你的不对咯!是你错误在先,然后才有问题的咯!你不犯错在先,那就不会有问题咯。应该这样理解吧? 所以我说,看问题,要看本质。这就是本质,一下子就说到根本点了。 好了,有人说了:“我知道本质上是我的错误,我知道我不该与厂家怼着干,但我还是想让某某方案能够变通,能够顺利运行。”——嗯,这是可以的。 也就是说,你首先得承认是你自己有问题,然后,你想寻求一种 workaround,一种妥协的方案。你应该明白,成功了值得庆贺,失败了也在情理之中,因此,你就不会要求太高,你就不会有过分的要求,你就不会有非分的要求了。 尽量不要给 yaya 增加工作量,尽量不要给 yaya 找事,尽量不要给 yaya 制造麻烦,尽量不要突然蹦出来一个问题让 yaya 必须去面对,尽量不要分散 yaya 的精力。让 yaya 自由地去做他自己愿意做的事。 尽量不要在那些 “意义不大” 或 “完全没有价值” 的方面,给 yaya 增加工作量。 |
plusv 发表于 2021-9-6 19:44 资本家不会让普通消费者轻松拥有大内存的. 一般来看,内存每提升一代,主流内存大小是上一代的1-4倍. 硬盘也有近20TB的, 但应该不会是主流. |
非常古老的问题了,现在还有这闲情雅致? 要想让内存变大,这不可能。但要变小,则毫无困难。 用一条map 命令把一个大的 img 文件映射到内存盘上,比如,--mem 映射到 (fd17) 上,意思是不用这个盘符,随便选个数字当盘符,只要不影响正常盘符就行。它占用的内存,就相当于消耗掉了。 比如说,你有 3G 内存,想让它减少到 1G 内存。你就用一个 2G 的 img 加载到内存盘上,这样,可用的内存就只剩下 1G 了。 当然了,map 命令有个参数,使得你不必真的加载一个文件,而只需加载一个内存中的扇区,用参数控制预留的扇区数,让它预留 2G 那么多,就可以了。这样,瞬间就完成了。 |
plusv 发表于 2021-9-6 19:44 用d5内存的机器,我这些软件 无法使用了。。。只能用二手机了。 |
Powered by Discuz! X3.3
© 2001-2017 Comsenz Inc.