无忧启动论坛

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

支持含有碎片的文件仿真

    [复制链接]
181#
发表于 2015-1-9 19:59:37 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-9 20:22 编辑
chenall 发表于 2015-1-9 18:06
新上传的版本,解决debug 3的问题.

上面的问题可以上F6IMG的作者调试跟踪一下看看,必竟作者本人对这些代 ...


脚本程序中有  call : 循环嵌套。

call  : 循环嵌套, 不会 导致堆栈溢出吗?
回复

使用道具 举报

182#
发表于 2015-1-9 22:19:18 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-10 03:04 编辑
不点 发表于 2015-1-9 21:14
grub4dos 在解决内存冲突方面,作了多次的努力。最早的努力,是 gandalf 发现 grub4dos 总是莫名其妙地死机 ...



你说的是grub自己的嵌套调用。
脚本也有个嵌套调用的问题。同样造成堆栈溢出。
脚本的call :funx
的堆栈在 实模式堆栈 吧。


从前面可知, 每次会在堆栈上建立一个数组:
char cmdline_buf[1500];



tststack.sh:

  1. !BAT
  2. if "%~1"=="" debug 0
  3. set i=1
  4. call :FUN
  5. goto :eof

  6. :FUN
  7. set /a i=%i%+1
  8. echo -e -n \r    i=%i%                 \r
  9. set /a i0=%i% % 10
  10. if %i0%==0 pause --wait=1
  11. call :FUN
复制代码


函数 :FUN有嵌套调用自己。

测试89多次调用后,就死机了。

实测 F6IMG call :find_oem 嵌套 39次 。

不过, 89次应该够了。
F6IMG 应该改改,不要用嵌套调用。改为goto :


回复

使用道具 举报

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

上面的问题可以上F6IMG的作者调试跟踪一下看看,必竟作者本人对这些代 ...

看了源代码, 猜测你们的意思。
cmd_buffer += (arg_len + 0x10) & -0x10;
似乎应该为:
cmd_buffer += (arg_len + 0x0F) & ~0x0F;
2者的结果是不同。
回复

使用道具 举报

184#
发表于 2015-1-10 10:57:40 | 显示全部楼层
不点 发表于 2015-1-9 21:14
grub4dos 在解决内存冲突方面,作了多次的努力。最早的努力,是 gandalf 发现 grub4dos 总是莫名其妙地死机 ...

看了最新的源码。
现在用的是一个64K的全局数组——构成一个栈cmd_buffer,来保存cmdline_buf。
这样 89次死机,差不多对上来。
回复

使用道具 举报

185#
发表于 2015-1-10 11:34:04 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-11 10:11 编辑
chenall 发表于 2015-1-9 18:06
新上传的版本,解决debug 3的问题.

上面的问题可以上F6IMG的作者调试跟踪一下看看,必竟作者本人对这些代 ...



run_line  函数优化了下,call  :abc 时不占用宝贵的64K的命令行栈。
下面 红色为添加的代码。

int run_line (char *heap,int flags)
{
   char *cmdline_buf = cmd_buffer;
   char *arg;
   int status = 0;
   int ret = 0;
   int arg_len = 0;
   while (*heap == 0x20 || *heap == '\t')  ++heap;
   do
   {
      if(!grub_memcmp("call", heap,4) && (*heap[4] == 0x20 || heap[4] == '\t'))
      {
          //arg=heap+5;  //--其实这3行可以不要,直接break
          //while (*arg == 0x20 || *arg == '\t') ++arg;  //--
          //if(':'==*arg) //--
             break;
      }

      arg_len = strlen(heap) + 1;   
      cmd_buffer += (arg_len + 0x0F) & ~0x0F; //cmd_buffer += (arg_len + 0x10) & -0x10;
      memmove(cmdline_buf,heap,arg_len);
      heap = cmdline_buf;
   }while(0);

   while(*heap && (arg = heap))
   {
      heap = skip_to_next_cmd(heap,&status,OPT_MULTI_CMD_AND | OPT_MULTI_CMD_OR | OPT_MULTI_CMD);//next cmd
      ret = run_cmd_line(arg,flags);
      if (((status & OPT_MULTI_CMD_AND) && !ret) || ((status & OPT_MULTI_CMD_OR) && ret))
      {
         errnum = ERR_NONE;
         heap = skip_to_next_cmd(heap,&status,OPT_MULTI_CMD);//next cmd
      }
   }
   cmd_buffer = cmdline_buf;
   return ret;
}


运行次数还是有不太大的限制。
另外的地方每次会好用好大一块“堆”。
最终会因为“堆”耗尽而终止。
除非那儿再优化下: bat_run_script()函数。

回复

使用道具 举报

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

是的  :dyn_oem,没有嵌套,里面是个循环。


嵌套是 call :find_oem
嵌套了 39次 。


这个不是问题。
------------------
还是,从1206版本上,从头再来吧。

嵌入式的问题,一般是看不出来的,很多不是逻辑问题,为是环境问题。
改点,再试试。
找个SATA的机器试试。
用我前面的测试包——我费劲整出个 测试包 ,就是让你开发中 能方便地反复测试。
回复

使用道具 举报

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

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

没看出 循环输出的内容有什么区别。
回复

使用道具 举报

188#
发表于 2015-1-10 11:55:15 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-10 12:03 编辑
mdyblog 发表于 2015-1-10 10:55
看了源代码, 猜测你们的意思。
cmd_buffer += (arg_len + 0x10) & -0x10;
似乎应该为:


>>chenall:  这个是要16字节对齐  发表于 25 分钟前
cmd_buffer += (arg_len + 0x0F) & ~0x0F;
cmd_buffer += (arg_len + 0x10) & -0x10;
结果差不多, 就是 arg 本就对齐的时候,会在多占16字节.

后面这个有问题。
假设 arg_len=0x10
(arg_len + 0x10) & -0x10
= (0x10 + 0x10) & -0x10
=  0x20  & -0x10
=  0x20  & 0xFFFFFFF0   //假设为int32
= 0x20                       //结果显然不是上面想要的:16的 16字节对齐

再验证前面的算法:
(arg_len + 0x0F) & ~0x0F
=  (0x10 + 0x0F) & ~0x0F
=  0x1F & ~0x0F
=  0x1F & ~0xFFFFFFF0     //假设为int32
=  0x10    //这是要的:16的 16字节对齐
回复

使用道具 举报

189#
发表于 2015-1-10 12:05:07 | 显示全部楼层
chenall 发表于 2015-1-10 12:02
~0x0f 和 -0x10是一样的

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

是的 -0x10 = ~0xF

就是 , 有时会多占16字节。
回复

使用道具 举报

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

上面的问题可以上F6IMG的作者调试跟踪一下看看,必竟作者本人对这些代 ...

grub4dos-0.4.5c-2015-01-10.7z

测试还是一样的。
看不出有什么区别。
回复

使用道具 举报

191#
发表于 2015-1-10 13:12:01 | 显示全部楼层

-

本帖最后由 mdyblog 于 2015-1-10 13:13 编辑
chenall 发表于 2015-1-10 12:53
你的SATA驱动ID是多少?我看看能不能模拟测试下.


抓到的信息:
WHID=PCI\VEN_8086&DEV_1C03&SUBSYS_05061025&CC_010601&REV_04
SRSID=PCI\VEN_8086&DEV_1C03
srs=(2)/



-----------------
另外, 0110版,下面这样单步调试,根本没有单步效果,一下子跑完了。
debug 3
command /F6IMG
回复

使用道具 举报

192#
发表于 2015-1-10 14:03:03 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-10 14:45 编辑
chenall 发表于 2015-1-10 13:48
您可能没有注意看更新说明,还有前面的贴子

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


哦, 这样啊。
发现了。

能不能加个B功能,设置断点。
+/-数字, 就是相对偏移行数处设断点。
数字, 就是对应行号处设断点。
回复

使用道具 举报

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

以前动态调试WINDOWS程序的时候,经常看到 ...


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

B
15
后, 放开运行(就是E/o吧,或Run,或Continue)
一直接着正常运行, 如果运行到第15行,进入交互模式, 输出调试行,等待用户输入。
//对Continue是接着正常运行, 对Run是从头开始正常运行。
//这是后面输入的命令决定的, 和断点本身无关。
//断点只在运行时才会起作用: 每次 运行一行 前 都会检查断点信息。
如果第15行始终运行到就结束了,(goto掉了),可能直接运行完了,不会再提示DEBUG行。


对应地,还有清除断点。
D后列出断点

输入:N
清除第N个

//下面可以考虑
B也可以删除,乒乓的,如果该行断点,就去掉改断点。



2:

相对偏移可绝对行号是可以相互转换的。

假设设定的是绝对行号(1~N)。
程序记住行号。

放开运行(E)时, 每次获得一行,检查当前行号是否在 断点列表中。
不是的话,直接运行。
是的话,进入交互模式, 输出调试行,等待用户输入。


回复

使用道具 举报

194#
发表于 2015-1-10 14:52:34 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-10 14:56 编辑
chenall 发表于 2015-1-10 14:46
批处理运行时会预处理,先扫描一次整个批处理,然后完全在内存中运行,不是运行一行读一行的.

程序内部 ...


这个自己想办法了。
比如,(发现是调试模式,)    不压缩 非代码行,而是保留一个0x0a
或者保留辅助调试信息库(dbg库——如gdb)。
回复

使用道具 举报

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

发 ...


bat_run_script()中:

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

为什么要加2K (0x800), 好浪费内存啊?
嵌套39次就是78K了。

还有,那 系统堆, 初始化为多大,也就是说 总申请多大 就会崩溃?

点评

这个cmd_buff用途比较多 前面放保存文件名,中间是参数(参数可能很长,比如用ls | call :xxx之类的.) 后面的是命令缓冲区(因为命令需要处理变量等之后才能运行) 这个系统堆空间就很大了,32MB以上都是. 0x8  详情 回复 发表于 2015-1-10 15:21
回复

使用道具 举报

196#
发表于 2015-1-10 15:29:52 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-11 10:07 编辑
chenall 发表于 2015-1-10 15:21
这个cmd_buff用途比较多

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


》》这个系统堆空间就很大了,32MB以上都是.
这么大, 那 前面的 命令行栈,是否也可以放到堆里面,或者申请2M/8M 的内存作为 命令行栈。

grub正常运行是什么模式,能 直接访问 32M 以上的地址? (保护模式?)
默认实模式,只能访问 1M 地址啊。

如果是保护模式, 命令行栈 直接开8M算了(如果够)。



--------------------
前面的代码优化, 使得 call 不再大量消耗 命令行栈。

--------------------
还是原来“保护模式的栈分开”的设计原则更合理些 。
因为消耗最大的、也最难限制的 是 保护模式的栈。 保护模式栈 可以不受1M地址限制。

现在 主程序 工作在 保护模式。 实模式 只是 响应服务器(执行 响应函数。 响应含主程序请求)。 每次执行都很短,且对外不可见。
只要设计好了,实模式的栈深度是个 可预见的、不太大的 值。 一般2K,4K——32K,就够了。

ARM 中就有很多栈, 大部分和此处“实模式的栈”一样,只是 执行 响应函数,栈 一般也就2~~4K.
   只有(主程序用)主栈开得很大。

回复

使用道具 举报

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


点评

这个目前看起来应该是 通过这个获取的http://grub4dos.chenall.net/atom.xml 不过这个也有缺点. 我打算另外提供一个JSON格式的接口,方便你们开发在线直接升级的程序. 如果没有什么问题的话,这几天应该可以  详情 回复 发表于 2015-1-12 09:10
回复

使用道具 举报

198#
发表于 2015-1-11 20:30:07 | 显示全部楼层
2014-0111测试 /F6IMG:


出现图上的垃圾显示.
最后没有提示F6IMG成功。

点评

新的版本只是处理了debug的问题,上次的测试的电脑是别人的,他拿走了,我需要另外找一到电脑测试. 现在的版本应该比较容易定位出问题的地方.  详情 回复 发表于 2015-1-12 09:11
回复

使用道具 举报

199#
发表于 2015-1-12 12:15:48 | 显示全部楼层
不点 发表于 2015-1-12 08:36
别开这种玩笑。grub4dos 从 0.4.5 开始保留 16M,后来又扩大到 32M 内存,内存占用已经够大,还能再增 ...

>>
和你的想法正好相反。保护模式的堆栈空间最容易控制,这由编程者直接控制,你只要优化程序,尽量不占用过多堆栈,就不会产生问题。
.....
保护模式的程序,都是咱自己设计的,还会有问题吗?如果不慎超限使用了堆栈造成死机,那么正好可以暴露程序的缺陷,修复它,让程序更健壮。肆意扩大堆栈的结果,就是能够容纳更多不良的程序,它们是隐患,不能及时被发现。
---------
我为什么说, "保护模式的堆栈空间最容易控制".

这是基于  “g4d 主流程 工作在 保护模式”而说的。
此时 要对g4d的用户开放。 实际用多少 堆栈空间, 不完全g4d 说了算。
还有,用户程序的设计算法。
如果 用户的程序中, call 嵌套调用。
那么, 堆栈将大概线性增长。
g4d的开发者, 无论预留多大堆栈, 都会爆的。
我下面的测试程序:
!BAT
set i=0
:FUN1
set /a  i=%i% + 1
set /a i0=%i% % 50
if %i0%==0 pause  loops=%i%
call  :FUN1


--------
质量最难控制的是用户程序——很多程序就是按DOS批处理设计的,很多人把call当goto用了。
   这个问题 PECMD中也存在,曾经一段时间,我不得不把堆栈设为100M。
   ---后来在说明中反复说明,CALL 尽量不要嵌套。


>>>
特殊情况下,如果应用程序需要使用超大量的堆栈,程序设计者可以在自己的保护模式程序中,自己开辟堆栈空间,然后切换到自己的保护模式堆栈。
------------
把你说的 是g4D的开发者吧。
那么, 还是 解决不了开放给使用者引入的问题。


>>
而最难控制的是 BIOS 对实模式的堆栈的占用。要知道,BIOS 有恶意攻击的成分在内。
-------------
我为什么说, "实模式的堆栈空间相对可控".
首先是相对  "保护模式的堆栈空间最容易控制" 而言的.


再说 "实模式的堆栈空间相对可控".
有 实模式 调用都是一个确定的函数,(对既定的g4d和机器)这样用多上堆栈——和用户程序算法无关。
BIOS 有专业公司开放的, 基本上算法是优化过的,反正比大部分G4D用户程序好。
很少用到 嵌套调用, 即使用到,也是经过数学证明的,次数是很小的。

BIOS调用64K堆栈还不够用的问题, 不用特别处理了, 直接当BUG处理了。
一般2k就够了。
BIOS调用64K堆栈还不够用的问题,应该没有的。
堆栈 问题, BIOS开放商,一定放到头号位置——绝不允许的。
BIOS调用16K堆栈还不够用,那么这家公司早就被淘汰出局了。

注意区分2类不同的问题。
1)是基本问题——全局的
2)功能问题——局部的
堆栈问题是前者,不会出现的。

BIOS 可能有功能问题——某个功能没提供或气功的形式不同。
其实我们碰到的BIOS问题,都是后者——这些都是可以接受的问题——否则这些公司就被淘汰出局了。
这是因为BIOS没有一个包含全部公司BIOS功能的强制标准。
这样, 提供的 功能集的大小不同。
超出基本强制标准 之外的特性各家也不同。

这不是什么 “攻击”。这是自然的生产现象。不只是BIOS, 也不只是IT,各行各业都一样。

处理这些问题,一般的用人海战术——穷举所有厂家的BIOS。
这不是我等担负得起的。
一般公司,也会谨慎使用的,相反,他会尽量避免这个问题,尽量缩小自己的边界。

如果这个称为 “攻击”——那么的小心,可能被怀疑 有  “被攻击”强迫症。


个人拙见,见谅。


点评

上海复旦大学的投毒杀人案,一审、二审被判死刑,而杀人者的律师说,不是故意杀人,判死刑太重了,要到最高法院继续申诉。 同一件事,众说纷纭,一点也不奇怪。持什么观点,都正常,没有不正常的观点。 最终的  详情 回复 发表于 2015-1-12 13:24
回复

使用道具 举报

200#
发表于 2015-1-12 12:28:24 | 显示全部楼层
不点 发表于 2015-1-12 08:36
别开这种玩笑。grub4dos 从 0.4.5 开始保留 16M,后来又扩大到 32M 内存,内存占用已经够大,还能再增 ...

>>
别开这种玩笑。grub4dos 从 0.4.5 开始保留 16M,后来又扩大到 32M 内存,内存占用已经够大,还能再增加 8M 的占用?就算增加到 8M 了,这够用吗?是不是还要增加到 64M 或 256M?


目前的堆栈空间是 0x7000 向下扩展至 0x2000,足够用了。如果程序设计不合理,无论多少堆栈也不够用,即使堆栈空间扩大到 4G 也不够用。
------------------------
1) 我没有说再增加8M,
相反会减少64K.
因为 将预留的 64K  命令行栈 取消。
转而, 在初始化市, 从(自由空间)堆中申请2M的内存,作为 命令行栈。

按C大说的, 堆是在后面的自由空间。

2)内存留着不用, 用户也得不到什么好处——闲着不让用(来提供更多功能)就是浪费!
现在那个机器没有个64M内存。
况且, 申请多少 也是动态的,如果真的内存很小,就少申请点。
回复

使用道具 举报

201#
发表于 2015-1-12 16:06:51 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-12 16:22 编辑
chenall 发表于 2015-1-12 15:38
根跟我的调试结果来看,应该是循环嵌套太多层导致的,看来有必要限制一下循环嵌套的层数.

另外发现F6IMG里 ...


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

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

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

好像和应该函数里面的变量和参数有关系?有没有什么保守的计算方法.这样就可以太概估计一下可以几层而不出问题.
--------------------------------
你程序中有2个堆栈。
1)默认堆栈。
由于 你没有定义大的数组,
这个每次是很小的。
主要是定义的临时变量。

保守计算:
2层嵌套之间C函数调用次数N
最长路径临时变量总空间M,由于有优化,一个函数内部的所有 临时变量都算, 哪怕在调用函数的后面;并列代码块中的都算。

保守大小S1
指针字节数P=sizeof(char*)
S1=2NP +  M

并列路径函数取最大值。

不过实际比这个小得多。

最好的办法是,
判断sp寄存器。
设定最低限SPL  
SPL =栈底 + 保险长度
保险长度 可以取:  16+该函数中变量总内存。

在call: 函数 中
if(sp<=SPL)  { printf("\nFAULT: <<<<<<<<<<SYSTETM STATCK RUNOUT>>>>>>>>>\n");  return ; }

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


2) 命令行堆栈
最长命令行的L
保守大小S2
S2=NL

测试了下find_oem函数, 这个目前才嵌套30多次, 没有溢出。
这里没计算:  复合语句,转为嵌套。没研究G4D程序是否有这种嵌套。


作为验证,  把命令行堆栈扩大到1M。  

点评

是指cmd_buffer吗?这个我测试过了用了还不到一半只用了4KB左右.  详情 回复 发表于 2015-1-12 16:57
回复

使用道具 举报

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

另外发现F6IMG里 ...

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

这件事 很麻烦的。
很多人写出来的代码算法没有优化。

有的是水平原因。
有的是对待此事的太多所致(没有认为是多么重要的事情,需要费力优化)
——优化本来就有风险。优化 一般用到条件边界。 很多错误就是优化引入的——编译器也是如此。

点评

这个估计和个人习惯也有关系.. 我自己写的代码,我会尽量优化(在时间能力允许的条件下),就当是学习. 刚开始写出来的可能就是勉强能用,以后经过一次一次改进优化. 现在如果限制一下嵌套层数那F6IMG估计就不能  详情 回复 发表于 2015-1-12 17:01
回复

使用道具 举报

203#
发表于 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
回复

使用道具 举报

204#
发表于 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)



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

点评

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

使用道具 举报

205#
发表于 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” 而已。
回复

使用道具 举报

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

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


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

就知道是否正确。


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


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

使用道具 举报

207#
发表于 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

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

使用道具 举报

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

使用道具 举报

209#
发表于 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 出错


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

使用道具 举报

210#
发表于 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

回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-17 18:08

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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