无忧启动论坛

标题: 非常希望grub4dos的开发者增加对bios方式启动gpt分区系统的支持 [打印本页]

作者: qj_tzy    时间: 2014-8-15 09:13
标题: 非常希望grub4dos的开发者增加对bios方式启动gpt分区系统的支持
本帖最后由 qj_tzy 于 2014-8-23 10:25 编辑

非常希望grub4dos的开发者增加对bios方式启动gpt分区系统的支持

目前,我已在小于2TG的gpt分区单硬盘上,采用bios方式+xorboot+grub4dos,成功启动了安装在gpt分区的winxp、win7_x32、win7_x64、win8_x64系统,及该4系统存放在gpt分区的vhd/vhdx系统。其中,win7_x64、win8_x64及其VHD/vhdx系统,还能以uefi方式启动。但仍有以下问题未解决:

1.如何用grub4dos判断是gpt分区硬盘还是mbr分区硬盘,以根据判断结果采取不同的后续操作。

2.如何用grub4dos隐藏及显现gpt分区,以在启动某一gpt分区操作系统时,隐藏另一gpt分区操作系统所在分区。

3.win7/win8的原生VHD系统用grub4dos+ntboot按ntboot nt6=(hdx,y)/dir/xxx.vhd方式不能启动,提示读取BCD出错。于是制作了ima包启动成功,但此法是启动固定盘符、固定目录、固定VHD文件名的VHD系统,不具有通用性。

为此,希望:

1.提供一grub4dos安装工具,可将grub4dos的主启动代码,安装在gpt分区硬盘的0扇区,其余部分存放在esp分区的根目录或某一子目录下的grldr中。

2.增加一grub4dos命令,用于判断是gpt分区硬盘还是mbr分区硬盘。
3.可用hide、unhide、parttype或其他命令隐藏、显现gpt分区。
4.完善ntboot,使其能够启动存放在gpt分区的win7/win8原生VHD系统。

若如此,非常感谢!

注:
1.第2与第3个问题,已由chenall大等解决,详见《BIOS方式安装、引导GPT分区单硬盘中的win7和win8系统问题》1楼末尾的说明
http://bbs.wuyou.net/forum.php?m ... &fromuid=349593(出处: 无忧启动论坛)

2.第4个问题,chenall大已在帖子《用grub4dos+ntboot不能启动存放在gpt分区中的原生VHD系统的替代方法》9楼完善了,非常感谢C大!
http://bbs.wuyou.net/forum.php?m ... &fromuid=349593



作者: 2011902    时间: 2014-8-15 18:56
楼主真是MS系统引导高手,NTBOOT是C大的亲儿子,C大一定会完善对GPT的支持,让你随意引导GPT分区下的VHD/VHDX,就像你说的具有高度的灵活性.(这也是我喜欢NTBOOT的原因)
作者: 2012sillian    时间: 2014-8-16 12:15
楼主可否分享一下“bios方式+xorboot+grub4dos”启动GPT分区的具体方法?
非常期待!谢谢!
作者: mdyblog    时间: 2014-8-16 12:44
新版 grldr  阴茎支持gpt。

问题是, XP-Loader,DOS及其Loader 等 不支持。
后续启动失败。
目前只能当个UD用。 grldr 将里面的IMG  map成磁盘。
再接着继续启动。

UD也是不能直接启动DOS、XP。必须MAP出来。




作者: qj_tzy    时间: 2014-8-16 15:57
2012sillian 发表于 2014-8-16 12:15
楼主可否分享一下“bios方式+xorboot+grub4dos”启动GPT分区的具体方法?
非常期待!谢谢!

待整理一下我的安装和启动过程后,再贴出
作者: qj_tzy    时间: 2014-8-16 17:05
2012sillian 发表于 2014-8-16 12:15
楼主可否分享一下“bios方式+xorboot+grub4dos”启动GPT分区的具体方法?
非常期待!谢谢!

已发贴,请见:
《BIOS方式引导、安装GPT分区的XP系统用户经验汇总》
http://bbs.wuyou.net/forum.php?m ... &fromuid=349593
(出处: 无忧启动论坛)


《BIOS方式安装、引导GPT分区单硬盘中的win7和win8系统问题》
http://bbs.wuyou.net/forum.php?m ... &fromuid=349593
(出处: 无忧启动论坛)

作者: chenall    时间: 2014-8-17 14:34
2.判断的话可以用NTBOOT里面的方法
root (hdx,y)
checkrange 0xee read 0x8334 && echo gpt

3.新的版本已经 上传,应该可以正常显示隐藏gpt分区,我只用qemu测试了下.
有条件可以测试下,测试之前最好先备份好重要数据..

用hide/unhide命令.至于parttype对于gpt分区无效,新的版本已经禁止parttype对gpt分区的操作,以防止出错.




作者: qj_tzy    时间: 2014-8-17 14:46
chenall 发表于 2014-8-17 14:34
2.判断的话可以用NTBOOT里面的方法
root (hdx,y)
checkrange 0xee read 0x8334 && echo gpt

非常感谢,不知新版本在哪里下载,我下载测试后再反馈!
作者: wanghh    时间: 2014-8-17 18:41
谢谢!辛苦了!学习了。
作者: qj_tzy    时间: 2014-8-17 20:55
chenall 发表于 2014-8-17 14:34
2.判断的话可以用NTBOOT里面的方法
root (hdx,y)
checkrange 0xee read 0x8334 && echo gpt


经我测试,隐藏两个gpt分区,显现一个gpt分区,并启动该分区系统,但启动后该两个分区仍可见,我是用grub4dos4.5C-2014-8-17版的hide (hd0,3)、hide (hd0,4)、unhide (hd0,6)命令测试的。
作者: chenall    时间: 2014-8-18 08:34
看来必须重新要计算GPT的两个CRC表才行了,这个就暂时先放着吧,改天有空再处理.
作者: qj_tzy    时间: 2014-8-21 13:17
chenall 发表于 2014-8-18 08:34
看来必须重新要计算GPT的两个CRC表才行了,这个就暂时先放着吧,改天有空再处理.

感谢您的不懈努力,又推出grub4dos新版本。

我下载了grub4dos -0.45C-2014-8-19,对支持GPT分区隐藏的新修改情况进行了测试,结果如下:
系统启动后,用hide命令隐藏的两个gpt分区在系统中仍可见。用bootice的分区管理察看,不能列显gpt分区硬盘的分区信息了,我就进系统的磁盘管理修改gpt分区的盘符后,再进bootice的分区管理可列显盘符信息了,只见用hide命令隐藏的两个gpt分区上打上了隐藏标志"H",但该两个分区中的内容可见。
作者: chenall    时间: 2014-8-21 13:35
qj_tzy 发表于 2014-8-21 13:17
感谢您的不懈努力,又推出grub4dos新版本。

我下载了grub4dos -0.45C-2014-8-19,对支持GPT分区隐藏的 ...

目前对GPT的修改还不完善,只改了一个分区表,

经过我的测试,要实现该功能,需要改两个分区表(一个是备份的),然后还要修改对应GPT头的两个CRC校验才行的.

另外如果只修改了两个分区表没有修改CRC校验,则WINDOWS将无法识别该磁盘,提示未初使化.

改回来之后正常.
作者: qj_tzy    时间: 2014-8-21 14:34
chenall 发表于 2014-8-21 13:35
目前对GPT的修改还不完善,只改了一个分区表,

经过我的测试,要实现该功能,需要改两个分区表(一个是备份 ...

谢谢您的指点,原来是这样啊。那我随时关注您发布的grub4dos新版本。
作者: chenall    时间: 2014-8-21 23:28
本帖最后由 chenall 于 2014-8-22 10:47 编辑

上传一个测试版,

有可能会由于写入错误,导致硬盘数据丢失.

请先备份重数据,或者在没有重要内容的硬盘上测试.

该版本尝试完善对GPT分区unhide/hide的支持,

由于gpt的分区表安全性比较高,所以修改的话会比较麻烦,并且需要读取所有分区表重新计算对应CRC(需要读取至少66个扇区太概32KB数据),还要计算4个CRC值,

所以对于GPT分区的处理比如一个hide可能会有几秒的延迟,这是正常情况,并且暂时没有什么更好的办法提速.

另个呢,不建议经常修改分区表.

对于GPT分区,若要隐藏所有分区,最好的办法是直接修改CRC校验值,只要校验不通过,WINDOWS就识别不了.需要显示的时候再改回来就行了
作者: qj_tzy    时间: 2014-8-22 00:05
chenall 发表于 2014-8-21 23:28
上传一个测试版,

有可能会由于写入错误,导致硬盘数据丢失.

已下载测试,结果如下:

在bootice可见gpt分区信息及隐藏标志H了。但用windows系统的硬盘管理功能可添加被隐藏分区的盘符,添加后,即可见该GPT分区中的文件了。
作者: chenall    时间: 2014-8-22 10:54
qj_tzy 发表于 2014-8-22 00:05
已下载测试,结果如下:

在bootice可见gpt分区信息及隐藏标志H了。但用windows系统的硬盘管理功能可添 ...

再次完善了一下,新的隐藏会顺便加上OEM属性,也就是不能手动分配盘符.

另外parttype作用在GPT分区上时,直修修改分区属性.也就是说可以使用parttype修改分区属性,当然了对GPT不了解就不要使用parttype命令修改,因为可能会导致分区无法访问.

grub4dos-0.4.5c-2014-08-22.7z

257.72 KB, 下载次数: 10, 下载积分: 无忧币 -2


作者: qj_tzy    时间: 2014-8-22 13:10
chenall 发表于 2014-8-22 10:54
再次完善了一下,新的隐藏会顺便加上OEM属性,也就是不能手动分配盘符.

另外parttype作用在GPT分区上时, ...


我下载17楼的grub4dos进行测试的结果如下:

我在gpt分区硬盘划分5个分区分别安装了winxp/w2003/win7_x32/win7_x64/win8_x64系统,启动某系统时,就用unhide显现该分区,用hide隐藏其他4个分区,结果winxp/w2003/win7_x32系统中只有2个分区打上的H标志,且为oem方式,其他2个分区未打H标志,可在磁盘管理中添加盘符;置于(hd0,2)分区的win8_x64系统隐藏了3个分区;置于(hd0,1)分区的win7_x64系统隐藏了4个分区。不知为何。
作者: chenall    时间: 2014-8-22 13:28
因为提供的资料太少没有办法判断原因.

估计和你的菜单什么的有关系吧.

建议你命令行测试试一下.

作者: qj_tzy    时间: 2014-8-22 15:02
chenall 发表于 2014-8-22 13:28
因为提供的资料太少没有办法判断原因.

估计和你的菜单什么的有关系吧.

晚上用命令行再测试一下,然后再反馈
作者: qj_tzy    时间: 2014-8-22 19:01
chenall 发表于 2014-8-22 13:28
因为提供的资料太少没有办法判断原因.

估计和你的菜单什么的有关系吧.


我用命令行测试后完全正常了,非常感谢,在您的不懈努力下,gpt分区的隐藏与显现的问题已经解决。

  不过,我还有一个希望,那就是,若您认为有必要的话,是否可解决一下我在1楼提的第1个问题,即:

  提供一grub4dos安装工具,可将grub4dos的主启动代码,安装在gpt分区硬盘的0扇区,其余部分存放在esp分区的根目录或某一子目录下的grldr中。

  若如此,grub4dos就完全可不再借助xorboot,而可直接安装在gpt分区硬盘中,启动gpt分区中的windows系统了。

作者: chenall    时间: 2014-8-23 08:35
安装到GPT分区,这个以我的能力还做不到....

感觉直接修改wee会比较简单一些,不过我对汇编不熟,看不太懂,不知道该怎么改.只能等不点或其它人去做了.
作者: 不点    时间: 2014-8-23 09:37
本帖最后由 不点 于 2014-8-23 09:41 编辑

我已经不适合再去学新知识了。我会在别的方面去学新知识,比如,数学啊,物理啊,历史啊,哲学啊,政治啊,等等,但不会是 EFI 啊,GPT 啊,这些。

大家知道,若干年前我写了 Linux 的 ext2 分区的 grldr 引导代码,只用一个扇区就做到了,并感到很兴奋。但是现在,我恐怕已经看不懂我写的代码了。yaya 在这方面比较强,对汇编语言比较熟练,能够填补由于我退出开发团队而造成的空缺。其实 chenall 也行,我当初的汇编基础与 chenall 完全一样,是从 0 开始学会的。还有一大批的人都可以,只是你们可能不愿意花时间去学罢了。从某种程度上说,汇编比 C 更容易学会。这是因为,汇编只需要学会一条一条的指令便可,而 C 语言的结构啊、概念啊,有一大堆,不太容易学会。顺便说,假如 chenall 遇到汇编语言的困难,我愿意提供帮助,只要我能力所及,我一定尽力。


作者: qj_tzy    时间: 2014-8-23 10:14
chenall 发表于 2014-8-23 08:35
安装到GPT分区,这个以我的能力还做不到....

感觉直接修改wee会比较简单一些,不过我对汇编不熟,看不太懂, ...

感谢chenall 、不点 两位大师的指点。
目前,有无直接将grub4dos启动代码写入gpt分区硬盘的工具,都不会影响grub4dos在gpt分区的使用,目前可用xorboot实现这点。以后pauly等大师也许会在不久将来对bootice进行完善后,就可将wee或grub4dos启动代码写入gpt硬盘进行启动了。
作者: Pauly    时间: 2014-8-23 10:26
qj_tzy 发表于 2014-8-23 10:14
感谢chenall 、不点 两位大师的指点。
目前,有无直接将grub4dos启动代码写入gpt分区硬盘的工具,都不会 ...


这个应该比较简单,我之前给天涯海角也写过一段代码,从硬盘某个位置加载一定数量连续扇区的数据到内存某个位置,然后跳过去执行。
现在看来,这个代码还可以进行优化和通用化,就从硬盘某个位置加载一定数量的扇区数据到内存某个位置,然后跳转运行,这些参数可以由用户定制,从而启动 GRLDR,NTLDR,BOOTMGR 等等。这个引导程序必须小于 440 字节,有兴趣的朋友可以去实现它,但是目前看来,似乎 UEFI 才是方向
作者: chenall    时间: 2014-8-23 10:30
Pauly 发表于 2014-8-23 10:26
这个应该比较简单,我之前给天涯海角也写过一段代码,从硬盘某个位置加载一定数量连续扇区的数据到内存 ...

嗯,太概就是这样的,谁去写一个呀,

其实就是类似于grub原版的grub_install功能.
作者: qj_tzy    时间: 2014-8-26 17:55
chenall 发表于 2014-8-22 10:54
再次完善了一下,新的隐藏会顺便加上OEM属性,也就是不能手动分配盘符.

另外parttype作用在GPT分区上时, ...

您在http://grub4dos.chenall.net/发布的grub4dos-0.4.5c-2014-08-22.7z,具有支持gpt分区隐藏、显现等功能,为我解决了大问题,我非常喜欢,感谢您的不断付出!

只是我想确认一下,这个版本是否支持含有碎片的文件仿真?我简单测试了一下,好像支持不好,我非常希望您能在该版本基础上完善一下这个方面的功能,谢谢!
作者: jianliulin    时间: 2014-8-26 18:29
qj_tzy 发表于 2014-8-26 17:55
您在http://grub4dos.chenall.net/发布的grub4dos-0.4.5c-2014-08-22.7z,具有支持gpt分区隐藏、显现等功 ...

我已经在另外一个帖子反馈了map含碎片文件的问题,没有引起重视,我那个文件是9块碎片,grldr之前是可以map超过含9块碎片的文件的。
作者: chenall    时间: 2014-8-26 19:09
0.4.5c从来就不支持碎片文件仿真的吧。请注意版本号。
0.4.6a 才有支持碎片
作者: qj_tzy    时间: 2014-8-26 21:40
chenall 发表于 2014-8-26 19:09
0.4.5c从来就不支持碎片文件仿真的吧。请注意版本号。
0.4.6a 才有支持碎片

谢谢答复,我明白了

那我想问一下,您在http://grub4dos.chenall.net/发布的grub4dos-0.4.6a-2014-08-19.7z版本是否已完善gpt分区的隐藏/显现功能,若已完善,那我需要的gpt分区隐藏/显现、碎片文件仿真这两方面的功能都有了。
作者: chenall    时间: 2014-8-28 17:53
不点 发表于 2014-8-23 09:37
我已经不适合再去学新知识了。我会在别的方面去学新知识,比如,数学啊,物理啊,历史啊,哲学啊,政治啊, ...

尝试编译了一个支持 GPT 分区的WEE,
修改了list_partitions的代码.尽量使用我自己了解的语句去写的.

测试发现可以正常访问GPT分区,但是有时候却不行,不知是什么原因.

测试,我是使用QEMU测试的,进入wee之后立即按C进入命令行,用find查找分区,可以正常使用.

然后直接输入一个root命令,不带任何参数,然后就会出现问题具体表现为最后一个分区不可用,使用hexdump查看了一下,发现这个分区的分区号变成了0XFFFF.

麻烦不点有空看看,是不是我写的代码哪里有问题.只修改了asm.s里面list_partition函数里面的标号9后面的代码.增加了对GPT分区的简单识别.

wee-2014-08-28.zip

223.49 KB, 下载次数: 5, 下载积分: 无忧币 -2


作者: 不点    时间: 2014-8-28 22:35
我只看到修改了的 asm.S 文件,看不到 diff 文件,所以也不能进行分析。我这里访问 google code 很难,似乎无法访问。

我觉得,不一定需要 WEE。

Wee 的硬件兼容性比 grub4dos 差很远。这些年,我们一直在更新 grub4dos,但没有更新 wee。原因是,有很多更新是以 C 语言的方式来更新的,而 wee 的大部分已经变成汇编了,所以,没有同步更新。

如果可用空间比较富裕,你最好直接改造 grldr,把它放在 GPT 的保留空间里(就像 MBR 磁道的 63 扇区那样的保留空间)。grldr 里面有很多 Linux 的文件系统驱动,其实都没什么用,可以删除,节约空间。PXE、ud 等,都可以删除。如果可用空间很多,那就不必精简了,直接将改造后的 grldr 嵌入 GPT 的保留空间里。


作者: qj_tzy    时间: 2014-8-28 23:51
chenall 发表于 2014-8-28 17:53
尝试编译了一个支持 GPT 分区的WEE,
修改了list_partitions的代码.尽量使用我自己了解的语句去写的.


看到您发布的支持gpt分区的WEE测试版,及您与 不点 大师 的对话,感觉安装在gpt分区中的wee 或 grldr,经您们的努力,将会在不久的将来推出。

我的办公电脑使用的小于2TG的单硬盘,已经被我转换为GPT分区,我是用xorboot+grub4dos启动安装的各个windows系统的。所以,以上新东西的推出,我感到由衷的高兴!
作者: chenall    时间: 2014-8-29 08:17
不点 发表于 2014-8-28 22:35
我只看到修改了的 asm.S 文件,看不到 diff 文件,所以也不能进行分析。我这里访问 google code 很难,似乎 ...

diff文件

Index: asm.S
===================================================================
--- asm.S        (revision 115)
+++ asm.S        (working copy)
@@ -10135,7 +10135,61 @@
        movl        %edi, %ebx
9:

-        /* Read the MBR, or the boot sector of the extended partition.  */
+        movl        -16(%ebx), %eax
+        addl        -4(%ebx), %eax
+        call        101f
+        testl        %eax, %eax
+        jz        9f                        # return with failure
+
+        /* Check if it is valid.  */
+        movl        $(PART_TABLE_TMPBUF+446), %esi
+        cmpw        $0xAA55, 64(%esi)
+        jne        9f
+
+        cmpl        $0xff, ABS(EXT_C(current_slice))
+        je        100f
+        movl        $0xFF, ABS(EXT_C(current_slice))
+        cmpb        $0xee, 4(%esi)
+        jne        100f
+        movl        $1,%eax
+        call        101f
+        testl        %eax, %eax
+        jz        9f
+        movl        $PART_TABLE_TMPBUF,%esi
+        cmpl        $0x20494645,(%esi)
+        jne        9f
+        movl        72(%esi),%eax
+        movl        %eax,PART_TABLE_BUF + 0xC
+110:
+        movl        PART_TABLE_BUF + 0xC,%eax
+        incl        PART_TABLE_BUF + 0xC
+        call        101f
+        testl        %eax, %eax
+        jz        9f
+        movl        $PART_TABLE_TMPBUF,%esi
+        movl        $4,%ecx
+111:
+        movl        32(%esi),%eax
+        testl        %eax,%eax
+        jz 9f
+        stosl
+        subl        %eax,40(%esi)
+        movl        40(%esi),%eax
+        stosl
+        xorb        %al,%al
+        stosb
+        movb        $0xee,%al
+        stosb
+        incb        -4(%ebp)
+        movl        -4(%ebp), %eax
+        stosw
+        xorl        %eax,%eax
+        stosl
+        addl        $0x80,%esi
+        loop 111b
+        jmp 110b
+
+101:
        pushl        $0xedde0d90                # read
        pushl        $0                        # buf_hi
        pushl        $(PART_TABLE_TMPBUF)
@@ -10143,20 +10197,12 @@
        pushl        $(SECTOR_SIZE)
        pushl        $0                                # byte_offset
        pushl        $0                                # sector_hi
-        /* calculate the start sector number for read */
-        movl        -16(%ebx), %eax
-        addl        -4(%ebx), %eax
        pushl        %eax                                # sector
        pushl        ABS(EXT_C(current_drive))
        call        EXT_C(rawread)
        addl        $36, %esp
-        testl        %eax, %eax
-        jz        9f                        # return with failure
-
-        /* Check if it is valid.  */
-        movl        $(PART_TABLE_TMPBUF+446), %esi
-        cmpw        $0xAA55, 64(%esi)
-        jne        9f
+        ret
+100:
        pushl        %esi
        call        98f
        popl        %esi


首先尝试WEE,是因为我对比了一下,感觉WEE修改会简单一些,另外,GPT硬盘总是以LBA方式访问的,刚好WEE也符合这一条件.

还有GRLDR如果修改的话,不知道前16扇区还有没有空间加GPT分区代码.

wee_diff.zip

842 Bytes, 下载次数: 0, 下载积分: 无忧币 -2


作者: 不点    时间: 2014-8-29 09:06
我也刚刚搜到一点 GPT 知识,发现 GPT 没有保留空间用于 BIOS 引导代码。因此,原则上讲,这个办法是行不通的,不具有一般性。

假如你能确定在微软的分区格式里面总是能够找到某个足够大的空闲空间可以利用,那你就有办法了。直接把 grldr 嵌入里面,然后在 MBR 第一扇区写一段汇编语言代码(可参照 wee 的第一扇区代码来写),加载这个 grldr 的扇区序列便可。grldr 本身不需要做任何改动。

因此,关键的关键是找到某个空闲的扇区序列,用来嵌入 grldr。如果有就容易、就小菜一碟;如果没有就没门、就不可能实现。


作者: qj_tzy    时间: 2014-8-29 09:25
不点 发表于 2014-8-29 09:06
我也刚刚搜到一点 GPT 知识,发现 GPT 没有保留空间用于 BIOS 引导代码。因此,原则上讲,这个办法是行不通 ...


对将grub4dos写入gpt的空闲空间,我不懂,是外行。但我想,能否把grldr的头(512b)写入gpt分区硬盘的0扇区,其余部分存放在esp分区的根目录或某指定目录下,启动时,由其在0扇区的头部来读取存放在esp分区中的其余部分来实现启动。我只是在想象,对此提个建议,不知可否。
作者: chenall    时间: 2014-8-29 10:32
不点 发表于 2014-8-29 09:06
我也刚刚搜到一点 GPT 知识,发现 GPT 没有保留空间用于 BIOS 引导代码。因此,原则上讲,这个办法是行不通 ...

实在不行的话只能考虑本贴#25的方案.
http://bbs.wuyou.net/forum.php?m ... 66&fromuid=1025

其实GPT可用空是还是很多的,
1.分区间隙(一般情况下每个分区之前会有1MB左右的无用空间)
2.MS保留分区.

当然了以上空间的位置都是不固定的,所以目前也只能考虑#25的方案

写一个通用型的MBR引导代码,让它来引导指定扇区指定长度的代码.

另外如果不对GRLDR进行修改的话,虽然目前GRUB4DOS内部可以支持GPT分区,但是如果用NTLDR/BOOTMGR方式启动的话就会找不到GRLDR了.


作者: 不点    时间: 2014-8-29 13:36
chenall 发表于 2014-8-29 10:32
实在不行的话只能考虑本贴#25的方案.
http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid ...

我给你发的短消息,收到了吗?


作者: chenall    时间: 2014-8-29 14:09
不点 发表于 2014-8-29 13:36
我给你发的短消息,收到了吗?

已收到,

现在如果用WEE的MBR进行修改的话倒是很简单,只需要修改一两个地方就可以用这个MBR来加载GRLDR(在QEMU中测试通过)

只是WEE的MBR是只能使用LBA模式的,完美一点需要修改一下让它可以自动检测使用CHS/LBA模式.

剩下的就是安装程序要考虑的问题了..

安装程序需要获取可用空间位置,并且GRLDR整个嵌入.

我的打算是写一个MBR代码..用来加载指定位置,长度的代码.

为了保险起见,
1.该MBR需要可以使用CHS或LBA模式访问以上位置.
2.允许指定两个或以上的代码位置,在MBR程序中通过简单的校验判断该位置的代码是否正常,正常的请就直接引导,否则换一个.




作者: 不点    时间: 2014-8-29 14:46
如果运行于硬盘,并且是 GPT,那就不需要 CHS 了,因为 LBA 是肯定要支持的。

以后如果遇到封杀 LBA 的情况,再研究 CHS 模式也不迟。那时可以另外编译一个 CHS 模式的版本。

你首先研究一下空闲空间的特征,看看它的起始扇区有没有什么规律,以便 MBR 代码可以加载它。

比如说,假如起始扇区都是以 MB 来对齐的,那么挨个搜索就可以很快找到 GRLDR 了。总之,你需要找规律。


作者: xiaoy    时间: 2014-8-29 23:53
Gpt比mbr的可利用扇区多很多吧 现在分区都4k对齐  论坛上有对gpt结构非常了解的朋友
作者: qj_tzy    时间: 2014-8-30 13:08
chenall 发表于 2014-8-22 10:54
再次完善了一下,新的隐藏会顺便加上OEM属性,也就是不能手动分配盘符.

另外parttype作用在GPT分区上时, ...

若您能在百忙之中对 grub4dos-0.4.6a-2014-08-19版 支持gpt分区 的隐藏 等功能完善后发布,就非常感谢了,因我非常需要 同时支持gpt分区功能和含碎片文件仿真功能的grub4dos。
作者: chenall    时间: 2014-8-31 15:37
grub4dos 0.4.6a分支代码已经同步更新


另外写了一段MBR代码,用于将来的GPT磁盘MBR引导GRLDR.

注: 这个代码直接写入到硬盘MBR上目前并不能直接启动,会显示错误提示.

MBR 的0x10-0x4F 是给安装程序使用的,用于写入要引导的代码位置(偷懒直接使用INT13扩展的DAP包),可以写入4个记录.一个不行可以跳到下一个.

struct DiskAddressPacket
 {
    BYTE PacketSize;  // 数据包尺寸(16字节)
    BYTE Reserved;   // ==0
    WORD BlockCount;  // 要传输的数据块个数(以扇区为单位)
    DWORD BufferAddr;  // 传输缓冲地址(segment:offset)
    QWORD BlockNum;   // 磁盘起始绝对块地址
};

DAP的前两个字节是对应的引导程序校验码(只检验第一个扇区)

一个例子:
C763 2B02 0000E007 22000000 00000000

C763 是 GRLDR第一个扇区的校验码(具体校验方法在参考源码), 2B02 就是0X22B 代表GRLDR文件占用的扇区数,,0000E007,,加载启动位置07E0:0000,22000000 00000000,GRLDR文件在磁盘中的起始扇区

对汇编比较熟的朋友,麻烦看一下代码有没有什么问题,没有问题的话需要再写一个安装程序(我只会写GRUB4DOS环境下的安装程序)

weembr.zip

3.19 KB, 下载次数: 4, 下载积分: 无忧币 -2


作者: qj_tzy    时间: 2014-8-31 16:15
chenall 发表于 2014-8-31 15:37
grub4dos 0.4.6a分支代码已经同步更新

谢谢,您说的grub4dos 0.4.6a更新在哪下载,在http://grub4dos.chenall.net/上没有。
作者: qj_tzy    时间: 2014-8-31 16:45
chenall 发表于 2014-8-31 15:37
grub4dos 0.4.6a分支代码已经同步更新

grub4dos 0.4.6a分支代码同步更新-2014-8-31已下载,谢谢!


作者: 不点    时间: 2014-8-31 17:14
chenall 发表于 2014-8-31 15:37
grub4dos 0.4.6a分支代码已经同步更新

我没看代码。但从你描述的设计思路,我觉得有毛病。

以下是我的思路。

上上之策,是设计一个不变的 MBR,它能搜索到满足一定条件的扇区序列,然后加载执行它。

这需要了解要加载的扇区序列的特点,比如说,起始扇区号都为 2 的 n 次方,并且限定扇区序列符合 grldr 格式,这样,只要挨个搜索起始扇区序号为 2 的 n 次方的扇区序列,便可找到 GRLDR 了。

再比如说,虽然安装时不能保证一定安装到 2 的 n 次方处,但能够保证安装到磁盘开头的 2M 以内,这样,搜索的时候,可以逐个搜索所有位于 2M 以内的扇区(从而找到 grldr 的扇区序列)。搜索 2M 的速度是很快的。

如果实在没有什么规律,那就只好记录安装位置了。此时只需要一个位置便可,不需要 4 个。

所以,首要的是研究可用空闲空间的特点。只要发现了规律,那么写代码是很简单的一件事。

因此我的看法是,你先不要忙着写代码。先看看可用的空间都位于何处?有没有规律可循?


作者: chenall    时间: 2014-8-31 17:42
不点 发表于 2014-8-31 17:14
我没看代码。但从你描述的设计思路,我觉得有毛病。

以下是我的思路。

不同的分区软件有不同的结果,除非是人为控制,否则看起来没有什么规律.

另外要说相对安全一点儿空间就是MSR和ESP分区空间了.可以放在空间尾部,

但是这两个分区也是不一定会存在的.

固定位置的唯一的缺点就是文件不能移动或修改,改了就不能用了.
所以我上面预留了4个位置,基本上可以保证启动起来.
作者: 不点    时间: 2014-8-31 18:42
chenall 发表于 2014-8-31 17:42
不同的分区软件有不同的结果,除非是人为控制,否则看起来没有什么规律.

另外要说相对安全一点儿空间就 ...

再前进一步,深入思考一下:假如不存在 MSR 和 ESP 分区,你有什么办法吗?

你这 4 个位置究竟在哪里?就是说,哪里有这些空闲的空间可以被你利用?

还有一个问题:你怎么保证,“起始扇区校验通过,但后续扇区被破坏” 的情况永不发生?一旦发生,必然死机。

我认为,最好是赖上微软,就是,死皮赖脸地赖上微软,假定它总是有 MSR 和 ESP 分区,这样就可以找到空闲的空间了。如果没有这样的分区,就拒绝安装。


还有一个方案,就是干脆写个 .efi,取代微软的 .efi。这个 .efi 会搜索 grldr,如果找到,就启动 grldr,如果找不到,就启动微软原来的 .efi。


作者: 2011yaya2007777    时间: 2014-8-31 20:53
我准备在 grldr 头部(也就是 grldr.mbr)增加自举代码,启动 gpt 分区。 这样可由 ntldr 或 bootmgr 加载 grldr。

我看到目前 grldr 只支持 4 字节的 gpt 分区起始逻辑扇区,是否应当支持 8 字节?
作者: xiaoy    时间: 2014-8-31 22:17
整个.efi就前途无量    绝大多数分区都会有2m空间 , 这是主流
作者: chenall    时间: 2014-9-1 08:33
不点 发表于 2014-8-31 18:42
再前进一步,深入思考一下:假如不存在 MSR 和 ESP 分区,你有什么办法吗?

你这 4 个位置究竟在哪里 ...

用.efi就不是BIOS模式了就不能用GRUB4DOS了.

找空间的话其实让安装程序来完成,应该不难,首先上用户指定一个或多个启动文件,首先把这些文件的位置信息记录下来,再顺便找一下看看有没有没有用到的空间,有的话就复制一份过去并在MBR上记录相应位置作为备用.

至于"起始扇区校验通过,但后续扇区被破坏”,是有这个可能,但是除非是病毒或人为的,一般情况下很少碰到.但是碰到这个情况也不是没有办法启动,

有4个位置,如果4个位置都有记录的话,第一个坏了,下次启动时可以使用其它记录来启动
作者: 2011yaya2007777    时间: 2014-9-1 15:55
是否可以由 MBR 的引导代码查找 grldr.mbr ,然后由它加载 grldr,进而从菜单启动程序。grldr.mbr 只有 8Kb,看看放在哪里合适,grldr 则可放在任意分区。
作者: chenall    时间: 2014-9-1 16:25
本帖最后由 chenall 于 2014-9-1 16:27 编辑
2011yaya2007777 发表于 2014-9-1 15:55
是否可以由 MBR 的引导代码查找 grldr.mbr ,然后由它加载 grldr,进而从菜单启动程序。grldr.mbr 只有 8Kb ...


GPT的MBR只有一个扇区的

用GRLDR.MBR的话放不下,即然放下了,还是一样要通过MBR来定位这个GRLDR.MBR.再让GRLDR.MBR定位GRLDR.这样一来反而更麻烦.


我目前使用前面的那个MBR代码引导GRLDR成功,并且由于有设定了多个位置,测试的时候我使用了3个GRLDR位置,首先第一个是在分区里面可见的,另一个是放在分区间隙,还有一个放在其它分区.

第一次启动正常,删除第一个分区里面的GRLDR,启动时会有提示,按键后自动引导第二个GRLDR.


作者: 2011yaya2007777    时间: 2014-9-1 16:57
如果 grldr 不连续会有问题。
是否可以由 MBR 启动 ESP,在 ESP 安装 grldr 启动代码?
作者: 不点    时间: 2014-9-1 18:10
2011yaya2007777 发表于 2014-9-1 16:57
如果 grldr 不连续会有问题。
是否可以由 MBR 启动 ESP,在 ESP 安装 grldr 启动代码?

这是一个新思路,值得尝试。从 MBR 引导 ESP 的引导扇区,而由 ESP 的引导扇区继续引导 GRLDR,这样也不错。赞一个。
作者: 不点    时间: 2014-9-1 18:15
chenall 发表于 2014-9-1 16:25
GPT的MBR只有一个扇区的

用GRLDR.MBR的话放不下,即然放下了,还是一样要通过MBR来定位这个GRLDR.MBR. ...

你做的这个工作同样也很棒。我也很赞成。一步一步前进吧。我帮不上大忙了,但我会继续支持和关注。
作者: 2011yaya2007777    时间: 2014-9-8 21:07
由于gpt的分区表安全性比较高,所以修改的话会比较麻烦,并且需要读取所有分区表重新计算对应CRC(需要读取至少66个扇区太概32KB数据),还要计算4个CRC值,
DAP的前两个字节是对应的引导程序校验码(只检验第一个扇区)

请教chenall,我只知道 gpt 分区表头有 2 个 CRC,应当与备份里的 CRC 是相同的吧?
在 MBR 里增加引导代码,需要 CRC 吗?在哪个字节体现?
在某处放置 grldr.mbr,是否也需要 CRC?
作者: chenall    时间: 2014-9-9 12:13
2011yaya2007777 发表于 2014-9-8 21:07
请教chenall,我只知道 gpt 分区表头有 2 个 CRC,应当与备份里的 CRC 是相同的吧?
在 MBR 里增加引 ...

2个CRC,第一个CRC与备份的是不一样的.

第二个CRC是分区表的CRC,所以和备份的是一样的

只要没有改动到分区表的内容不需要重新计算CRC(分区表内容一般是第2个扇区开始总共32个扇区)这些扇区里面不可以放其它东西.


作者: duwei0619    时间: 2014-10-10 22:20
进来学习了,谢谢提供!




欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/) Powered by Discuz! X3.3