无忧启动论坛

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

支持含有碎片的文件仿真

    [复制链接]
1#
发表于 2014-4-9 10:27:14 | 显示全部楼层
为什么 USB --init
后,我的U盘由(hd0) 变为(fd0) ???????
回复

使用道具 举报

2#
发表于 2014-4-10 13:15:47 | 显示全部楼层
本帖最后由 mdyblog 于 2014-4-10 13:17 编辑
2011yaya2007777 发表于 2014-4-9 20:21
U盘是(hd0),没有分区表,识别为硬盘问题多多,故意为之。这是特色。


我测试的这个恰好有分区表。
USB 前 可以  ls  (hd0,0)/
USB 后 可以  ls  (fd0,0)/
我测试,有没有分区, 都是(hd0)变成(fd0)


1: 这样 以前 可以
map --in-situ (hd0)8000+600000  (hd0)
map (hd0)  (hd1)
map --hook
现在 对应改为
map --in-situ (fd0)8000+600000  (hd0)
这条非法了, 说(fd0) 不支持 --in-situ


2: 这样 以前 可以
map --in-situ (hd0)8000+600000  (fd0)
map (fd0)  (hd1)
map --hook
但是 fd0 还是 U 盘, 甚至 分区表都在。还能  ls  (fd0,0)/, 还是原来的内容。

3:USB 加速 好象, 对PE 启动 有问题。 启动到一半, 就失败了。 (不加速是可以启动的。)



回复

使用道具 举报

3#
发表于 2014-4-11 14:05:16 | 显示全部楼层
本帖最后由 mdyblog 于 2014-4-11 19:03 编辑

2011yaya2007777 发表于 2014-4-10 14:50
把分区表贴上来。另外请说明版本。


当时高糊涂了, 那个PE的分区表可以切换。
重新测试了下,确实是没有分区表时才会 (hd0)变(fd0)
谢谢。

另外:
usb --init  (hd0)变为(fd0)后,下面的命令怎么改才能 启动 那个PE.
%ldr% 是  引导文件。
(hd0)%pe%+%ps%   处存储的是一个PE分区IMG。没有usb 是可以启动。


map --heads=255 --sectors-per-track=63  (hd0)%pe%+%ps% (fd1)
map --hook
map (fd1) (fd0)
map (fd0) (fd1)
map --hook
rootnoverify (fd0) && chainloader (fd0)%ldr%  && boot

我在线修该了几次, 不是说 什么 fd0 不支持,就是PE最开始 加载的进度条加载到一半时,死了。

当时在线敲了什么也忘了。
现在想 usb --init
后, 用上面的命令来  USB加速 启动 PE。
回复

使用道具 举报

4#
发表于 2014-4-11 23:32:36 | 显示全部楼层
本帖最后由 mdyblog 于 2014-4-12 10:15 编辑
2011yaya2007777 发表于 2014-4-10 14:50
把分区表贴上来。另外请说明版本。


今天 重新测试了,, 有分区表 还是(hd0) 转为 (fd0).
grub ver: 0.4.6a  2014-03-06


分区表:


PECMD.EXE  导出的详细分区信息 :
磁盘:1
  磁盘信息 磁盘号   大小(字节)         柱面数 磁头数 扇数 扇区 媒体     签名 总线
              1    31009800192           3770    255   63  512   12 C3072E00  7 MBR
  字符说明 激活 __本分区起始__ 分区 __本分区结束__ _______本分区______ ______本分区_______
  激活为0x80    磁头_扇区_柱面 类型 磁头_扇区_柱面 _____起始扇区号____ _____扇区总数______
  主分区1: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  主分区2: 0x00 0x7A 0x3C 0x7F 0x07 0xE3 0xA7 0xFC 0x00 0x40 0x1F 0x00 0x00 0x40 0x9C 0x00
  主分区3: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  主分区4: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  标志   : 0x55 0xAA
  全部分区: -1  1   -3  -4
  分区  类型 激活(1) 起始(字节)     长度(字节)    隐藏扇区     结尾(字节) 物理# 盘符
    -1  0x00   0              0              0           0              0    1   
     1  0x07   0     1048576000     5242880000     2048000     6291456000    2  F:
    -3  0x00   0              0              0           0              0    3   
    -4  0x00   0              0              0           0              0    4   
DiskGinus 分区表备份, MBR备份见附件。

U盘分区.MBR.zip

20.13 KB, 下载次数: 1

回复

使用道具 举报

5#
发表于 2014-4-11 23:36:38 | 显示全部楼层
不点 发表于 2014-4-11 20:36
map --in-situ 参数的意思是仅仅虚拟分区表,不虚拟数据扇区。所以,如果没有分区表,那就不能进行虚拟。
...

那里 是一个 分区IMG, 就缺一个 分区表, 就是 硬盘了。
需要方便的 模拟一个硬盘分区   (hd0,0)。

支持 98 因该就可以了。
启动PE, 也是实模式 模拟而已, 是WIM 启动。 调入内存后就不要这个 虚拟盘了。
回复

使用道具 举报

6#
发表于 2014-4-12 10:10:09 | 显示全部楼层
本帖最后由 mdyblog 于 2014-4-12 10:12 编辑
不点 发表于 2014-4-12 07:30
没有激活分区的分区表,也是合法分区表。不应该判定为非法分区表。


是啊!!!
windows  DIskGinus 都认啊。
只要 有最后的55AA , 且最少 有一个合法的 分区表项, 就是 合法/有 分区表啊!!

判定 "合法的 分区表项 " 应该 通过 ”分区类型字节非0“ 来判断,其它15字节不管了。

》》重建分区 partnew 指令
这个 不太友好, 就用 来启动一下, 就修改人家的分区表。 人家不设激活,有人家的道理---那只是一个数据分区。

回复

使用道具 举报

7#
发表于 2014-4-12 10:24:24 | 显示全部楼层
本帖最后由 mdyblog 于 2014-4-12 14:39 编辑

2011yaya2007777 发表于 2014-4-12 07:17
由于分区表没有激活,故判定为无分区表。你既然可以切换,没有激活,那一定是当成软盘,使用 BPB 表参数了 ...


》》我研究一下,--in-situ 如何支持软盘。
1:
这应该  本来该就不是一个 软盘吧。 只是被登记在fd下而已。
U盘 不受软盘操作的限制。

2:
另外, 能否 usb --init 命令能否加一个开关, 强制 hd还是 fd.
usb --type  typeparam  --init
如:
usb --type  %?_BOOT%  --init
usb --type  %@root%  --init
如果typeparam 以(fd 或fd开头或0-0x7F(除掉几个),(当前U盘) 就强制fd
如果typeparam 以(hd 或hd开头或0x80-0x9F, (当前U盘) 就强制hd
如果typeparam 以(cd 或cd开头或0xA0-XX, (当前U盘) 就强制cd
。。。

这样启动菜单可以前后一致。
实际上 最主要的还是用来后续启动的设备(先root, 那么就是root设备)。

3:还可以这样确定 磁盘的类型,保持不变。
记住磁盘的 签名(4字节)  和 磁盘大小等细节。
usb 2.0 驱动后,
再根据这些 信息,恢复原来的类型。


回复

使用道具 举报

8#
发表于 2014-4-14 11:37:08 | 显示全部楼层
本帖最后由 mdyblog 于 2014-4-14 11:43 编辑
2011yaya2007777 发表于 2014-4-14 10:16
这句话表述的不够严谨,应当是分区表无效。
实际是,usb 驱动要确定启动盘,并获取相应驱动器启动分区的 ...


1:
还是希望 保持原来的新式。
原来是(hd) 还是(hd)
原来是(fd)还是(fd)

要么程序自己记住。
要么提供一个开关  --type  typeparam
usb --type  typeparam  --init

2:
>>分区表没有一项激活,明显说明你是以 FD  方式启动。
这个不对啊。
启动时 还没到 分区启动, 所以 当前 是 HD还是 FD 和此无关。
比如 grub4dos装在MBR。
grub4dos启动时, 还没进分区。
grub4dos后续操作 也不需要  “分区表项激活”,  grub4dos启动分区 不看这个的。

“分区表项激活” 目前,只是 MS 的默认 MBR-CODE 用来启动分区; grub4dos不用, 一般直接菜单选择。

回复

使用道具 举报

9#
发表于 2014-4-15 22:50:56 | 显示全部楼层
本帖最后由 mdyblog 于 2014-4-15 22:52 编辑


usb --init
后 (hd0) 还是 (hd0)

不过有个奇怪的新问题,下面的代码不能工作了。
map  (%boot%)0x4100+0x400000  (fd1)
map --hook
map  (fd1)   (fd0)
map  (fd0)   (fd1)
map --hook

-------
//其中, boot  是0x8280地址返回的, 看了下正确的。0x80.
访问 (fd0) 无效。
单步试了下,
第一个 --hook 后正常,(fd1) 可访问。
在 转为 (fd0) 后,就不能访问了。
真奇怪了, 上面代码没有问题啊!!!!
回复

使用道具 举报

10#
发表于 2014-4-16 16:40:35 | 显示全部楼层
本帖最后由 mdyblog 于 2014-4-16 16:43 编辑
不点 发表于 2014-4-15 23:22
您的代码等价于如下的简化代码:

map  (%boot%)0x4100+0x400000  (fd0)


//这个没问题的。
//我这样能启动PE。
//
//原来应该没问题啊!????

看错了。 晚上回去试试。

我现在这样能启动PE。
map  (%boot%)0x4100+0x400000  (fd0)
map --hook
root (fd0) ......
回复

使用道具 举报

11#
发表于 2014-4-16 22:15:05 | 显示全部楼层
不点 发表于 2014-4-15 23:22
您的代码等价于如下的简化代码:
map  (%boot%)0x4100+0x400000  (fd0)
map  (fd0)   (fd1)
map --hook
您可以先核实一下这个简化代码是否能够工作?

测试。 可以启动。
回复

使用道具 举报

12#
发表于 2014-4-18 14:15:13 | 显示全部楼层
本帖最后由 mdyblog 于 2014-4-18 14:31 编辑
2011yaya2007777 发表于 2014-4-18 11:24
假如允许 --in-situ 对软盘进行操作,需要探测 from 及 to 驱动器有没有分区表,在具有的情况下,才能执 ...



1:
to 的 分区表 不需要 探测。
这条命令  不是模拟下有磁盘的 某个分区, 那样泰复杂了, 目前好像也没必要。
而是直接 建立一个虚拟硬盘, 伪造一个分区表,分区的 内容 就用的 制定的内容。

2:
我说的那种情况 的 --in-situ 不需要  from 探测分区表。
只有指定 (fd0,0)  这种形式 的 from 才需要。用来找到 数据源。
此种 可以转为 下面我现在用的这种情况。


我这里  数据源已经 已经是扇区序列形式了  (fd0)A+B, 不用再通过分区表找了。

综上所叙,这种情况的 难度就大大降低了。
希望先把这种情况解决。至于 (fd0,0)这种from, 再慢慢来。
回复

使用道具 举报

13#
发表于 2014-4-18 14:27:31 | 显示全部楼层
本帖最后由 mdyblog 于 2014-4-18 14:28 编辑
2011yaya2007777 发表于 2014-4-18 11:28
程序末尾有个签名,但位置容易变动,不宜从命令行获得。如果有特别理由,可以设置一个识别字节。


干脆开1K的常数区 和4K的变数区。位置固定。

1K的常数区 :放版本等系统信息。以后加。有点用的都加上。

4K的变数区: 类似变量, 但没有名字,不会被set 清空,不会被其它程序(脚本)覆盖。
                   目前由于机制原因,变量数太少。容易溢出。
  开始 4字节 保存尾指针, 和pop指针(frame pointer)。
   脚本开始 pushv或pushva(自动popv), 脚本返回 自动或手动popv.
回复

使用道具 举报

14#
发表于 2014-4-18 20:19:16 | 显示全部楼层
510819776 发表于 2014-4-18 18:20
支持了 这个好呀  不知道支持gpt不

支持GPT。

点评

有此惊喜阿???不太敢相信。不过我也用不到。无法测试。  详情 回复 发表于 2014-4-19 15:04
回复

使用道具 举报

15#
发表于 2014-4-18 23:51:12 | 显示全部楼层
本帖最后由 mdyblog 于 2014-4-18 23:57 编辑
2011yaya2007777 发表于 2014-4-18 11:13
78# 的问题已经解决。



usb 命令没了?



78#楼问题没发测。 (原来是 usb 后执行的)
回复

使用道具 举报

16#
发表于 2014-4-19 15:08:53 | 显示全部楼层
本帖最后由 mdyblog 于 2014-4-19 15:12 编辑
2011niumao 发表于 2014-4-19 15:04
有此惊喜阿???不太敢相信。不过我也用不到。无法测试。


用 MBROS (UDv2) ,再选用  grldr 为 BIOS启动器, 即可。

测试很容易: 那个U盘,用DiskGinus 删除所有分区,转为GPT。
再用  MBROS (UDv2) 格式化, 拷入 grldr, 编辑menu.lst
        

点评

谢谢.有机会测试看看.  发表于 2014-4-19 16:05
回复

使用道具 举报

17#
发表于 2014-4-26 12:54:30 | 显示全部楼层
本帖最后由 mdyblog 于 2014-4-26 13:04 编辑
2011yaya2007777 发表于 2014-4-21 20:44
确实是出了问题。因为移动了usb驱动在函数列表的位置。已经修正与 1#。


新版有个问题:

    partnew --active (hd0,3) 0x07 (hd0,9)/P.IMG        
失败。

换回旧版 正常。   


回复

使用道具 举报

18#
发表于 2014-5-2 12:48:51 | 显示全部楼层
2011yaya2007777 发表于 2014-5-2 06:54
交换一下驱动器:
map (hd0) (hd)
map (0) (hd0)

>>map (hd0) (hd)
>>map (0) (hd0)

上面 没有数字的  (hd)  什么含义。
(0) 又是什么含义。
回复

使用道具 举报

19#
发表于 2014-5-2 13:48:02 | 显示全部楼层
2011yaya2007777 发表于 2014-5-1 16:10
1# 已经更新。
支持最多 32 段碎片。可以在 0PE 下正常运行了。

回复。
1)
111#      说的 partnew 问题为解决。 现象一样。


2) 替换 grldr  后 XP启动不了。(类型0x07, active)
   就是 这么简单的 菜单:
      rootnoverify  (hd0,3)
      chainloader   +1
  换回旧的旧好了。

回复

使用道具 举报

20#
发表于 2014-5-3 11:05:57 | 显示全部楼层
2011yaya2007777 发表于 2014-5-2 17:23
有一处失误,已经修正于 1#。
请 mdyblog  测试。

partnew  还没好。
回复

使用道具 举报

21#
发表于 2014-5-7 18:25:00 | 显示全部楼层

partnew  好了。 谢谢。
回复

使用道具 举报

22#
发表于 2014-6-22 18:52:07 | 显示全部楼层
fukystone 发表于 2014-6-17 09:46
没有明白“特意让它显示”是什么意思?
既然已经设置了“UD”这种模式,那么再显示“HD0”或者“fd0” ...


(hd0)  (fd0) 才是设备本身, BIOS给它的名字。和g4d无关。
(ud) 只是g4d给他的一个别名,为了方便找到(ud)虚拟分区,本来可能是(fd0)或(hd0),现统一为(ud)。

(hd0)  (fd0)   比 (ud)更通用,更原始。(hd0)  (fd0) 始终在对应硬件;(ud)必须软件根式化为ud才有,对软物件用途。
回复

使用道具 举报

23#
发表于 2014-7-26 17:42:29 | 显示全部楼层
本帖最后由 mdyblog 于 2014-7-26 18:48 编辑

我写了一段Loader 调入 G4D的 grldr 并运行。我是从16扇区(前面跳过16扇区)开始读取grldr 到内存0820:0000并运行。
grldr版本是 0.4.5c 2013-0117

本来是CHS方式 -INT13-AH2读取, 很正常。

现在改成LBA方式-INT13-AH42读取,数据都正确读到内存了。但是有个问题。
如果随便个地方 “CHS方式 -INT13-AH2读取”1 扇区到没用的内存, grldr就能正常运行启动, 找到(hd0)上的文件并出菜单。
  1. //FIXME 否则Grub4DOS不认根设备
  2.         xor        %ebx, %ebx        /* %bx = 0, put it at 0 in the segment */
  3.         movw        %bx, %es        /* load %es segment with disk buffer */
  4.         mov         $0x7A00, %ebx
  5.         movb    $0, %dh   //head
  6.         movw    $(1*0x100+0x01), %cx   //ch=cyl cl=sec
  7.         movw        $0x0201, %ax        /* function 2 */
  8.         int        $0x13  //这句不能省
复制代码

放在LBA读取前,后均可
否则,grldr启动后root为(fd0)以至找不到(hd0)上的文件。

int        $0x13 这句还不能省。

这是为什么啊?问题在哪儿?怎么去掉这几行,直接初始话对应寄存器。


启动设备我是通过 %dl 寄存器传下去的。测试为0x80.
                 %dh 寄存器是分区号,测试为0xff.


LBA 读取时, 怎么传递参数,grldr 才能 正常 找到初始根设备(启动设备)。
弄了好几天,卡在这里。

2) 另外,测试了下 0.4.6a又可以。这是为什么啊?


我担心的是我的代码问题。如果只是旧版grldr 才有的问题, 而不是我代码的问题。
那就绕过去好了。换个版本。
请大神分析下,给个答复。


望大神指点!!!!





回复

使用道具 举报

24#
发表于 2014-8-11 13:21:27 | 显示全部楼层
不点 发表于 2014-7-27 07:06
另外,我看到你的代码中有:

movb    $0, %dh

//movb    $0, %dh
dh dl 的值已经备份了,
INT 13---CHS 都要 毁坏 dl 的。
最后,“执行” grldr 的之前,从 备份恢复。

//你说连盘号也弄错了,竟然成为 (fd0) 了。
是 0x80 启动的。
有调试信息。


>>你的 0000:7C00  处含有主分区的 BPB 引导扇区。grub4dos 可能就是依据这个来判断启动设备,并把它作为 “根设备” 的。

0000:7C00 出的确 有  BPB 引导扇区。 是 BIOS读到那儿的。
本代码 立即转移到别处执行。但 0000:7C00 没有擦除。

你意思是说, 要把  0000:7C00 处 擦掉, 以免 “误导”。
----我试试。

另外, 新版没有这个问题。奇怪, 是参数传递规则变简单了吗了吗?

回复

使用道具 举报

25#
发表于 2014-8-11 13:25:47 | 显示全部楼层
2011yaya2007777 发表于 2014-7-28 09:38
驱动器号及分区号是怎样实测的?
你的 (hd0,0) 是什么文件系统类型(fat16, fat32,ntfs)?分区引导 ...

(hd0,0)  如果有, 就是FAT16 或FAT32。
但不一定有分区。  就像 fbinst 一样, 还没有 分区。完全隐藏。


回复

使用道具 举报

26#
发表于 2014-8-11 13:29:13 | 显示全部楼层
不点 发表于 2014-7-28 10:52
是的,整体加载 grldr 是最省心的,免得自己还要处理很多细节。有人说,细节决定成败。细节也是令人头疼的 ...

》》你最好同时把启动分区的引导扇区(它含有 BPB 表)也放在 0000:7C00 处。这个分区应该是主分区。如果引导扇区是某个逻辑分区的,那就不要放了,因为逻辑分区不起作用。软盘的引导扇区也是可以放在 0000:7C00 处的。

没有分区时。
0000:7C00 处 512字节是不是要清0, 或446字节。
回复

使用道具 举报

27#
发表于 2014-8-11 13:50:11 | 显示全部楼层
本帖最后由 mdyblog 于 2014-8-11 13:58 编辑
不点 发表于 2014-7-27 07:06
另外,我看到你的代码中有:

movb    $0, %dh


还有一点, 我不需要 分区号。 只要磁盘号就可以。
因为是从MBR启动的,不是分区启动的, 分区号 固定为0xFF。
就说其中出错的一个启动分支流程吧:
启动后,分析启动磁盘(磁盘号1)(BIOS给的,这时还没错), 调入grldr到0x8200:0000处,执行。
启动grldr后, 再分析启动磁盘(磁盘号2)的数据,根据数据,建立虚拟磁盘。

如果   磁盘号2   错了, 就分析错误的磁盘。 从而无法进行下去。
现在是0x80变成0x00.


即使从分区启动(也可以), 也不理这个分区号(dh), 只是照样传递下去(给grldr)。

------------
奇怪, 很久一直这么做的, 直接丢掉grldr、grub.exe的引导头。
以前一直都是 CHS模式,一直没问题。
现在 才发现有不支持CHS的读卡器,才加上LBA。
测试LBA,发现这么个怪问题。
对旧版grldr(20130714) 必须 CHS方式读一下磁盘, grldr 的磁盘号才不会变错。
新版没问题。



回复

使用道具 举报

28#
发表于 2014-8-11 13:54:13 | 显示全部楼层
2011yaya2007777 发表于 2014-7-28 09:38
驱动器号及分区号是怎样实测的?
你的 (hd0,0) 是什么文件系统类型(fat16, fat32,ntfs)?分区引导 ...

》》驱动器号及分区号是怎样实测的?
就是 %dl    %dh  
不用分析。
这是BIOS 传递参数的规则。我也是这么向下 传递给 grldr, grub2, .....
再打印出来。就看见了。
回复

使用道具 举报

29#
发表于 2014-8-12 12:55:08 | 显示全部楼层
不点 发表于 2014-8-11 15:39
你这属于 “开拓、尝试、创新”。这期间会出现很多意想不到的问题。有的是自己的编程失误造成的,有的是对 ...

>>你大概想填补目前的空缺,制作一个能够适应 BIOS 和 EFI 两种环境的启动软件。
是的。 叫 MBROS.

http://bbs.wuyou.net/forum.php?mod=viewthread&tid=330493&extra=page%3D1#MBROS
BIOS 在淘汰,没有问题, 还有EFI。
只要BIOS还在用, 就要支持啊。

BIOS 只是提供一个Loader。 最终还是 grldr  ntldr bootmgr grub2 等。

回复

使用道具 举报

30#
发表于 2014-8-12 13:00:49 | 显示全部楼层
本帖最后由 mdyblog 于 2014-8-12 13:03 编辑
xyzxp 发表于 2014-8-11 18:29
USB3.0 32G UD盘 我的老机器GRUB找不到U盘后部外置文件,必须把U盘清空,先把外置文件复制进去,然后再复制 ...


超过了 BIOS访问位置。
空盘时, grldr在前面, 可以访问。 修改后,会在后面再找个空地, 在后面, 超出访问范围。
可以磁盘前面分个小分区, 放启动文件。
或用UDm格式化,  UDm 会在磁盘前面为grldr 预留一块启动空间。 BIOS总是能访问的。
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=330493&extra=page%3D1#UDm
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-13 10:09

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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