找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: 2011yaya2007777

支持含有碎片的文件仿真

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

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

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

使用道具 举报

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

这件事 很麻烦的。

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

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

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

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

点评

是现在的版本, 比1206版, 堆栈(系统堆栈和命令行堆栈(cmd_buffer))更少了吗? 如果不是, 那更大的概率, 应该不是这个原因。 强烈建议, 还是从1206版开始。 找BUG,比解决问题更难的。  详情 回复 发表于 2015-1-12 18:24
回复

使用道具 举报

发表于 2015-1-12 18:24:16 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-12 18:25 编辑
chenall 发表于 2015-1-12 17:01
这个估计和个人习惯也有关系..

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


是现在的版本, 比1206版, 堆栈(系统堆栈和命令行堆栈(cmd_buffer))更少了吗?

如果不是, 那更大的概率, 应该不是这个原因。

强烈建议, 还是从1206版开始。

找BUG,比解决问题更难的。
这其实是个很小的问题——不是什么关键问题。解决不难的。
并不涉及什么疑难杂症。

点评

对应的改动在这里没有修改cmd_buffer等相关代码. https://github.com/chenall/grub4dos/commit/f03507930d510dd9f7d1ef1f9385c42df5fd2f2a 看起来和上次的问题是一样,又是莫名其妙的. 现在的F6IMG,只要再增  详情 回复 发表于 2015-1-12 22:30
回复

使用道具 举报

发表于 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测试到后面跳过部份代码行就提示成功,但能不能用没有测试)

点评

测试结果: 1) 如果 加上死循环检测,并"exit" 那么, 之前的版本都能启动03PE-SATA。 测试了0111, 0110 1227 都会打印2行垃圾(前面帖子有图)。 只有 0111 不会显示 “Success” ------------- 2  详情 回复 发表于 2015-1-13 11:43
回复

使用道具 举报

发表于 2015-1-13 11:43:48 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-13 11:45 编辑
chenall 发表于 2015-1-12 22:30
对应的改动在这里没有修改cmd_buffer等相关代码.

https://github.com/chenall/grub4dos/commit/f035 ...


测试结果:
1)
如果 加上死循环检测,并"exit"
那么, 之前的版本都能启动03PE-SATA。
测试了0111, 0110 1227

都会打印2行垃圾(前面帖子有图)。

只有 0111 不会显示 “Success”
-------------

2)
如果 死循环检测,并"exit 1"
即返回错误码,
都不显示 “Success”
记得 1227 显示失败。


3)
加上死循环检测,并"exit"

0111 生成的 TXTSETUP.OEM 和正常(1206)版不同。
奇怪的是,竟然也能启动!
文件见附加。
0111版: err0111.zip (1.39 KB, 下载次数: 2)

1206版: OK1206.zip (276.5 KB, 下载次数: 2)

00066.png

看来还得从根本上解决啊!

点评

关键是根本的问题原因是什么???没有办法判断.前面的都只是猜测..经过调试我目前还是没有办法到找问题最终产生的原因..如果你能找得到最终的产生原因的代码那就好办了. 1.不是cmd_buffer的问题, 2,目前看起来也不  详情 回复 发表于 2015-1-13 13:51
回复

使用道具 举报

发表于 2015-1-13 13:51:08 | 显示全部楼层
mdyblog 发表于 2015-1-13 11:43
测试结果:
1)
如果 加上死循环检测,并"exit"

关键是根本的问题原因是什么???没有办法判断.前面的都只是猜测..经过调试我目前还是没有办法到找问题最终产生的原因..如果你能找得到最终的产生原因的代码那就好办了.

1.不是cmd_buffer的问题,
2,目前看起来也不像是系统堆栈的问题,因为只是循环嵌套了还不到40层,根据你前面给的测试代码可以到70层的.

另外你若是按你的建议大不了就恢复到1206版的源码,但是这样子又产生了前面的问题.

我觉得根本不是修改了代码的原因,而是有一些未知的原因,就像之前前面的问题一样.

点评

>> 另外你若是按你的建议大不了就恢复到1206版的源码,但是这样子又产生了前面的问题. --- 不是说恢复到1206了事。 而是 恢复到1206, 再以此为起点。把曾经做过的改动,再原样,一点一点地恢复过去。 1)每恢复  详情 回复 发表于 2015-1-13 14:30
回复

使用道具 举报

发表于 2015-1-13 14:30:56 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-13 14:34 编辑
chenall 发表于 2015-1-13 13:51
关键是根本的问题原因是什么???没有办法判断.前面的都只是猜测..经过调试我目前还是没有办法到找问题最终 ...


>>
另外你若是按你的建议大不了就恢复到1206版的源码,但是这样子又产生了前面的问题.
---
不是说恢复到1206了事。
而是 恢复到1206, 再以此为起点。把曾经做过的改动,再原样,一点一点地恢复过去。
1)每恢复一部分,再测试一下。
2)如果还是正常的,继续。
3)否则,代码修改,与最近正常的节点的差异减半。这样就能定位哪行代码为引起的问题。
4)“处理”该行代码。 (是"处理",而不是"研究"。要么纠正(明显的)错误,要么用替代方法——不明晰的问题)
5)然后继续。指导重要的功能都恢复了。

对程序远来说,很多问题,在定位出来前,根本

>>我觉得根本不是修改了代码的原因,而是有一些未知的原因,就像之前前面的问题一样.
--------
《易经》西方“菲罗教”(Phylosophy)不同。
《易经》中没有所谓的“原因”。
用《易经》来指导这件事。
简单明晰。
最终还是“敲入代码”——“道”。 要么“敲入这样的代码”——“道1”,要么“敲入那样的代码”——“道2”。
最终正确,还是 “敲入某一正确的代码”这个“道3” 而已。
回复

使用道具 举报

发表于 2015-1-13 14:50:25 | 显示全部楼层
我前面#751已经贴上了出现问题的代码,这个代码也没有什么好修改的样子.

你有测试条件可以自己修改测试一下.反正在windows编译一下也是很简单的事情.

点评

GRUB4DOS编译器下载:http://code.google.com/p/grub4dos-chenall/downloads/detail?name=grub4dos_dev_2013-02-03.zip 这个打不开, 还有哪儿有?  详情 回复 发表于 2015-1-13 16:07
你那也可以测试的。 运行F6IMG 后 cmp (0)/TXTSETUP.OEM /ok1206/TXTSETUP.OEM 就知道是否正确。 --- 目前,先解决: 不出现 死循环(不是通过修改人家的代码)。 这个测试条件那儿都有的。  详情 回复 发表于 2015-1-13 14:54
回复

使用道具 举报

发表于 2015-1-13 14:54:48 | 显示全部楼层
chenall 发表于 2015-1-13 14:50
我前面#751已经贴上了出现问题的代码,这个代码也没有什么好修改的样子.

你有测试条件可以自己修改测试一 ...


你那也可以测试的。
运行F6IMG 后
cmp  (0)/TXTSETUP.OEM   /ok1206/TXTSETUP.OEM   

就知道是否正确。


---
目前,先解决: 不出现 死循环(不是通过修改人家的代码)。
这个测试条件那儿都有的。


----
看代码,很难看出问题。  
回复

使用道具 举报

发表于 2015-1-13 16:07:07 | 显示全部楼层
chenall 发表于 2015-1-13 14:50
我前面#751已经贴上了出现问题的代码,这个代码也没有什么好修改的样子.

你有测试条件可以自己修改测试一 ...


GRUB4DOS编译器下载:http://code.google.com/p/grub4dos-chenall/downloads/detail?name=grub4dos_dev_2013-02-03.zip

这个打不开,
还有哪儿有?
回复

使用道具 举报

发表于 2015-1-13 16:32:23 | 显示全部楼层
我觉得 mdyblog 也是程序员,当然也可以自己编译版本,按照自己的思路进行编程或定位错误。mdyblog 可以放出修改后的版本,让大家测试。一旦测试成功,再经 chenall 检查没问题的话,即可融入主版本当中。

这样大家都能完全发挥自己的特点,达到自己的 “极致” 和 “最好”。

自己的思维方法,只有自己能深切领会,要让别人领会,那不是一件容易的事。

譬如说,我经常谈哲学。可是谁赞成呢?假如我把我的这套东西强加给别人,不断指责别人这也不符合哲学,那也不符合哲学,那么别人高兴吗?

自己的东西自己运用,那是没问题的。但假如把自己的思想意识强加给别人,那往往是行不通的。

我认识到,我自己需要得到尊重,别人也需要得到尊重。要尊重别人的哲学信仰、宗教信仰、认识水平和思想方法,不能把自己的思想当作说教,去教训别人。如果凌驾于别人之上,就是对别人的一种伤害或不尊重。
回复

使用道具 举报

发表于 2015-1-13 17:21:59 | 显示全部楼层
git clone git://github.com/chenall/grub4dos.git grub4dos_src
-----------------
下载grubdos.a-20141206  grubdos.a-20141224,怎么下载?

点评

我说一个方法,是我偏爱的。不用 git,而用 svn,这样可以一次性下载到 0.4.5 和 0.4.6 两个系列。 svn co https://github.com/chenall/grub4dos grub4dos_src 如果是下载某次修订(比如第 577 次修订版  详情 回复 发表于 2015-1-13 17:27
回复

使用道具 举报

发表于 2015-1-13 17:25:50 | 显示全部楼层
先看这个页面.

https://github.com/chenall/grub4dos/commits/0.4.6a

找到1206的对应版本ID(这里是d3ce711)
则下载完源码之后就可以这样
git checkout d3ce711 -b 1206 就有一个1206的版本了.

1224对应的版本ID是F035079
git checkout F035079 -b 1224
回复

使用道具 举报

发表于 2015-1-13 17:27:42 | 显示全部楼层
mdyblog 发表于 2015-1-13 17:21
git clone git://github.com/chenall/grub4dos.git grub4dos_src
-----------------
下载grubdos.a-20141 ...

我说一个方法,是我偏爱的。不用 git,而用 svn,这样可以一次性下载到 0.4.5 和 0.4.6 两个系列。

svn   co   https://github.com/chenall/grub4dos   grub4dos_src

如果是下载某次修订(比如第 577 次修订版),可以加上 -r 参数:

svn   co   -r   577   https://github.com/chenall/grub4dos   grub4dos_src

点评

>>svn co -r 577 https://github.com/chenall/grub4dos grub4dos_src 这个 577 怎么和版本对上关系, 哪儿有这个信息。  详情 回复 发表于 2015-1-13 17:48
我git用习惯了,觉得比svn 强大多了,也是挺方便的. 可以随时切换到任意版本(不需要联网),本地临时测试分支等. 用SVN就是切换版本需要重新下载源码  详情 回复 发表于 2015-1-13 17:29
回复

使用道具 举报

发表于 2015-1-13 17:29:51 | 显示全部楼层
不点 发表于 2015-1-13 17:27
我说一个方法,是我偏爱的。不用 git,而用 svn,这样可以一次性下载到 0.4.5 和 0.4.6 两个系列。

sv ...


我git用习惯了,觉得比svn 强大多了,也是挺方便的.

git下载的是整个版本库的内容,下载之后可以随时切换到任意版本(不需要联网),本地临时测试分支等.

用SVN就是切换版本需要重新下载源码

点评

2015-0109 修改后, 也能正常运行03PE-SATA。 F6IMG 彩色提示成功,没有垃圾显示(没加死循环检测)  详情 回复 发表于 2015-1-13 18:47
问题找出来了。 disk_io.c 中的 block_read_func() 中那段代码引起的。 这儿换成 1206, 就号了,能启动03PE-SATA. 差异报告,生产文件见附件。  详情 回复 发表于 2015-1-13 18:18
git 还是没有学会,觉得很不顺利。所以,我还是偏爱 svn 的老一套。  详情 回复 发表于 2015-1-13 17:32
回复

使用道具 举报

发表于 2015-1-13 17:32:31 | 显示全部楼层
chenall 发表于 2015-1-13 17:29
我git用习惯了,觉得比svn 强大多了,也是挺方便的.

git下载的是整个版本库的内容,下载之后可以随时切 ...

git 还是没有学会,觉得很不顺利。所以,我还是偏爱 svn 的老一套。

回复

使用道具 举报

发表于 2015-1-13 17:48:03 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-13 17:51 编辑
不点 发表于 2015-1-13 17:27
我说一个方法,是我偏爱的。不用 git,而用 svn,这样可以一次性下载到 0.4.5 和 0.4.6 两个系列。

sv ...


1:
>>svn   co   -r   577   https://github.com/chenall/grub4dos   grub4dos_src

这个 577 怎么和版本对上关系, 哪儿有这个信息。


2:
svn 出错
00068.png

git 能下,就是 不知道怎么 获得指定版本。
还是cvs简单明了。而且有个图形化的wincvs
回复

使用道具 举报

发表于 2015-1-13 18:09:47 | 显示全部楼层
你还是用 chenall 在前面说的 git 方法吧。你的网络好像有问题,不支持 https 的 443 端口。

我的方法在我这里用很正常。


回复

使用道具 举报

发表于 2015-1-13 18:18:10 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-13 18:21 编辑
chenall 发表于 2015-1-13 17:29
我git用习惯了,觉得比svn 强大多了,也是挺方便的.

git下载的是整个版本库的内容,下载之后可以随时切 ...


问题找出来了。
disk_io.c 中的 block_read_func() 中那段代码引起的。
这儿换成 1206, 就号了,能启动03PE-SATA.
新源码,差异报告,生产文件见附件。

报告2.htm.7z

2.81 KB, 下载次数: 1

grub4dos-0.4.6a-2012-12-24Fix-20150113.7z

404.89 KB, 下载次数: 7

grub4dos_src-1224Fix.7z

732.69 KB, 下载次数: 1

回复

使用道具 举报

发表于 2015-1-13 18:47:29 | 显示全部楼层
chenall 发表于 2015-1-13 17:29
我git用习惯了,觉得比svn 强大多了,也是挺方便的.

git下载的是整个版本库的内容,下载之后可以随时切 ...

2015-0109 修改后, 也能正常运行03PE-SATA。
F6IMG 彩色提示成功,没有垃圾显示(没加死循环检测)

grub4dos0109_src_FIXOK.7z

732.4 KB, 下载次数: 2

grub4dos-0.4.6a-2015-0109Fix-2015-01-13.7z

405.67 KB, 下载次数: 4

回复

使用道具 举报

发表于 2015-1-13 19:23:00 | 显示全部楼层
本帖最后由 chenall 于 2015-1-13 19:26 编辑

下载看了下,你的源码比较乱,生成的diff文件不知是基于什么版本的.

我只好自己弄了个1206版的源码和你上传的1224修正版的disk_io文件比较了下.

看起来只是撤销了f0350793的所有改动,这个应该不能算是修复吧(我前面也有说过出现问题的改动就是在这里),只要恢复了那肯定就可以的.

这个改动主要是解决你的前一个问题(map (hd0)x+yy )很慢的问题.你可以用1206版的源码测试一下(不要改动源码),再用1224的源码测试下

用git可以随时使用某个版本的源码.

第一种 方法是git checkout f035079这个是1224版本

如果你有改动过源码还没有commit不能直接切换,这时如果这些改动要保留的话可以git commit -m "xxxx"保存一下改动再切换

如果改动不想保留,可以直接强制切换1224版
git reset --hard f035079

1206版的同上.

点评

发现一个可能的"定时炸弹". 显然,一般观念上认为设备是扇区对齐的,最少是512字节对齐的。 但是g4d中似乎有一种间接的手段,来创建反例的设备。 那就是内存盘。可以是任意字节对齐的。 这种 实际和观念上  详情 回复 发表于 2015-1-14 11:01
搞定了。 目标码: 源码 下载页面下载的ZIP包修改的, 请BC3比较。 grub4dos-54b867e229fd26e4f44a349095d7f3d0596247e1\ =原始下载的zip包的源码。 new-grub4dos-54b867e229fd26e4f44a349095d7f3d0596247e  详情 回复 发表于 2015-1-14 04:24
目前,还不是“修复”, 而是定位出问题的代码行。  详情 回复 发表于 2015-1-14 01:02
回复

使用道具 举报

发表于 2015-1-14 01:02:27 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-14 17:04 编辑
chenall 发表于 2015-1-13 19:23
下载看了下,你的源码比较乱,生成的diff文件不知是基于什么版本的.

我只好自己弄了个1206版的源码和你上 ...


目前,还不是“修复”,
而是定位出问题的代码行。

这样 不用 没有方向,疑神疑鬼。

接着才是 如何解决问题。---map慢的问题。

点评

额,思想不太一样.. 定位出问题的"代码行",我所谓的定位是具体到哪一行,你只是到哪一段. 那你前面的定位是浪费时间,我前面已经的说过了,就是这里的问题,可能你没有注意看()  详情 回复 发表于 2015-1-14 19:38
回复

使用道具 举报

发表于 2015-1-14 04:24:58 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-14 10:44 编辑
chenall 发表于 2015-1-13 19:23
下载看了下,你的源码比较乱,生成的diff文件不知是基于什么版本的.

我只好自己弄了个1206版的源码和你上 ...


搞定了。
00069.png

源码: grub4dos-0.4.6a-2015-01-09-FIX-SRC.7z (740.91 KB, 下载次数: 5)
目标码: grub4dos-0.4.6a-2015-01-09-FIX-bin.7z (271.25 KB, 下载次数: 9)


源码 下载页面下载的ZIP包修改的, 请BC3比较。
grub4dos-54b867e229fd26e4f44a349095d7f3d0596247e1\  =原始下载的zip包的源码。
new-grub4dos-54b867e229fd26e4f44a349095d7f3d0596247e1\  =修改后的源码。

主要改的disk_io.c,的 block_read_func()函数。
cmdline.c中的优化,不关键。

点评

谢谢你的努力. 通过你改动的代码我终于发现了问题的原因.就是下面这一句 else if (filepos > blk_buf.cur_filepos) 这是我犯错了,本来是if (filepos > blk_buf.cur_filepos)没有else的,我上次改的时候没有  详情 回复 发表于 2015-1-14 19:51
回复

使用道具 举报

发表于 2015-1-14 11:01:44 | 显示全部楼层
chenall 发表于 2015-1-13 19:23
下载看了下,你的源码比较乱,生成的diff文件不知是基于什么版本的.

我只好自己弄了个1206版的源码和你上 ...

发现一个可能的"定时炸弹".

显然,一般观念上认为设备是扇区对齐的,最少是512字节对齐的。

但是g4d中似乎有一种间接的手段,来创建反例的设备。

那就是内存盘。可以是任意字节对齐的。
这种 实际和观念上的 差异, 随时会 丢出 一个 定时炸弹。


F6IMG 之所以 突然 丢出 一个 定时炸弹。
就是她创建了一个这样的  字节 内存盘。

map --mem=0x20000 %~f0 (rd)
cat --locate=\x1f\x8b --number=1 (rd)+1 > nul || exit 1
calc *0x82d8=*0x82d8-%?% > nul
calc *0x82d0=*0x82d0+%?% > nul
map --mem (rd)+1 (1) && map --rehook

0000:82D0  8字节(即四字) rd 设备物理基地址

这里直接修改  rd 设备物理基地址(字节单位)。
由于支持任意字节地址,这样 rd实际上就是 字节内存盘了。
F6IMG中
*0x82d0=0x20000 + 0x147E=0x2147E

就是这个“差异”,丢出的 定时炸弹, 造成 F6IMG没有正常运行。



回复

使用道具 举报

发表于 2015-1-14 19:38:57 | 显示全部楼层
mdyblog 发表于 2015-1-14 01:02
目前,还不是“修复”,
而是定位出问题的代码行。


额,思想不太一样..

定位出问题的"代码行",我所谓的定位是具体到哪一行,你只是到哪一段.

那你前面的定位是浪费时间,我前面已经的说过了,就是这里的问题,可能你没有注意看(我前面的一个链接)



回复

使用道具 举报

发表于 2015-1-14 19:51:14 | 显示全部楼层
本帖最后由 chenall 于 2015-1-14 20:43 编辑


谢谢你的努力.

通过你改动的代码终于发现了问题的原因.就是下面这一句

else if (filepos > blk_buf.cur_filepos)

这是我犯错了,本来是if (filepos > blk_buf.cur_filepos)没有else的,我上次改的时候没有注意看前后代码.

认为前面是

if (filepos < blk_buf.cur_filepos)

再判断

if (filepos > blk_buf.cur_filepos)

有点多余.没仔细看if (filepos < blk_buf.cur_filepos)里面的代码.


你可以测试一下附件看看是否正常.

点评

楼上grldr测试: 1) F6IMG 模拟, 成功 2) F6IMG 实机,暂时测试不了。那机器在使用中。 3)map 10G, 耗27秒。 [attachimg]206857[/attachimg]  详情 回复 发表于 2015-1-14 20:25
回复

使用道具 举报

发表于 2015-1-14 20:10:55 | 显示全部楼层
{:soso_e160:}老师们辛苦了,喝杯茶!
“问题”浮出水面,看来我等伸手党有福了……
回复

使用道具 举报

发表于 2015-1-14 20:25:23 | 显示全部楼层
chenall 发表于 2015-1-14 19:51
谢谢你的努力.

通过你改动的代码终于发现了问题的原因.就是下面这一句

楼上grldr测试:
1) F6IMG 模拟, 成功
2)  F6IMG  实机,暂时测试不了。那机器在使用中。
3)map 10G, 耗27秒。
00066.png

点评

map 10g的问题是由于我前面的附件是基于1224源码的. 我稍后上传一个基于最新版的源码上来.  详情 回复 发表于 2015-1-14 20:36
回复

使用道具 举报

发表于 2015-1-14 20:36:08 | 显示全部楼层
mdyblog 发表于 2015-1-14 20:25
楼上grldr测试:
1) F6IMG 模拟, 成功
2)  F6IMG  实机,暂时测试不了。那机器在使用中。

map 10g的问题是由于我前面的附件是基于1224源码的.

我稍后上传一个基于最新版的源码上来.
回复

使用道具 举报

发表于 2015-1-14 20:42:49 | 显示全部楼层
最新版本附件,请测试.

grub4dos-0.4.6a-2015-01-14.7z

270.38 KB, 下载次数: 34

点评

[attachimg]206859[/attachimg]  详情 回复 发表于 2015-1-14 21:13
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-10 17:07

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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