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

支持含有碎片的文件仿真

   火... [复制链接]
发表于 2015-1-8 11:09:29 | 显示全部楼层
本帖最后由 2011niumao 于 2015-1-8 11:12 编辑

grub4dos命令行执行blocklist的结果.1225与1227 0.46a 还真的不一样.请chenall yaya看看
上面是能引导的1225
20150108_110054q.jpg
下面是不能引导的1227
20150108_1029451.jpg
回复

使用道具 举报

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


回复

使用道具 举报

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

使用道具 举报

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

测试很成功.几个vhd LINUX系统都能很快,map方式启动.非常感谢.
回复

使用道具 举报

 楼主| 发表于 2015-1-8 16:29:33 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2015-1-8 16:53 编辑

扇区数少了 0x800000 的倍数。按说也没有超过 4 字节呀。

请教 chenall ,这里是否需要修改:
if (rw_flag != 0x900ddeed && rw_flag != 0xedde0d90 && rw_flag != GRUB_LISTBLK)
  {//for old devread with 32-bit byte_offset compatibility.
    rw_flag = *(unsigned long*)(&write - 1);
    if (rw_flag != 0x900ddeed && rw_flag != 0xedde0d90 && rw_flag != GRUB_LISTBLK)
      return !(errnum = ERR_FUNC_CALL);

点评

新的blocklist会根据length长度计算扇区数.之前length是unsigned long的,超过4G的话就会出错  详情 回复 发表于 2015-1-8 16:59
这个GRUB_LISTBLK标志只有grub4dos内部使用,不必考虑外部命令 这一段代码是为了兼容以前旧版函数的(主要是旧版的外部命令).不必修改.  详情 回复 发表于 2015-1-8 16:51
回复

使用道具 举报

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

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

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

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

使用道具 举报

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

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

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

使用道具 举报

发表于 2015-1-9 10:59:43 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-9 11:10 编辑

报告一个现象。
新版 运行F6IMG卡死。
如图: (最后面是光标闪烁)
新grldr-F6IMG死ji.png


测试0.46a各版本, 找出对错相邻2版本。
20141206正常,
从下一版本20141224均错误,包括20150108


测试包:演示GRLDR-F6IMG-卡死.7z
解压到U盘,设为grldr  启动。

点评

请先测试一下 grub4dos-0.4.5c-2014-12-17 看看这个版本有没有问题.  详情 回复 发表于 2015-1-9 11:10
回复

使用道具 举报

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

使用道具 举报

发表于 2015-1-9 11:19:23 | 显示全部楼层
chenall 发表于 2015-1-9 11:10
请先测试一下
grub4dos-0.4.5c-2014-12-17
看看这个版本有没有问题.

grub4dos-0.4.5c-2014-12-17
正常。 驱动了SATA。
回复

使用道具 举报

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

使用道具 举报

发表于 2015-1-9 15:06:37 | 显示全部楼层
chenall 发表于 2015-1-9 14:24
目前看不出来哪里,卡死的话可能是有死循环,

至于24号的改动你可以试试先执行debug 0x7fffffff再执行F6IM ...


前面的给出的测试包,不大才19M,主要的数据——SRS驱动,你应该也可以测试的。

自己反复测试,能获得更多的新信息。

checkrange 20111106:-1 read 0x8278 > nul || clear && echo -e \n Not supported grub4dos version!\n && exit
calc *0x8280&0xff/2 > nul || debug 1 > nul && command | call :zip_fix =
read 0x82b8 > nul && calc *0x82b9&0xff/2 > nul || debug 1 > nul && command | call :zip_fix =
setlocal && debug 0 || set *
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
map --mem (fd1)/f6.gz (0) && map --rehook
insmod (1)/F6.MOD > nul || exit
if /i %1==--x64 shift 1 || if /i %2==--x64 || echo -n ! set x64=64 && cat --locatei=WinVBlock32 --replace=WinVBlock64 --number=1 (1)/txtsetup.oem > nul
::检测本机的SRSID是否符合标准,标准的ID截取前21位,否则使用完整ID搜索.
chkpci -srs | set WHID=
clear && if not exist WHID && echo -e \n$[0004] Can't Found $[0003]ACHI/RAID controller!\n  && goto :end
if /i "%WHID:~0,7%"=="PCI\VEN" set SRSID=%WHID:~0,21% || set SRSID=%WHID%
if "%1"=="" set /u srs=/srs/ || if "%~x1"==".gz" call :.gz %~f1 || set /u srs=%~pnx1 && rootnoverify %~d1
if "%srs:~-1%"=="/" || set srs=%srs%/
checkrange 0x21 read 0x8280 || find --set-root ls %srs% > nul || echo -e \n$[0003] Can't Find the $[0004]%srs%$[0003]!\n && goto :end
if exist %srs%%%SRSID:~8,4%.GZ call :.gz %srs%%%SRSID:~8,4%.GZ || call :%SRSID:~8,4% || call :OTHER
root %srs% || root %@root%%%srs%
ls | call :find_oem %@root% || echo -e \n$[0003] Copy drivers $[0004]success!\n ! if exist x64 echo -e \n$[0003]The controller x64 drivers are $[0004]not found$[0003]! Your hardware ID is:\n $[0005] %WHID% || echo -e \n$[0003]The controller x86 drivers are $[0004]not found$[0003]! Your hardware ID is:\n $[0005] %WHID%

:end
map --unmap=2 && map --rehook
endlocal && delmod fat > nul && delmod chkpci > nul
exit


debug 0x7fffffff效果一样,还是显示那2行(前面有图)。是内部关闭了。
debug 3 发现是卡在上红色哪行。没有发现循环。再也不接受输入了,


回复

使用道具 举报

发表于 2015-1-9 15:20:19 | 显示全部楼层
chenall 发表于 2015-1-9 11:10
请先测试一下
grub4dos-0.4.5c-2014-12-17
看看这个版本有没有问题.

>>> grub4dos-0.4.6a-2015-01-09.7z

对不起,没注意到这个。
---
测试了,和1225卡死的一样。

也是卡在前面红色的那行。
回复

使用道具 举报

发表于 2015-1-9 15:31:28 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-9 16:19 编辑
527104427 发表于 2015-1-9 15:18
新版的grldr,似乎每个标签都要加 debug 3,才看得到过程


1)这样 debug 3就没有实际意义了。
debug 一下,还要去改源代码。

2)还有在脚本内debug 3也失效了。
很不好用。
很多时候,脚本前面很长的代码不要单步(敲回车太累,或影响界面),只要程序中间的一段debug 3

debug 3 应该随时可以切换的。

不要 搞那么多作茧自缚的 标准。
咱中国人 不兴 这个——就来实用的。
“实用” 正是G4D的灵魂。




能把这些限制去掉,再传个版本上来。

F6IMG不能那个随便 插入代码的。
是拼装起来的文件。每一部分的地址是固定的,不能移动的。


-------------
哦, 是 527104427大 啊!搞错了。
那当前面没说。
回复

使用道具 举报

发表于 2015-1-9 15:47:19 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-9 16:33 编辑
527104427 发表于 2015-1-9 15:18
新版的grldr,似乎每个标签都要加 debug 3,才看得到过程


用winHEX 小心的在 :find_oem
函数中加一行打印语句。


:find_oem
echo  ==:find_oem   

:find_oem
的确在循环执行

又回到 printf时代。
回复

使用道具 举报

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

使用道具 举报

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

狂按回车
发现死循环为下面红色代码:

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

call Fn.11 "%2" "%tmp:~-16%" && echo -e \r\n[Scsi]\r\n%aline% >> %1 && exit
if /i ";[iles.scsi.%2]"=="%tmp%" && set loop=0 && echo [Files.scsi.%2] >> %1 && exit
call Fn.11 ";[" "%tmp:~0,2%" && set loop=1 && exit
call Fn.11 "\[" "%tmp:~0,1%" && set loop=0 && echo %aline% >> %1 && exit
call Fn.11 "\;" "%tmp:~0,1%" || call Fn.11 "#" "%tmp:~0,1%" || calc %loop% > nul || echo %aline%  >> %1 && exit
exit


call :aline %1 %scsi% %aline%
%1为【(1)/TEXTSETUP.OEM】
%scsi%为【roller"】
%aline%为【C】
%p%为【0x40000】
%loop%为【0】

注意%scsi% 的值有一个双引号, 再作为函数参数。 可能引起参数切割的问题

if not "%~3"=="" set tmp=%~3
这行, 显示为:
S1:[if not ""=="" set tmp=%~3 ]
也就是%3而为空。
看代码逻辑,似乎应该为【%aline%】即【C】

文件可能是:
1) 前面的Fn.X问题,导致出现引号这种棘手问题
2) 前面使用Fn.X的问题,导致出现引号这种棘手问题
3) 引号导致参数切割出问题



回复

使用道具 举报

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

使用道具 举报

发表于 2015-1-9 18:07:51 | 显示全部楼层
本帖最后由 mdyblog 于 2015-1-11 10:14 编辑
chenall 发表于 2015-1-9 16:43
这个debug 3的问题我下次修改一下,只要批处理进程没有退出就一直存在.


发现死循环为下面红色代码:

::动态生成txtsetup.oem文件实现免按F6键
:dyn_oem
:dyn_oem
set /a p0=%p%-100
:dyn_oem1
if %p0%==%p% exit 1
set p0=%p%

call Fn.13 %p% "\n" || exit
call Fn.0 0 "%s" %@retval% | set aline =
call :aline %1 %scsi% %aline% && set p=0
goto :dyn_oem1
:aline
if not "%aline%"=="" set tmp=%aline% || exit
call Fn.11 "%2" "%tmp:~-16%" && echo -e \r\n[Scsi]\r\n%aline% >> %1 && exit
if /i ";[iles.scsi.%2]"=="%tmp%" && set loop=0 && echo [Files.scsi.%2] >> %1 && exit
call Fn.11 ";[" "%tmp:~0,2%" && set loop=1 && exit
call Fn.11 "\[" "%tmp:~0,1%" && set loop=0 && echo %aline% >> %1 && exit
call Fn.11 "\;" "%tmp:~0,1%" || call Fn.11 "#" "%tmp:~0,1%" || calc %loop% > nul || echo %aline%  >> %1 && exit
exit

上面替换了2行。
有加了5行,死循环检测。
这样,程序也能成功运行,提示成功,中间打印出3行,(前面2行就是前面的画面)。

但是 PE启动是蓝屏。
估计生成OEM时不正确。OEM文件非法。 导致SATA没有驱动起来。



回复

使用道具 举报

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

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


关于DEBUG,请问下面的脚本怎么单步调试中间的一段
以前的版本是可以轻松单步中间的代码.

!BAT
set s=A
set /a i=10000
:LOOP1
echo [%s%]-%i%
set /a i=%i%-1
if %i%>=1 goto :LOOP1

#前面循环 "执行30000行---30000个回车?" 代码


#调试中间代码
echo [debug begin]
debug 3
set s=%s%B
echo [%s%]111
echo [%s%]222
echo [%s%]333
echo [%s%]444
call :FUN3

debug 0
echo [debug end]


#后面循环 "执行30000行---30000个回车?" 代码
set /a i=10000
:LOOP2
echo [%s%]-%i%
set /a i=%i%-1
if %i%>=1 goto :LOOP2

goto :eof

:FUN3
debug 3
set s=%s%C
echo [%s%]111
echo [%s%]222
echo [%s%]333
echo [%s%]444

goto :eof

还是以前一样,可是随时切换——随时开单步,随时关单步。

是不是规定下, 单步设置为debug 3,  单步取消为debug  -3。 其它值包括0,都不能取消单步设置.
              或者, 单步设置为debug s,   单步取消为debug  -s。
  


回复

使用道具 举报

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

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


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

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

使用道具 举报

发表于 2015-1-9 21:14:20 | 显示全部楼层
本帖最后由 不点 于 2015-1-9 21:33 编辑

grub4dos 在解决内存冲突方面,作了多次的努力。最早的努力,是 gandalf 发现 grub4dos 总是莫名其妙地死机,然后,我们了解到,那是因为 gnu grub legacy 的保护模式堆栈位于较高内存地址造成的。当某些程序片段使用较多堆栈时,就要发生死机了。对此,我们作了两项改进,其一是把保护模式堆栈撤销,与实模式堆栈合并,只保留一个堆栈;其二是把c语言函数内的数组和局部函数都移出到函数体之外,不再占用堆栈。后来又作了一项改进,那就是,把递归函数修改成非递归的函数,用循环来代替递归,大大减轻了堆栈的负担。所以,后来再也没有出现莫名其妙死机的问题了。

为了解决常规内存太少,没有足够的空间来容纳新的功能代码的问题,从 0.4.5 开始,把保护模式的代码移动到扩展内存中,这样就解决了功能无法扩展的问题了。起初我们使用 16M 内存,后来又增加到 32M。由于有了足够的内存,所以,我们从此可以支持运行用户程序了。

现在的程序代码,也有可能在某些局部范围产生内存冲突。但这都是可以定位的,也是可以解决的。

点评

看了最新的源码。 现在用的是一个64K的全局数组——构成一个栈cmd_buffer,来保存cmdline_buf。 这样 89次死机,差不多对上来。  详情 回复 发表于 2015-1-10 10:57
脚本的call :funx 的堆栈在 实模式堆栈 吧。 t.sh: 函数 :FUN有嵌套调用自己。 测试80多次调用后,就死机了。 感觉[/backcolor]好像 F6IMG嵌套 次数 大概这么多。  详情 回复 发表于 2015-1-9 22:19
回复

使用道具 举报

发表于 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 :


回复

使用道具 举报

发表于 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者的结果是不同。

点评

>>chenall: 这个是要16字节对齐 发表于 25 分钟前 应该为: cmd_buffer += (arg_len + 0x0F) & ~0x0F; 不是 //cmd_buffer += (arg_len + 0x10) & -0x10; 后面这个有问题。 假设 arg_len=2 (arg_len  详情 回复 发表于 2015-1-10 11:55
回复

使用道具 举报

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

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

点评

记得之前有限制运行命令时使用栈空间的,超过64K之后就不执行命令的,并给出一个提示,这样就不会死机. 后来可能修改的时候改没了...没注意到,汗.  详情 回复 发表于 2015-1-10 11:29
回复

使用道具 举报

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

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

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

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

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

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

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

使用道具 举报

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

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

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

使用道具 举报

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

使用道具 举报

发表于 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()函数。

回复

使用道具 举报

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

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


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


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

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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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