无忧启动论坛

标题: yaya 看,动态 VHD 更新出现 bug [打印本页]

作者: 不点    时间: 2019-3-24 18:40
标题: yaya 看,动态 VHD 更新出现 bug
原始讨论在 reboot.pro:

http://reboot.pro/topic/21972-reducing-wimboot-source-wim-file-using-lzx-compression-and-vhd-using-gzip-compression-to-save-room-and-also-load-faster-on-ram/page-2

第 50 楼 karyonix 的发言:

See the diff of stage2/dec_vhd.c in 2017-12-23.

https://github.com/chenall/grub4dos/commit/05379e7b66b71e5665bc5bedda75a58ca74c485a#diff-8f02b0c8853e02d562dc585d418454e3

The codes to read hard disk footer in line 185 and read dynamic disk header in line 209 were just "disabled".


有问题的更动如下:

  1. stage2/dec_vhd.c

  2. @@ -182,7 +182,7 @@ dec_vhd_open(void)
  3.         memset(&footer, 0, sizeof(footer));
  4.         memset(&dynaheader, 0, sizeof(dynaheader));

  5. -        int bytesread = (int)grub_read((unsigned long)&footer, 0x200, 0xedde0d90);
  6. +        //int bytesread = (int)grub_read((unsigned long)&footer, 0x200, 0xedde0d90);

  7.         //if (bytesread < 511) {
  8.                 // grub_printf("bytesread %d < 511\n",bytesread);
  9. @@ -206,7 +206,7 @@ dec_vhd_open(void)
  10.                         goto quit;
  11.                 }
  12.                 filepos = footer.dataOffset;
  13. -                bytesread = (int)grub_read((unsigned long)&dynaheader, sizeof(dynaheader), 0xedde0d90);
  14. +                //bytesread = (int)grub_read((unsigned long)&dynaheader, sizeof(dynaheader), 0xedde0d90);
  15. //        }

  16.         vhdfc = (VHDFileControl*) grub_malloc(sizeof(VHDFileControl));
复制代码


这个更动导致动态 VHD 不再能够支持了。


作者: 2011yaya2007777    时间: 2019-3-24 21:46
这个不是我修改的。之所以注释掉,可能有他的道理。也许是为了解决某一问题,而引起现在这个现象。如果采取简单的办法,恢复补丁,可能又重现以前的问题。
作者: 不点    时间: 2019-3-24 22:17
原始代码是谁写的?如果知道的话,可以联系原始作者。

如果不是你修改的,那有可能是 chenall 修改的。

我觉得你可以试着修复,修复坏了再改回来也没啥要紧的。

另外,也可留意那个讨论,说不定有人会给出修复,也未可知。

作者: 不点    时间: 2019-3-24 22:36
本帖最后由 不点 于 2019-3-24 22:47 编辑

我猜一下。估计是这样的:

bytesread 变量只被赋值,而未被其它地方使用,因此,编译器可能提示这是个没用的变量。修改的人(不管是谁修改的)为了让编译器不报警,就简单注释掉了。

虽然这个变量确实没用,但是,注释掉的话,连同 grub_read 读盘调用也一起注释掉了,那么缓冲区 footer 和 dynaheader 都没有填充有效数据,显然这两个变量(footer 和 dynaheader)也就都废掉了。因此,简单注释掉是不行的。


为了让编译器不报警,可以增添一句:


bytesread = bytesread;


这一句 “废话”,可以让 bytesread 有被用到一次,这样编译器就不会报警了。


gcc 会把这句废话优化掉。因此,添上这句,不增加生成的代码大小。



作者: 2011yaya2007777    时间: 2019-3-25 09:31
昨天是从手机看的这个帖子,打不开补丁文件。今天从电脑上网,打开补丁文件一看,确实是我更改的。正如不点说言,由于编译时报警,说 bytesread 未使用,就给注释掉来,没有考虑 grub_read 读盘。不好意思!
作者: 2011yaya2007777    时间: 2019-3-25 10:41
已经修正,上传官网。有劳不点通知一下reboot.pro。
作者: 不点    时间: 2019-3-25 11:38
2011yaya2007777 发表于 2019-3-25 09:31
昨天是从手机看的这个帖子,打不开补丁文件。今天从电脑上网,打开补丁文件一看,确实是我更改的。正如不点 ...

是你就好。那么问题也就解决了。

我猜中了 gcc 报警的场景。

我这就去 reboot.pro 给个消息。

作者: 不点    时间: 2019-3-26 11:38
来自 reboot.pro 的反馈说,新版现在工作得很好。
作者: 2011yaya2007777    时间: 2019-3-26 12:48
解决了就好
作者: cchessbd    时间: 2019-3-27 10:36
本帖最后由 cchessbd 于 2019-3-27 10:40 编辑

不点大大真是太牛了。连编译器在想什么都能猜出来。服。




欢迎光临 无忧启动论坛 (http://wuyou.net./) Powered by Discuz! X3.3