无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: 2011yaya2007777
打印 上一主题 下一主题

支持含有碎片的文件仿真

    [复制链接]
91#
发表于 2014-12-27 10:33:21 | 显示全部楼层
本帖最后由 chenall 于 2014-12-27 10:38 编辑
mdyblog 发表于 2014-12-27 10:25
1:瞬间完成,牛!


因为改变了blocklist的计算方法,理论上是没有什么问题,需要多多测试而已

这个不只是针对(hd0)xx+y的,而是针对所有类型文件的,包括(hd0,1)/100G.VHD这种情况.

测试的话主要是看blocklist命令返回的信息和旧版的是否一致.一样的话就没有什么问题了.

我自己测试了一下都是一样的.

可以用blocklist命令对比一下新旧版本,看有没有什么区别.

点评

》》因为改变了blocklist的计算方法,理论上是没有什么问题,需要多多测试而已 哦。 不是原理上的漏洞,那就好。——不是"明知有问题,装作没看见。" 即使有问题,那也只能算作BUG——慢慢改吧。 --------- 这  详情 回复 发表于 2014-12-27 11:01
回复

使用道具 举报

92#
发表于 2014-12-27 11:04:01 | 显示全部楼层
没什么问题的话就是差不多这样子了

点评

网上版本1227,正常,瞬间,如图: [attachimg]205589[/attachimg]  详情 回复 发表于 2014-12-28 08:20
回复

使用道具 举报

93#
发表于 2014-12-28 10:45:01 | 显示全部楼层
这个版本和前面的代码是一样的,没有修改..

0.4.5c的暂时还没有修改,0.4.5c只影响blocklist命令,map命令影响不是很大,以后再看情况打是否要打这个补丁进去.
回复

使用道具 举报

94#
发表于 2014-12-31 09:33:52 | 显示全部楼层
目前0.4.6a最新版的,blocklist就是基于底层,和文件系统无关,
但是实际上,所有的文件系统都是通过这个底层来读取文件内容的,所以变相的就相当于一劳永逸的解决了这个问题.
大家可以测试一下,不管任何文件系统,使用0.4.6a总是可以很快速地得到分件分配表.

另外我最近比较忙,估计一个星期之后才过再过来看看.


回复

使用道具 举报

95#
发表于 2015-1-8 15:15:26 | 显示全部楼层
@2011niumao
早就应该这样做了,呵呵,从图片上就可以的看到问题的原因..我稍后修正上传一个测试版你再试试看.


回复

使用道具 举报

96#
发表于 2015-1-8 15:37:42 | 显示全部楼层
附件修正了2011niumao报告的问题,,并且已经打上前面yaya提到过的BUG补丁.

grub4dos-0.4.6a-2015-01-08.7z

270.56 KB, 下载次数: 17

点评

测试很成功.几个vhd LINUX系统都能很快,map方式启动.非常感谢.  详情 回复 发表于 2015-1-8 16:12
回复

使用道具 举报

97#
发表于 2015-1-8 16:51:49 | 显示全部楼层
2011yaya2007777 发表于 2015-1-8 16:29
扇区数少计了?按说也没有超过 4 字节呀。

请教 chenall ,这里是否需要修改:

这个GRUB_LISTBLK标志只有grub4dos内部使用,不必考虑外部命令

这一段代码是为了兼容以前旧版函数的(主要是旧版的外部命令).不必修改.
回复

使用道具 举报

98#
发表于 2015-1-8 16:59:27 | 显示全部楼层
2011yaya2007777 发表于 2015-1-8 16:29
扇区数少了 0x800000 的倍数。按说也没有超过 4 字节呀。

请教 chenall ,这里是否需要修改:

新的blocklist会根据length长度计算扇区数.之前length是unsigned long的,超过4G的话就会出错
回复

使用道具 举报

99#
发表于 2015-1-9 11:10:49 | 显示全部楼层
本帖最后由 chenall 于 2015-1-9 11:12 编辑
mdyblog 发表于 2015-1-9 10:59
报告一个现象。
新版 运行F6IMG卡死。
如图: (最后面是光标闪烁)


请先测试一下
grub4dos-0.4.5c-2014-12-17
看看这个版本有没有问题.

另外也测试一下附件最新版本的.

grub4dos-0.4.6a-2015-01-09.7z

269.46 KB, 下载次数: 12

点评

>>> grub4dos-0.4.6a-2015-01-09.7z 对不起,没注意到这个。 --- 测试了,和1225卡死的一样。 也是卡在前面红色的那行。  详情 回复 发表于 2015-1-9 15:20
grub4dos-0.4.5c-2014-12-17 正常。 驱动了SATA。  详情 回复 发表于 2015-1-9 11:19
回复

使用道具 举报

100#
发表于 2015-1-9 14:24:42 | 显示全部楼层
本帖最后由 chenall 于 2015-1-9 14:25 编辑

目前看不出来哪里,卡死的话可能是有死循环,

至于24号的改动你可以试试先执行debug 0x7fffffff再执行F6IMG,看看是不是一直在读数据.

如果能够找到具体出错的命令就更好了.批处理的话用单步执行试试看.

点评

前面的给出的测试包,不大才19M,主要的数据——SRS驱动,你应该也可以测试的。 自己反复测试,能获得更多的新信息。 debug[/backcolor] 0x7fffffff效果一样,还是显示那2行(前面有图)。是内部关闭了。  详情 回复 发表于 2015-1-9 15:06
回复

使用道具 举报

101#
发表于 2015-1-9 16:43:51 | 显示全部楼层
这个debug 3的问题我下次修改一下,只要批处理进程没有退出就一直存在.

点评

发现死循环为下面红色代码: 上面替换了一行。 有加了5行,死循环检测。 这样,程序也能成功运行,提示成功,中间打印出3行,(前面2行就是前面的画面)。 但是 PE启动是蓝屏。 估计生成OEM时不正确。OEM  详情 回复 发表于 2015-1-9 18:07
狂按回车 发现死循环为下面红色代码: call :aline %1 %scsi% %aline% %1为【(1)/TEXTSETUP.OEM】 %scsi%为【roller"】 %aline%为【C】 %p%为【0x40000】 %loop%为【0】 注意%scsi% 的值有一个双引  详情 回复 发表于 2015-1-9 17:33
回复

使用道具 举报

102#
发表于 2015-1-9 18:06:56 | 显示全部楼层
新上传的版本,解决debug 3的问题.

上面的问题可以上F6IMG的作者调试跟踪一下看看,必竟作者本人对这些代码的用途比较熟悉,看看是哪里出了问题.

我需要明天才有时间查看.

点评

grub4dos-0.4.5c-2015-01-10.7z 测试还是一样的。 看不出有什么区别。  详情 回复 发表于 2015-1-10 12:13
run_line 函数优化了下,call :abc 时不占用宝贵的64K的命令行栈。 下面 红色为添加的代码。  详情 回复 发表于 2015-1-10 11:34
看了源代码, 猜测你们的意思。 cmd_buffer += (arg_len + 0x10) & -0x10; 似乎应该为: cmd_buffer += (arg_len + 0x0F) & ~0x0F; 2者的结果是不同。  详情 回复 发表于 2015-1-10 10:55
程序中有 call 循环嵌套。 call 循环嵌套, 不会 导致堆栈溢出吗?  详情 回复 发表于 2015-1-9 19:59
关于DEBUG,请问下面的脚本怎么单步调试中间的一段 以前的版本是可以轻松单步中间的代码. 还是以前一样,可是随时切换——随时开单步,随时关单步。  详情 回复 发表于 2015-1-9 18:39
回复

使用道具 举报

103#
发表于 2015-1-10 11:24:16 | 显示全部楼层
本帖最后由 chenall 于 2015-1-10 11:25 编辑

我今天测试了一下,没有发现死机(用今天上传的版本).用QEMU测试的虚拟了一个SCSI驱动.可以正常生成驱动盘.

实机因为电脑比较老,不需要SRS驱动,没有办法测试..

新上传的版本,修改了批处理调试方法

以前的debug 3功能取消了.
改成直接用debug执行的方法
比如
debug /f6img

为了方便调试允许跳过某一行(不执行),或者执行到下一个函数(CALL)开始处,具体的自己试一下就知道了,比以前的调试方便了一些.

只是不能在批处理内部开关调试功能.
回复

使用道具 举报

104#
发表于 2015-1-10 11:29:15 | 显示全部楼层
mdyblog 发表于 2015-1-10 10:57
看了最新的源码。
现在用的是一个64K的全局数组——构成一个栈cmd_buffer,来保存cmdline_buf。
这样 8 ...

记得之前有限制运行命令时使用栈空间的,超过64K之后就不执行命令的,并给出一个提示,这样就不会死机.

后来可能修改的时候改没了...没注意到,汗.
回复

使用道具 举报

105#
发表于 2015-1-10 11:32:57 | 显示全部楼层
看了代码好像也没有什么问题,看起来不像是栈空间的问题.
里面的call :aline执行完了就回收,而且使用的是goto :dyn_oem,没有嵌套调用呀.

  1. ::动态生成txtsetup.oem文件实现免按F6键
  2. :dyn_oem
  3. call Fn.13 %p% "\n" || exit
  4. call Fn.0 0 "%s" %@retval% | set aline =
  5. call :aline %1 %scsi% %aline% && set p=0
  6. goto :dyn_oem
  7. :aline
  8. if not "%~3"=="" set tmp=%~3 || exit
复制代码


可以用新版的调试一下,看看循环输出的内容是否有区别.

点评

>>可以用新版的调试一下,看看循环输出的内容是否有区别. 0109版测了。 没看出 循环输出的内容有什么区别。  详情 回复 发表于 2015-1-10 11:44
是的 :dyn_oem,没有嵌套,里面是个循环。 嵌套是 call :find_oem 嵌套了 39次 。 这个不是问题。 ------------------ 还是,从1206版本上,从头再来吧。 嵌入式的问题,一般是看不出来的,很多不是  详情 回复 发表于 2015-1-10 11:40
回复

使用道具 举报

106#
发表于 2015-1-10 11:46:39 | 显示全部楼层
估计还是和编译器还有环境有关,就像之前的那个速度很慢的问题一样.

改动本来不应该影响这些的,但是就是有问题.....


回复

使用道具 举报

107#
发表于 2015-1-10 12:02:17 | 显示全部楼层
mdyblog 发表于 2015-1-10 11:55
>>chenall:  这个是要16字节对齐  发表于 25 分钟前
应该为:
cmd_buffer += (arg_len + 0x0F) & ~ ...

~0x0f 和 -0x10是一样的

前面+0x10可以改成+0xf这样会节省一些空间,之前为了尽量保证不冲突.

用+0xf和+0x10的区别,
用0x10的话如果长度刚好是16字节对齐的话会额外占用16字节空间.用0xf就不会.

点评

是的 -0x10 = ~0xF 就是 , 有时会多占16字节。  详情 回复 发表于 2015-1-10 12:05
回复

使用道具 举报

108#
发表于 2015-1-10 12:53:17 | 显示全部楼层
mdyblog 发表于 2015-1-10 12:13
grub4dos-0.4.5c-2015-01-10.7z

测试还是一样的。

你的SATA驱动ID是多少?我看看能不能模拟测试下.

点评

抓到的信息: WHID=PCI\VEN_8086&DEV_1C03&SUBSYS_05061025&CC_010601&REV_04 SRSID=PCI\VEN_8086&DEV_1C03 srs=(2)/  详情 回复 发表于 2015-1-10 13:12
回复

使用道具 举报

109#
发表于 2015-1-10 13:48:02 | 显示全部楼层
mdyblog 发表于 2015-1-10 13:12
抓到的信息:
WHID=PCI\VEN_8086&DEV_1C03&SUBSYS_05061025&CC_010601&REV_04
SRSID=PCI\VEN_8086&DE ...

您可能没有注意看更新说明,还有前面的贴子

新版已经取消了debug 3功能.

改成直接debug了

debug /F6IMG

另外新版的刚发现一个错误,调试的时候'E'功能无效,因为之前的是用O的没改过来,下次再改了.

点评

哦, 这样啊。 发现了。 [attachimg]206636[/attachimg] 能不能加个B功能,设置断点。 +数字, 就是相对偏移行数处设断点。 数字, 就是对应行号处设断点。  详情 回复 发表于 2015-1-10 14:03
回复

使用道具 举报

110#
发表于 2015-1-10 14:10:11 | 显示全部楼层
mdyblog 发表于 2015-1-10 14:03
哦, 这样啊。
发现了。

我现在还不太清楚这个断点的用法,,你能不能给详细解释一下?

以前动态调试WINDOWS程序的时候,经常看到断点,但我不是很理解(因为我自己设置的总是无效,所以都是直接网上的代码).

点评

现对偏移可绝对行号是可以相互转换的。 假设设定的是绝对行号。 程序记住行号。 放开运行(E)时, 每次获得一行,检查当前行号是否在 断点列表中。 不是的话,直接运行。 是的话,进入交互模式, 输出调  详情 回复 发表于 2015-1-10 14:24
回复

使用道具 举报

111#
发表于 2015-1-10 14:46:41 | 显示全部楼层
本帖最后由 chenall 于 2015-1-10 14:48 编辑
mdyblog 发表于 2015-1-10 14:24
1:
》》我现在还不太清楚这个断点的用法,,你能不能给详细解释一下?


批处理运行时会预处理,先扫描一次整个批处理,然后完全在内存中运行,不是运行一行读一行的.

程序内部的行号可和批处理的行号不是对应的..(会忽略空行和注释行还有标号行都不算在内)

点评

这个自己想办法了。 比如,发现是调试模式, 不压缩空行,而是保留一个0x0a 或者其它辅助信息。  详情 回复 发表于 2015-1-10 14:52
回复

使用道具 举报

112#
发表于 2015-1-10 14:53:51 | 显示全部楼层
目前的测试结果,看起来是%p%的内存被破坏了,运行到最后,这个内存的内容是乱码,所以导致死循环出现..

发现一个小问,按Q没有终止程序运行只是退出了,看来这个调试功能还有些问题.
回复

使用道具 举报

113#
发表于 2015-1-10 15:21:39 | 显示全部楼层
本帖最后由 chenall 于 2015-1-10 15:23 编辑
mdyblog 发表于 2015-1-10 15:01
bat_run_script()中:

if ((cmd_buff = grub_malloc(arg_len + 0x800)) == NULL)


这个cmd_buff用途比较多

前面放保存文件名,中间是参数(参数可能很长,比如用ls | call :xxx之类的.)

后面的是命令缓冲区(因为命令需要处理变量等之后才能运行)..

另外这个0x800也就是限制了批处理命令每行的长度,不能超过0x800个字符(实际上会更少估计0x700左右).

这个系统堆空间就很大了,32MB以上都是.
回复

使用道具 举报

114#
发表于 2015-1-12 09:10:18 | 显示全部楼层
mdyblog 发表于 2015-1-11 20:13
请问C大, 如图的升级信息, 通过什么接口可以获得?

这个目前看起来应该是
通过这个获取的http://grub4dos.chenall.net/atom.xml

不过这个也有缺点.

我打算另外提供一个JSON格式的接口,方便你们开发在线直接升级的程序.

如果没有什么问题的话,这几天应该可以使用.我到时会给出一些介绍.
回复

使用道具 举报

115#
发表于 2015-1-12 09:11:33 | 显示全部楼层
mdyblog 发表于 2015-1-11 20:30
2014-0111测试 /F6IMG:

新的版本只是处理了debug的问题,上次的测试的电脑是别人的,他拿走了,我需要另外找一到电脑测试.

现在的版本应该比较容易定位出问题的地方.
回复

使用道具 举报

116#
发表于 2015-1-12 11:14:46 | 显示全部楼层
本帖最后由 chenall 于 2015-1-12 11:17 编辑
527104427 发表于 2015-1-12 10:51
不知道如何自己编译ipxegrldr


把ipxe的源码下载到grub4dos-src/ipxe这个目录下.
会自动编译,不过看截图你用的是应该是我的那个编译环境 ,这个不支持编译ipxe

其实也没有必要自己编译ipxegrldr的,直接使用ipxe.kpxe(之类undionly.kpxe),或ipxe.krn等加上内置菜单自动加载grldr就行了.

以下是ipxegrldr内置的ipxe菜单,如果网络正常的话总是使用最新版本的grldr.否则使用内置的,如果没有内置的就是用本地的(tftp服务器上)

  1. #!ipxe
  2. set use-cached 0
  3. dhcp
  4. imgload -a -n grldr0 -t 3000 http://b.chenall.net/grldr || goto embed
  5. imgfree grldr
  6. boot grldr0 || goto failed

  7. :embed
  8. imgload grldr
  9. boot grldr || goto failed

  10. :failed
  11. echo Booting failed, dropping to shell

  12. :shell
  13. shell
  14. goto shell
复制代码
回复

使用道具 举报

117#
发表于 2015-1-12 15:38:48 | 显示全部楼层
本帖最后由 chenall 于 2015-1-12 15:45 编辑

根跟我的调试结果来看,应该是循环嵌套太多层导致的,看来有必要限制一下循环嵌套的层数.

另外发现F6IMG里面有许多不必要的循环.有必要优化一下.

就是不知一层需要多少的堆栈空间?这个有没有什么办法计算.比如调用某个函数需要多少堆栈空间,这个能计算出来吗?

好像和应该函数里面的变量和参数有关系?有没有什么保守的计算方法.这样就可以太概估计一下可以几层而不出问题.
回复

使用道具 举报

118#
发表于 2015-1-12 16:57:17 | 显示全部楼层
mdyblog 发表于 2015-1-12 16:06
>>根跟我的调试结果来看,应该是循环嵌套太多层导致的,看来有必要限制一下循环嵌套的层数.

另外发现F ...
还有,作为验证,  把系统栈扩大到1M。  100次嵌套, 应该不会溢出的。

是指cmd_buffer吗?这个我测试过了用了还不到一半只用了4KB左右.
回复

使用道具 举报

119#
发表于 2015-1-12 17:01:12 | 显示全部楼层
mdyblog 发表于 2015-1-12 16:14
>>另外发现F6IMG里面有许多不必要的循环.有必要优化一下.

这件事 很麻烦的。

这个估计和个人习惯也有关系..

我自己写的代码,我会尽量优化(在时间能力允许的条件下),就当是学习.

刚开始写出来的可能就是勉强能用,以后经过一次一次改进优化.

现在如果限制一下嵌套层数那F6IMG估计就不能正常运行了.
回复

使用道具 举报

120#
发表于 2015-1-12 22:30:08 | 显示全部楼层
mdyblog 发表于 2015-1-12 18:24
是现在的版本, 比1206版, 堆栈(系统堆栈和命令行堆栈(cmd_buffer))更少了吗?

如果不是, 那 ...


对应的改动在这里没有修改cmd_buffer等相关代码.

https://github.com/chenall/grub4 ... f1f9385c42df5fd2f2a

看起来和上次的问题是一样,又是莫名其妙的.出现的问题和修改的代码是毫无关系的.

现在的F6IMG,只要再增加一个判断语句防止重复的空循环就可以跳过这个BUG.(我用debug测试到后面跳过部份代码行就提示成功,但能不能用没有测试)
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-6-14 07:54

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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