无忧启动论坛

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

[求助] 关于chainloader直接加载启动文件启动分区的问题

  [复制链接]
跳转到指定楼层
1#
发表于 2014-7-1 01:04:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   这一段时间一直在看关于系统引导方面的资料,基本上都把引导文件写入到mbr或pbr上,突然想能不能动态地选择分区的引导文件?
由于pbr上会有关于本分区的一些参数,所以先修改原引导文件的这部分数据为此分区的具体参数。下面具体说我在通过grub4dos引导四叶草时遇到的问题:
我是以fat32分区为例,四叶草引导时的pbr文件为boot1f32或boot1f32alt,我想通过chainloader命令来加载boot1f32,再修改其具体的bpb参数(偏移量为3-89),
1、通过write命令写吗?但这样写好麻烦(共要写87个字节!)
2、用dd命令,因为不能直接对磁盘中的文件进行写操作,便想到把boot1f32放到一个镜像文件中(boots.img),然后再用
      map  --mem  /boots.img  (fd0)
      find  --set-root  /boot    (boot为四叶草的启动文件)
      dd  if=%@root%+1  of=(fd0)/boot1f32 bs=1 count=87 seek=3 skip=3    (修改bpb参数)
      chainloader  (fd0)/boot1f32
      rootnoverify %@root%

这样启动提示:分区表不能识别.....
     经过实验,把镜像文件映射成硬盘模式,解决了这个问题,并启动成功,代码为:
      map  --mem  /boots.img  (hd9)   (随便取的一个硬盘号)
      find  --set-root  /boot    (boot为四叶草的启动文件)
      dd  if=%@root%+1  of=(hd9,0)/boot1f32 bs=1 count=87 seek=3 skip=3    (修改bpb参数)
      chainloader  (hd9,0)/boot1f32
      rootnoverify %@root%

问题:
        chainloader 不是把boot1f32(大小为512字节)加载到0x7c00处吗?但从软盘加载启动时出错,而充硬盘加载时能成功启动?
       执行chainloader命令时,它具体做了哪些操作?
        对于以上的例子有没有更好的解决方法?比如,能不能不把boot1f32放入镜像文件中,再映射到内存中?
推荐
发表于 2014-7-1 03:58:22 | 只看该作者
你漏掉了 map --hook,你实际操作时应该没忘记,只是在这里漏写了。

上述两个方法,差别很微小,几乎是等价的。唯一的差别在于,第一个方法有一个软盘存在,而第二个方法有一个硬盘存在。

我猜你的引导代码可能需要在硬盘上找某个东西,它不在软盘上找。所以软盘启动失败。

chainloader 加载 512 字节的引导扇区,就是像你说的那样,加载在 7C00 处,后续的 boot 命令,会把当前 root 设备的号码赋值给 DL 寄存器,然后,控制权就交给引导扇区了。

能不能不把boot1f32放入镜像文件中,再映射到内存中?

你用 dd 命令直接修改这个文件便可。没必要映射到内存中。不过,经常写盘是不好的,会对硬盘造成一定的伤害。

点评

非常感谢不点老师的回复。今天我又试了试加载grub4dos 、bootmgr、syslinux、freedos的分区引导记录,发现如果映射为硬盘镜像时,都能引导;如果映射为软盘镜像时,只有bootmgr能正常启动,其他的都会出现“Partitio  详情 回复 发表于 2014-7-2 02:33
回复

使用道具 举报

推荐
 楼主| 发表于 2014-7-2 02:33:04 | 只看该作者
不点 发表于 2014-7-1 03:58
你漏掉了 map --hook,你实际操作时应该没忘记,只是在这里漏写了。

上述两个方法,差别很微小,几乎是 ...

非常感谢不点老师的回复。今天我又试了试加载grub4dos 、bootmgr、syslinux、freedos的分区引导记录,发现如果映射为硬盘镜像时,都能引导;如果映射为软盘镜像时,只有bootmgr能正常启动,其他的都会出现“Partition table not recognized(boot_drive=0x80,err=2)” 和 "Error43: The BPB hidden_sectors should not be zero for a hard-disk partition boot sector"
疑问1、  当用chainloader加载文件时,不是只是把文件的内容加载到7C00处吗?为何文件内容一样,但加载软盘中的文件和加载硬盘中的文件,引导同一硬盘分区时结果却不同?您说可能是引导代码要加载硬盘某个东西,它不在软盘上找。但我都用rootnoverify命令指定了相同的硬盘分区呀,出现上述两个错误信息,会不会是rootnoverify指定的为硬盘分区,需要读分区表,但读的是chainloader加载的文件的mbr,而软盘没有分区表信息,导致出错?但如果是这样,映射为硬盘时,chainloader所指的硬盘和rootnoverify所指的硬盘的分区表信息是不一样的呀!但这样却能成功启动呀!不知道这究竟会是怎么一回事,chainloader和rootnoverify命令具体又做了哪些事?
疑问2:您提到可以用dd命令直接修改这个文件,我发现实际上硬盘的文件并没有被修改。cpu读写磁盘上的数据不是都要通过缓冲区么?是不是在grub4dos的命令中dd并未修改硬盘的文件,而只是修改了其在缓冲区对应的文件数据?如果是这样那就和映射到内存中在修改是一样的了哦?也就不会对硬盘造成更多的伤害了。不知道这样理解对不对
     期待您的回复.......
回复

使用道具 举报

推荐
发表于 2014-7-2 09:36:25 | 只看该作者
单扇区的文件,是加载在 7c00,多扇区文件不一定是加载在 7c00。

如上所说,问题出在你的 boots.img 以及你建立的仿真盘上了。我猜如果没有它们,情况就不复杂了。

仿真盘的存在,可能影响了你的启动过程。试想,你原来的四叶草并不存在仿真盘,它能够正常引导。添加仿真盘以后,就增加了变数,就有了失败的可能。所以你有时成功,有时失败。

点评

我建立boots.img的方式很简单,用WinImage建立了一个标准的1.44MB软盘,然后再把需要的文件镜像添加到镜像文件内,  详情 回复 发表于 2014-7-2 22:39
回复

使用道具 举报

推荐
发表于 2014-7-2 09:23:25 | 只看该作者
根据你的描述,我猜测问题出在你的 boots.img 上。它带没带分区表,你没有提到。带分区表的,只能映射为硬盘。没带分区表的,可以映射为软盘。你没有贴出完整的菜单,还弄不清楚究竟哪个环节出错了。

回复

使用道具 举报

6#
发表于 2014-7-2 10:16:24 来自手机 | 只看该作者
本帖最后由 不点 于 2014-7-2 10:25 编辑

dd 命令支持写入文件,但某些主板 bios 不支持写入,只能读取。所以 dd 写入不成功。

要把文件放在内存中,不一定必须得使用 map 命令。dd 命令也可直接把文件的扇区数据放在内存中。

只要能保证不破坏 grub4dos 的系统内存便可。你可查找资料,了解 grub4dos 内存使用情况,了解用户可以自由使用哪些内存地址。

回复

使用道具 举报

7#
发表于 2014-7-2 10:36:41 | 只看该作者
另外,还有一种可能性,你使用 chainloader 命令,或许可以直接加载你提到的 boot 文件。chainloader 参数很多,可以控制加载的地址,edx 寄存器也可以指定。你可以查找一下相关的信息。

点评

嗯,看到readme中有关于这个的例子,只是感觉有些麻烦,自己有把握不准这些参数,还不是很明白,一直都没用附加参数  详情 回复 发表于 2014-7-2 22:47
回复

使用道具 举报

8#
 楼主| 发表于 2014-7-2 22:39:57 来自手机 | 只看该作者
不点 发表于 2014-7-2 09:36
单扇区的文件,是加载在 7c00,多扇区文件不一定是加载在 7c00。

如上所说,问题出在你的 boots.img 以 ...

我建立boots.img的方式很简单,用WinImage建立了一个标准的1.44MB软盘,然后再把需要的文件镜像添加到镜像文件内,
回复

使用道具 举报

9#
 楼主| 发表于 2014-7-2 22:47:25 来自手机 | 只看该作者
不点 发表于 2014-7-2 10:36
另外,还有一种可能性,你使用 chainloader 命令,或许可以直接加载你提到的 boot 文件。chainloader 参数 ...

嗯,看到readme中有关于这个的例子,只是感觉有些麻烦,自己有把握不准这些参数,还不是很明白,一直都没用附加参数
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-29 04:43

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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