无忧启动论坛

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

支持含有碎片的文件仿真

    [复制链接]
721#
发表于 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
回复

使用道具 举报

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

回复

使用道具 举报

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

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


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


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

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

使用道具 举报

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

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

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

使用道具 举报

725#
发表于 2015-1-10 11:46:39 | 只看该作者
估计还是和编译器还有环境有关,就像之前的那个速度很慢的问题一样.

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


回复

使用道具 举报

726#
发表于 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字节对齐

点评

~0x0f 和 -0x10是一样的 前面+0x10可以改成+0xf这样会节省一些空间,之前为了尽量保证不冲突. 用+0xf和+0x10的区别, 用0x10的话如果长度刚好是16字节对齐的话会额外占用16字节空间.用0xf就不会.  详情 回复 发表于 2015-1-10 12:02
回复

使用道具 举报

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

使用道具 举报

728#
发表于 2015-1-10 12:05:07 | 只看该作者
chenall 发表于 2015-1-10 12:02
~0x0f 和 -0x10是一样的

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

是的 -0x10 = ~0xF

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

使用道具 举报

729#
发表于 2015-1-10 12:13:22 | 只看该作者
chenall 发表于 2015-1-9 18:06
新上传的版本,解决debug 3的问题.

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

grub4dos-0.4.5c-2015-01-10.7z

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

点评

你的SATA驱动ID是多少?我看看能不能模拟测试下.  详情 回复 发表于 2015-1-10 12:53
回复

使用道具 举报

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

使用道具 举报

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

点评

您可能没有注意看更新说明,还有前面的贴子 新版已经取消了debug 3功能. 改成直接debug了 debug /F6IMG 另外新版的刚发现一个错误,调试的时候'E'功能无效,因为之前的是用O的没改过来,下次再改了.  详情 回复 发表于 2015-1-10 13:48
回复

使用道具 举报

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

使用道具 举报

733#
发表于 2015-1-10 14:03:03 | 只看该作者
本帖最后由 mdyblog 于 2015-1-10 14:45 编辑
chenall 发表于 2015-1-10 13:48
您可能没有注意看更新说明,还有前面的贴子

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


哦, 这样啊。
发现了。

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

点评

我现在还不太清楚这个断点的用法,,你能不能给详细解释一下? 以前动态调试WINDOWS程序的时候,经常看到断点,但我不是很理解(因为我自己设置的总是无效,所以都是直接网上的代码).  详情 回复 发表于 2015-1-10 14:10
回复

使用道具 举报

734#
发表于 2015-1-10 14:10:11 | 只看该作者
mdyblog 发表于 2015-1-10 14:03
哦, 这样啊。
发现了。

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

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

点评

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

使用道具 举报

735#
发表于 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)时, 每次获得一行,检查当前行号是否在 断点列表中。
不是的话,直接运行。
是的话,进入交互模式, 输出调试行,等待用户输入。


点评

程序内部的行号可和批处理的行号不是对应的..(会忽略空行和注释行还有标号行都不算在内)  详情 回复 发表于 2015-1-10 14:46
回复

使用道具 举报

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

使用道具 举报

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

程序内部 ...


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

使用道具 举报

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

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

点评

bat_run_script()中: if ((cmd_buff = grub_malloc(arg_len + 0x800)) == NULL) 为什么要加2K (0x800), 好浪费内存啊? 嵌套39次就是78K了。 还有,你那和系统堆, 初始化为多大,也就是总申请多大就会  详情 回复 发表于 2015-1-10 15:01
回复

使用道具 举报

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

使用道具 举报

740#
发表于 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以上都是.

点评

》》这个系统堆空间就很大了,32MB以上都是. 这么大, 那 前面的 命令行栈,是否也可以放到对里面,或者申请2M的内存作为 命令行栈。 grub正常运行是什么模式,能 直接访问 32M 以上的地址? 默认模式,只能访问  详情 回复 发表于 2015-1-10 15:29
回复

使用道具 举报

741#
发表于 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.
   只有(主程序用)主栈开得很大。

回复

使用道具 举报

742#
发表于 2015-1-11 20:13:18 | 只看该作者
请问C大, 如图的升级信息, 通过什么接口可以获得?


点评

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

使用道具 举报

743#
发表于 2015-1-11 20:30:07 | 只看该作者
2014-0111测试 /F6IMG:


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

点评

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

使用道具 举报

744#
发表于 2015-1-12 08:36:24 | 只看该作者
本帖最后由 不点 于 2015-1-12 08:59 编辑
如果是保护模式, 命令行栈 直接开8M算了(如果够)。


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


目前的堆栈空间是 0x7000 向下扩展至 0x2000,足够用了。如果程序设计不合理,无论多少堆栈也不够用,即使堆栈空间扩大到 4G 也不够用。


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


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

特殊情况下,如果应用程序需要使用超大量的堆栈,程序设计者可以在自己的保护模式程序中,自己开辟堆栈空间,然后切换到自己的保护模式堆栈。


点评

>> 别开这种玩笑。grub4dos 从 0.4.5 开始保留 16M,后来又扩大到 32M 内存,内存占用已经够大,还能再增加 8M 的占用?就算增加到 8M 了,这够用吗?是不是还要增加到 64M 或 256M? 目前的堆栈空间是 0x7000  详情 回复 发表于 2015-1-12 12:28
>> 和你的想法正好相反。保护模式的堆栈空间最容易控制,这由编程者直接控制,你只要优化程序,尽量不占用过多堆栈,就不会产生问题。 ..... 保护模式的程序,都是咱自己设计的,还会有问题吗?如果不慎超限使用  详情 回复 发表于 2015-1-12 12:15
回复

使用道具 举报

745#
发表于 2015-1-12 09:10:18 | 只看该作者
mdyblog 发表于 2015-1-11 20:13
请问C大, 如图的升级信息, 通过什么接口可以获得?

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

不过这个也有缺点.

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

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

使用道具 举报

746#
发表于 2015-1-12 09:11:33 | 只看该作者
mdyblog 发表于 2015-1-11 20:30
2014-0111测试 /F6IMG:

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

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

点评

不知道如何自己编译ipxegrldr  详情 回复 发表于 2015-1-12 10:51
回复

使用道具 举报

747#
发表于 2015-1-12 10:51:48 | 只看该作者
chenall 发表于 2015-1-12 09:11
新的版本只是处理了debug的问题,上次的测试的电脑是别人的,他拿走了,我需要另外找一到电脑测试.

现在 ...

不知道如何自己编译ipxegrldr

1.png (16.44 KB, 下载次数: 199)

1.png

点评

把ipxe的源码下载到grub4dos-src/ipxe这个目录下. 会自动编译,不过看截图你用的是应该是我的那个编译环境 ,这个不支持编译ipxe  详情 回复 发表于 2015-1-12 11:14
回复

使用道具 举报

748#
发表于 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
复制代码
回复

使用道具 举报

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

使用道具 举报

750#
发表于 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内存。
况且, 申请多少 也是动态的,如果真的内存很小,就少申请点。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-6-15 05:57

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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