无忧启动论坛

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

支持含有碎片的文件仿真

    [复制链接]
1171#
 楼主| 发表于 2017-8-26 12:39:35 来自手机 | 只看该作者
谢谢测试。问题解决。

点评

还是你上给为grldr (20170826测试版) 我又做了新测试, 这次NTLDR-2003抱怨地位内存不够。 你可能需要处理这种情况。 就是再分配一个大内存盘,将某一大块内存耗光。(整个系统4G小空闲内存还一大把) 其他一  详情 回复 发表于 2017-8-26 13:22
回复

使用道具 举报

1172#
发表于 2017-8-26 13:22:09 | 只看该作者
本帖最后由 mdyblog 于 2017-8-26 13:24 编辑
2011yaya2007777 发表于 2017-8-26 12:39
谢谢测试。问题解决。

还是你上面给为grldr (20170826测试版)
我又做了新测试, 这次NTLDR-2003抱怨低位内存不够----同前图。

你可能需要处理这种情况。
就是再分配一个大内存盘,将某一大块内存耗光。(整个系统4G小空闲内存还一大把)
其他一致。结果不能运行。

下面是displaymem 和map --status 信息。
map --mem=0x201000 (md)0x800+0x4A3C98 (100)

EISA Memory BIOS Interface is present
Address Map BIOS Interface is present
Lower memory: 630K, Upper memory (to first chipset hole): 523264K
[Address Range Descriptor entries immediately follow (values are 64-bit)]
  Usable RAM: Base: 0x0, Length: 0x9D800
  Reserved: Base: 0x9D800, Length: 0x2800
  Reserved: Base: 0xE0000, Length: 0x20000
  Usable RAM: Base: 0x100000, Length: 0x1FF00000
  Reserved: Base: 0x20000000, Length: 0x200000
  Usable RAM: Base: 0x20200000, Length: 0x1FE00000
  Reserved: Base: 0x40000000, Length: 0x200000
  Usable RAM: Base: 0x40200000, Length: 0x94793000 <===14在这里    <===01也在这里,在14前面 ,死磕--磕光你!
  Reserved: Base: 0xD4993000, Length: 0x250B000
  Reserved: Base: 0xD6E9E000, Length: 0xF1000
  Reserved: Base: 0xD6F8F000, Length: 0x70000
  Usable RAM: Base: 0xD6FFF000, Length: 0x1000
  Reserved: Base: 0xD7000000, Length: 0x800000
  Reserved: Base: 0xD7800000, Length: 0x8200000
  Reserved: Base: 0xF8000000, Length: 0x4000000
  Reserved: Base: 0xFE800000, Length: 0x10000
  Reserved: Base: 0xFEC00000, Length: 0x1000
  Reserved: Base: 0xFED08000, Length: 0x1000
  Reserved: Base: 0xFED10000, Length: 0x8000
  Reserved: Base: 0xFED18000, Length: 0x1000
  Reserved: Base: 0xFED19000, Length: 0x1000
  Reserved: Base: 0xFED1C000, Length: 0x4000
  Reserved: Base: 0xFEE00000, Length: 0x1000
  Reserved: Base: 0xFFD80000, Length: 0x280000
  Usable RAM: Base: 0x100000000, Length: 0x11FE00000

floppies_orig=0, harddrives_orig=2, floppies_curr=0, harddrives_curr=2

Number of ATAPI CD-ROMs: 0

ram_drive=0x7F, rd_base=0x0, rd_size=0x100000000

Fr To Hm Sm To_C _H _S   Start_Sector     Sector_Count   DHR
-- -- -- -- ---- -- -- ---------------- ---------------- ---
14 FF 01 12 83FF FE 7F 00000000006A4C90 0000000000000008 M=S
01 FF FE 3F 83FF FE 7F 0000000000201000 00000000004A3C90 M=S  <====测试加的

回复

使用道具 举报

1173#
发表于 2017-8-26 14:13:01 | 只看该作者
2011yaya2007777 发表于 2017-8-26 09:51
我的猜测是:
(0x14)内存盘映射在 "Usable RAM: Base: 0xD6FFF000, Length: 0x1000",从而误导Windows XP在 ...

我猜不是那么回事。我的修复也弄好了,让 mdyblog 试试我的修复,看看成功不成功?

这里要说说怎么样才叫 “成功”:无论内存盘放在哪一个内存块上(与内存块长度无关,长度为 0x1000 也行),都能通过 Windows 这个衙门(关卡),而顺利启动——这才算是成功。

在上述这个 “成功”的定义之下,请 mdyblog 试试我的补丁,看看是否成功(当然希望成功了)。


附件解压后含有 asm.S.diff 和 asm.S.new 两个文件。

asm.S.diff 是补丁文件,只是为了方便大家查看代码究竟有哪些改动。

asm.S.new 改名为 asm.S,替换 2017-06-25 的 0.4.6a 中的 asm.S,重新编译即可。

我暂时没有编译环境,请 yaya 编译一个版本,供 mdyblog 测试。

如果 mdyblog 自己有编译环境,那 mdyblog 就可以自己来编译、测试了。


asm.tar.gz

88.8 KB, 下载次数: 7

包含补丁文件和 asm.S.new 文件,供测试。只含源代码,需要编译后才能用。

点评

这个有效。 NTLDR-2003没有任何抱怨,启动正常。 displaymem 和 map --status如下: EISA Memory BIOS Interface is present Address Map BIOS Interface is present Lower memory: 630K, Upper memory (to  详情 回复 发表于 2017-8-26 15:09
回复

使用道具 举报

1174#
发表于 2017-8-26 15:09:32 | 只看该作者
本帖最后由 mdyblog 于 2017-8-26 15:13 编辑
不点 发表于 2017-8-26 14:13
我猜不是那么回事。我的修复也弄好了,让 mdyblog 试试我的修复,看看成功不成功?

这里要说说怎么样 ...

这个补丁有效。 NTLDR-2003没有任何抱怨,启动正常。

displaymem 和 map --status如下:
EISA Memory BIOS Interface is present
Address Map BIOS Interface is present
Lower memory: 630K, Upper memory (to first chipset hole): 523264K
[Address Range Descriptor entries immediately follow (values are 64-bit)]
  Usable RAM: Base: 0x0, Length: 0x9D800
  Reserved: Base: 0x9D800, Length: 0x2800
  Reserved: Base: 0xE0000, Length: 0x20000
  Usable RAM: Base: 0x100000, Length: 0x1FF00000
  Reserved: Base: 0x20000000, Length: 0x200000
  Usable RAM: Base: 0x20200000, Length: 0x1FE00000
  Reserved: Base: 0x40000000, Length: 0x200000
  Usable RAM: Base: 0x40200000, Length: 0x94793000
  Reserved: Base: 0xD4993000, Length: 0x250B000
  Reserved: Base: 0xD6E9E000, Length: 0xF1000
  Reserved: Base: 0xD6F8F000, Length: 0x70000
  Usable RAM: Base: 0xD6FFF000, Length: 0x1000
  Reserved: Base: 0xD7000000, Length: 0x800000
  Reserved: Base: 0xD7800000, Length: 0x8200000
  Reserved: Base: 0xF8000000, Length: 0x4000000
  Reserved: Base: 0xFE800000, Length: 0x10000
  Reserved: Base: 0xFEC00000, Length: 0x1000
  Reserved: Base: 0xFED08000, Length: 0x1000
  Reserved: Base: 0xFED10000, Length: 0x8000
  Reserved: Base: 0xFED18000, Length: 0x1000
  Reserved: Base: 0xFED19000, Length: 0x1000
  Reserved: Base: 0xFED1C000, Length: 0x4000
  Reserved: Base: 0xFEE00000, Length: 0x1000
  Reserved: Base: 0xFFD80000, Length: 0x280000
  Usable RAM: Base: 0x100000000, Length: 0x11FE00000

floppies_orig=0, harddrives_orig=2, floppies_curr=0, harddrives_curr=2

Number of ATAPI CD-ROMs: 0

ram_drive=0x7F, rd_base=0x0, rd_size=0x100000000

Fr To Hm Sm To_C _H _S   Start_Sector     Sector_Count   DHR
-- -- -- -- ---- -- -- ---------------- ---------------- ---
14 FF 01 12 83FF FE 7F 00000000006B7FF8 0000000000000008 M=S
回复

使用道具 举报

1175#
 楼主| 发表于 2017-8-26 15:11:35 | 只看该作者
麻烦 mdyblog 再测试一下。不要吃光内存,而是留下小于512Kb,即496Kb。
map --mem=0x201000 (md)0x800+0x4A38B8 (100)

点评

还是你上面给为grldr (20170826测试版) 我又做了新测试, 这次NTLDR-2003抱怨低位内存不够----同前图。 就是再分配一个大内存盘,将某一大块内存耗光。(整个系统4G小空闲内存还一大把) 其他一致。结果不能运  详情 回复 发表于 2017-8-26 15:46
回复

使用道具 举报

1176#
发表于 2017-8-26 15:46:05 | 只看该作者
本帖最后由 mdyblog 于 2017-8-26 15:48 编辑
2011yaya2007777 发表于 2017-8-26 15:11
麻烦 mdyblog 再测试一下。不要吃光内存,而是留下小于512Kb,即496Kb。
map --mem=0x201000 (md)0x800+0x ...

还是你上面给为grldr (20170826测试版)
新测试, 这次NTLDR-2003抱怨低位内存不够----同前图。
就是再分配一个大内存盘,将某一大块内存耗光。(整个系统4G小空闲内存还一大把)
其他一致。结果不能运行。
map --mem=0x201000 (md)0x800+0x4A3C98 (100)

请继续看后面的测试。

下面是displaymem 和map --status 信息:
EISA Memory BIOS Interface is present
Address Map BIOS Interface is present
Lower memory: 630K, Upper memory (to first chipset hole): 523264K
[Address Range Descriptor entries immediately follow (values are 64-bit)]
  Usable RAM: Base: 0x0, Length: 0x9D800
  Reserved: Base: 0x9D800, Length: 0x2800
  Reserved: Base: 0xE0000, Length: 0x20000
  Usable RAM: Base: 0x100000, Length: 0x1FF00000
  Reserved: Base: 0x20000000, Length: 0x200000
  Usable RAM: Base: 0x20200000, Length: 0x1FE00000
  Reserved: Base: 0x40000000, Length: 0x200000
  Usable RAM: Base: 0x40200000, Length: 0x94793000 <===14在这里    <===100也在这里,在14前面
  Reserved: Base: 0xD4993000, Length: 0x250B000
  Reserved: Base: 0xD6E9E000, Length: 0xF1000
  Reserved: Base: 0xD6F8F000, Length: 0x70000
  Usable RAM: Base: 0xD6FFF000, Length: 0x1000
  Reserved: Base: 0xD7000000, Length: 0x800000
  Reserved: Base: 0xD7800000, Length: 0x8200000
  Reserved: Base: 0xF8000000, Length: 0x4000000
  Reserved: Base: 0xFE800000, Length: 0x10000
  Reserved: Base: 0xFEC00000, Length: 0x1000
  Reserved: Base: 0xFED08000, Length: 0x1000
  Reserved: Base: 0xFED10000, Length: 0x8000
  Reserved: Base: 0xFED18000, Length: 0x1000
  Reserved: Base: 0xFED19000, Length: 0x1000
  Reserved: Base: 0xFED1C000, Length: 0x4000
  Reserved: Base: 0xFEE00000, Length: 0x1000
  Reserved: Base: 0xFFD80000, Length: 0x280000
  Usable RAM: Base: 0x100000000, Length: 0x11FE00000

floppies_orig=0, harddrives_orig=2, floppies_curr=0, harddrives_curr=2

Number of ATAPI CD-ROMs: 0

ram_drive=0x7F, rd_base=0x0, rd_size=0x100000000

Fr To Hm Sm To_C _H _S   Start_Sector     Sector_Count   DHR
-- -- -- -- ---- -- -- ---------------- ---------------- ---
14 FF 01 12 83FF FE 7F 00000000006A4C90 0000000000000008 M=S
64 FF FE 3F 83FF FE 7F 0000000000201000 00000000004A3C90 M=S  <====测试加的
怎么和前面的测试一样,耗光了????






哦,map应该是
map --mem=0x2013E0  (md)0x800+0x4A38B0  (100)
这次 NTLDR-2003没有任何抱怨,启动成功。
下面是displaymem 和map --status 信息:
EISA Memory BIOS Interface is present
Address Map BIOS Interface is present
Lower memory: 630K, Upper memory (to first chipset hole): 523264K
[Address Range Descriptor entries immediately follow (values are 64-bit)]
  Usable RAM: Base: 0x0, Length: 0x9D800
  Reserved: Base: 0x9D800, Length: 0x2800
  Reserved: Base: 0xE0000, Length: 0x20000
  Usable RAM: Base: 0x100000, Length: 0x1FF00000
  Reserved: Base: 0x20000000, Length: 0x200000
  Usable RAM: Base: 0x20200000, Length: 0x1FE00000
  Reserved: Base: 0x40000000, Length: 0x200000
  Usable RAM: Base: 0x40200000, Length: 0x94793000 <===14在这里    <===100也在这里,在14前面 <====100前面有496K空闲
  Reserved: Base: 0xD4993000, Length: 0x250B000
  Reserved: Base: 0xD6E9E000, Length: 0xF1000
  Reserved: Base: 0xD6F8F000, Length: 0x70000
  Usable RAM: Base: 0xD6FFF000, Length: 0x1000
  Reserved: Base: 0xD7000000, Length: 0x800000
  Reserved: Base: 0xD7800000, Length: 0x8200000
  Reserved: Base: 0xF8000000, Length: 0x4000000
  Reserved: Base: 0xFE800000, Length: 0x10000
  Reserved: Base: 0xFEC00000, Length: 0x1000
  Reserved: Base: 0xFED08000, Length: 0x1000
  Reserved: Base: 0xFED10000, Length: 0x8000
  Reserved: Base: 0xFED18000, Length: 0x1000
  Reserved: Base: 0xFED19000, Length: 0x1000
  Reserved: Base: 0xFED1C000, Length: 0x4000
  Reserved: Base: 0xFEE00000, Length: 0x1000
  Reserved: Base: 0xFFD80000, Length: 0x280000
  Usable RAM: Base: 0x100000000, Length: 0x11FE00000

floppies_orig=0, harddrives_orig=2, floppies_curr=0, harddrives_curr=2

Number of ATAPI CD-ROMs: 0

ram_drive=0x7F, rd_base=0x0, rd_size=0x100000000

Fr To Hm Sm To_C _H _S   Start_Sector     Sector_Count   DHR
-- -- -- -- ---- -- -- ---------------- ---------------- ---
14 FF 01 12 83FF FE 7F 00000000006A4C90 0000000000000008 M=S
64 FF FE 3F 83FF FE 7F 00000000002013E0 00000000004A38B0 M=S  <====测试加的

(100)前面还有:
LEN=0x2013E0*0x200 - 0x40200000 = 0x7C000=496K


回复

使用道具 举报

1177#
 楼主| 发表于 2017-8-26 16:14:38 | 只看该作者
本帖最后由 2011yaya2007777 于 2017-8-26 16:38 编辑

如果首先分配(0x64),再分配(0x14),则在(0x14)后面剩余小于512Kb空间。
map --mem=0x201000 (md)0x800+0x4A38B0 (100)

先使用测试版本,麻烦再使用不点的补丁试一试。
回复

使用道具 举报

1178#
发表于 2017-8-26 16:20:56 | 只看该作者
我感觉,既然 mdyblog 测试 asm.S.new 成功,那就证实了我前面的猜测。于是我们就又摸清楚了 Windows 的一个 “脾气”,即,Windows 不喜欢存在 “长度为 0”的内存块。一旦存在这样的内存块,Windows 就“乱了阵脚”或 “找不到北”了。

当一个内存块被(一个或多个)内存盘占据时,剩余未被占据的部分,如果恰好是 0(也即正好全部被内存盘占满),这是旧版本的 grub4dos 处理不好(无法处理)的情况。旧版本的 grub4dos 用 int15 来返回 0 的可用内存块长度给 int15 的调用者(比如操作系统)。Windows 遇上这个 0 长度的内存块,彻底乱套,拒绝继续启动。

我的解决办法是:当这种情况发生时,不修改这个可用内存块(usable RAM)的长度,即,保持这个内存块长度不变,而把它的 type(类型) 从 “usable RAM(用户可用)”更改成 “reserved(系统保留,用户不可用)”。这就完美解决了。

错误的技术根源猜测。我猜 Windows
(有可能)把长度为 0 的内存块当成长度为 4G(=2 的 32 次方) 来处理了,也有可能是当作 2 的 64 次方来处理了,于是就全乱了。大家很熟悉:在二进制表示中,负1(即 “-1”) 与最大的数是相同的,而“最大的数”再加上 1,就等于 0。所以,在 long 整数(即 32 位整数)中,0 和 4G 是一样的(4G 就是 2 的 32 次方)。在 long long 整数(即 64 位整数)中,0 就等于 2 的 64 次方(可以粗略理解为 “无限大”)。

换句话说,Windows 的实模式启动代码把长度为 0 的内存块(有可能)当成长度为“无限大”来处理了。那么,由于 Windows 认为整个内存全部被(这个内存块)占用,完全没有可用内存了。于是,Windows 就认为内存不够了。因此,它就要报错,并且拒绝继续启动 Windows 的内核。


回复

使用道具 举报

1179#
发表于 2017-8-26 18:04:05 | 只看该作者
本帖最后由 mdyblog 于 2017-8-26 18:53 编辑
2011yaya2007777 发表于 2017-8-26 16:14
如果首先分配(0x64),再分配(0x14),则在(0x14)后面剩余小于512Kb空间。
map --mem=0x201000 (md)0x80 ...



还是你上面给为grldr (20170826测试版)
后面留496K,抱怨,不能启动

map --status:
Fr To Hm Sm To_C _H _S   Start_Sector     Sector_Count   DHR
-- -- -- -- ---- -- -- ---------------- ---------------- ---
14 FF 01 12 83FF FE 7F 00000000006A48B0 0000000000000008 M=S
64 FF FE 3F 83FF FE 7F 0000000000201000 00000000004A38B0 M=S
Usable RAM: Base: 0x40200000, Length: 0x94793000 内存块的使用情况:
0x40200000:                    (100)                    (14)        【free】      
                            (100)=2432580K                (14)=4K        free=496K




还做了3个测试.
前留4K,没有抱怨,可以启动,
Fr To Hm Sm To_C _H _S   Start_Sector     Sector_Count   DHR
-- -- -- -- ---- -- -- ---------------- ---------------- ---
14 FF 01 12 83FF FE 7F 00000000006A4C90 0000000000000008 M=S
64 FF FE 3F 83FF FE 7F 0000000000201008 00000000004A3C88 M=S
Usable RAM: Base: 0x40200000, Length: 0x94793000 内存块的使用情况:
0x40200000:   【free】                          (100)                        (14)  
               free=4K                       (100)=2432580K                   (14)=4K      


后面留4K,抱怨,不能启动
Fr To Hm Sm To_C _H _S   Start_Sector     Sector_Count   DHR
-- -- -- -- ---- -- -- ---------------- ---------------- ---
14 FF 01 12 83FF FE 7F 00000000006A4C88 0000000000000008 M=S
64 FF FE 3F 83FF FE 7F 0000000000201000 00000000004A3C88 M=S
Usable RAM: Base: 0x40200000, Length: 0x94793000 内存块的使用情况:
0x40200000:                         (100)                        (14)    【free】  
                                  (100)=2432580K                   (14)=4K     free=4K

中间留4K,抱怨,不能启动
Fr To Hm Sm To_C _H _S   Start_Sector     Sector_Count   DHR
-- -- -- -- ---- -- -- ---------------- ---------------- ---
14 FF 01 12 83FF FE 7F 00000000006A4C90 0000000000000008 M=S
64 FF FE 3F 83FF FE 7F 0000000000201000 00000000004A3C88 M=S
Usable RAM: Base: 0x40200000, Length: 0x94793000 内存块的使用情况:
0x40200000:                         (100)                        【free】    (14)   
                                  (100)=2432580K                   free=4K     (14)=4K


可能方向:
    分配内存盘的时候,保证该块前面4K的footprint剩余空间。
再配合不点的补丁,防止漏网之鱼。





回复

使用道具 举报

1180#
 楼主| 发表于 2017-8-27 08:00:01 | 只看该作者
明白了。不是剩余空间不足512kb时,Windows XP报警,而是如不点所言,剩余空间为零时,Windows XP报警,返回“0K”错误提示。
回复

使用道具 举报

1181#
 楼主| 发表于 2017-8-27 10:13:20 | 只看该作者
本帖最后由 2011yaya2007777 于 2017-10-5 12:02 编辑

还请mdyblog再测试一下。正常测试。
回复

使用道具 举报

1182#
发表于 2017-8-27 11:37:15 | 只看该作者
2011yaya2007777 发表于 2017-8-27 10:13
还请mdyblog再测试一下。正常测试。


实际机器测试, 能正常启动,没有抱怨。

map --status:
Fr To Hm Sm To_C _H _S   Start_Sector     Sector_Count   DHR
-- -- -- -- ---- -- -- ---------------- ---------------- ---
14 FF 01 12 83FF FE 7F 00000000006A4C90 0000000000000008 M=S

另外,显示的版本是0826, 不是0827.
回复

使用道具 举报

1183#
 楼主| 发表于 2017-8-27 11:54:35 | 只看该作者
他怎么位于6A4C90?而不是6B7FF8?
回复

使用道具 举报

1184#
发表于 2017-8-27 12:00:35 | 只看该作者
2011yaya2007777 发表于 2017-8-27 11:54
他怎么位于6A4C90?而不是6B7FF8?

是啊,浪费了 6B7FF8 处的空间。莫非 mdyblog 抄错了?mdyblog 是不是简单复制粘贴前面一帖的内容了?
回复

使用道具 举报

1185#
 楼主| 发表于 2017-8-27 12:11:08 | 只看该作者
直接使用grldr,不用编译。
回复

使用道具 举报

1186#
发表于 2017-8-27 13:11:40 | 只看该作者
本帖最后由 mdyblog 于 2017-8-27 13:14 编辑
不点 发表于 2017-8-27 12:00
是啊,浪费了 6B7FF8 处的空间。莫非 mdyblog 抄错了?mdyblog 是不是简单复制粘贴前面一帖的内容了?


肯定是今天测试的,不是copy昨天的。
LOG中还打印了%@DATE% %@TIME%
2017-08-27 11:27:47


floppies_orig=0, harddrives_orig=2, floppies_curr=0, harddrives_curr=3

Number of ATAPI CD-ROMs: 0

ram_drive=0x7F, rd_base=0x0, rd_size=0x100000000

Fr To Hm Sm To_C _H _S   Start_Sector     Sector_Count   DHR
-- -- -- -- ---- -- -- ---------------- ---------------- ---
14 FF 01 12 83FF FE 7F 00000000006A4C90 0000000000000008 M=S

不知道grldr的版本对不,怎么是0826? 不是今天编译的么?

我没编译,直接用 grldr。

6A4C90 真是我想要的地址。 你不是这么设计的么。真的要分配那个4K的碎片么? 觉得最好不要改变属性的好。 4K无所谓的。



我再测一遍。
回复

使用道具 举报

1187#
发表于 2017-8-27 13:16:20 | 只看该作者
本帖最后由 不点 于 2017-8-27 14:11 编辑
2011yaya2007777 发表于 2017-8-27 12:11
直接使用grldr,不用编译。

好像程序是错的,yaya。

  1.          subl        %es:(%di), %eax
  2.          sbbl        %es:4(%di), %edx        /* EDX:EAX=new length */
  3.          jb        5f                        /* start_address is below the base */
  4. +        /* now EDX=0 */ 此处怎能断定 EDX=0 ?  在 4G 以上的空间,它可能是大于 0 的。用的是 64 位地址,不是 32 位。EDX 是 高32位,EAX 是低32位
  5. +        testl        %eax, %eax                /* EAX also be zero? ZF holds it! */
  6. +        jne 7f
  7. +        /* Change memory address type from 1 (usable) to 2 (reserved). Note
  8. +         * that original value is long integer of 1 (all higher 3 bytes = 0).
  9. +         * So only the lowest byte needs to be incremented. */
  10. +        incb        %es:16(%di)                /* memory address type */
  11. +        jmp        5f
  12. +7:
  13.          subl        %es:8(%di), %eax
  14.          sbbl        %es:12(%di), %edx        /* EDX:EAX=difference */
  15.          jnb        5f                        /* new length is too big */
复制代码


就算 mdyblog 测试通过了,有问题的代码也是不能用的。

补充:感觉 yaya 的程序确实比我的简化了不少。赞!上述毛病稍微改进一下,不知道行不行:


  1.          subl        %es:(%di), %eax
  2.          sbbl        %es:4(%di), %edx        /* EDX:EAX=new length */
  3.          jb        5f                        /* start_address is below the base */
  4. +        ja        7f        <-------------------  就增加这一句
  5. +        /* now EDX=0 */
  6. +        testl        %eax, %eax                /* EAX also be zero? ZF holds it! */
  7. +        jne 7f
  8. +        /* Change memory address type from 1 (usable) to 2 (reserved). Note
  9. +         * that original value is long integer of 1 (all higher 3 bytes = 0).
  10. +         * So only the lowest byte needs to be incremented. */
  11. +        incb        %es:16(%di)                /* memory address type */
  12. +        jmp        5f
  13. +7:
  14.          subl        %es:8(%di), %eax
  15.          sbbl        %es:12(%di), %edx        /* EDX:EAX=difference */
  16.          jnb        5f                        /* new length is too big */
复制代码

我的那个程序可能比较罗嗦、复杂,但逻辑的正确性是没问题的(我只是检查了几遍,没发现问题;也不敢肯定真的没问题)。要是上述这个代码在逻辑上没问题的话,那可是非常漂亮的了。
回复

使用道具 举报

1188#
发表于 2017-8-27 13:19:34 | 只看该作者
mdyblog 发表于 2017-8-27 13:11
肯定是今天测试的,不是copy昨天的。
LOG中还打印了%@DATE% %@TIME%
2017-08-27 11:27:47


没有使用最高的可用地址,就是错误啊(程序的逻辑包含着错误,属于 bug)。与你想不想节约这点空间没关系。

回复

使用道具 举报

1189#
发表于 2017-8-27 14:44:24 | 只看该作者
本帖最后由 mdyblog 于 2017-8-27 14:46 编辑

2011yaya2007777 发表于 2017-8-27 12:11
直接使用grldr,不用编译。


这次先升级到2016 在升级到这个版本, 确认版本变化了。
这次版本对了,果然是20170827

能启动,无抱怨。

----2017-08-27 14:36:40----

*0x8278 GRUB4DOS:20170827


floppies_orig=0, harddrives_orig=2, floppies_curr=0, harddrives_curr=2

Number of ATAPI CD-ROMs: 0

ram_drive=0x7F, rd_base=0x0, rd_size=0x100000000

Fr To Hm Sm To_C _H _S   Start_Sector     Sector_Count   DHR
-- -- -- -- ---- -- -- ---------------- ---------------- ---
14 FF 01 12 83FF FE 7F 00000000006B7FF8 0000000000000008 M=S
果然是 6B7FF8

对不起了,前面测试的版本不对。

回复

使用道具 举报

1190#
 楼主| 发表于 2017-8-27 14:57:46 | 只看该作者
本帖最后由 2011yaya2007777 于 2017-8-27 14:59 编辑

不点所言极是,确实应当增加
04.+        ja        7f        <-------------------  就增加这一句

我现在也可以再现 “Windows 0K"错误了。
回复

使用道具 举报

1191#
发表于 2017-8-27 15:34:19 | 只看该作者
2011yaya2007777 发表于 2017-8-27 14:57
不点所言极是,确实应当增加
04.+        ja        7f

昨天我写代码,纠结了半天,费了不少工夫。看到我以前写的这段 int15_e820_handler 代码,我甚至觉得很棒、很简练,有些地方竟然看不懂,还要琢磨半晌才能弄懂,就好像不是我写的一样。这说明,我现在的水平已经下降了!可能是脑细胞退化了吧!有点悲哀,但不能不承认。

chenall、yaya 你们比我可年轻多了。我希望你们到我这岁数的时候,可不要像我这样了。趁着你们现在年轻,要多多的用脑子,宝剑锋自磨砺出,脑子不用就迟钝了。当然了,身体是第一位的,一定要注意营养,注意锻炼,注意休息。

我现在脑子不好使,暂时没有发现上述代码是否有别的问题。yaya 可再检查确认一下。
回复

使用道具 举报

1192#
 楼主| 发表于 2017-8-27 18:35:23 | 只看该作者
看到我以前写的这段 int15_e820_handler 代码,我甚至觉得很棒、很简练,有些地方竟然看不懂,还要琢磨半晌才能弄懂,就好像不是我写的一样。这说明,我现在的水平已经下降了!可能是脑细胞退化了吧!有点悲哀,但不能不承认。

其实都一样。自己写代码时比较清楚,过上一段时间再看,就难理解了。所以我现在尽量备注详细的说明,以便将来查询。
回复

使用道具 举报

1193#
 楼主| 发表于 2017-8-28 19:20:11 来自手机 | 只看该作者
补丁已经上传。
回复

使用道具 举报

1194#
 楼主| 发表于 2017-8-29 09:11:55 | 只看该作者
经过进一步测试,结论如下:
使用 int15/eax=e820, 返回4Gb以下可用内存块(4Gb及以上可用内存块无影响),当长度为零时, Windows XP 会提示:
windows nt has found only 0k low memory.  512k of low memory is required to run windows nt.  you may need to upqrade your computer or run a configuration program provided by the manufacturer.
回复

使用道具 举报

1195#
发表于 2017-8-29 09:23:01 | 只看该作者
2011yaya2007777 发表于 2017-8-29 09:11
经过进一步测试,结论如下:
使用 int15/eax=e820, 返回4Gb以下可用内存块(4Gb及以上可用内存块无影响), ...

非常好,又弄清楚了一个问题。这也间接说明 XP 不去处理 4G 以上的内存。可以试试 64 位的操作系统(Win7~Win10),看看情况又有什么不同?说不定 0K 问题不存在了,也未可知。弄清楚总是有好处的。

假如 Win7~Win10 不存在 0K 问题,说明微软认为 XP 是个 bug,已经修复。

假如 Win7~Win10 也存在 0K 问题,说明微软所理解的 int15 规范是不允许有 0 长度的内存块的。


回复

使用道具 举报

1196#
 楼主| 发表于 2017-8-29 16:15:58 | 只看该作者
经测试,Win7~Win10 不存在 0K 问题。
看来 WinXP 启动时检查 4Gb 以下的所有可用内存块,如果长度为零就报 0K 错误。
可能 Win 觉得所有程序都在我的壳下运行,是谁先占用了内存块?
不过 WinXP 反馈的信息有待商榷。它说低内存,让人误解为常规内存不足。再说与分配 512Kb 内存有何关系,这一块内存为零,你可以在另一块内存分配吗。
回复

使用道具 举报

1197#
发表于 2017-8-29 17:54:17 | 只看该作者
2011yaya2007777 发表于 2017-8-29 16:15
经测试,Win7~Win10 不存在 0K 问题。
看来 WinXP 启动时检查 4Gb 以下的所有可用内存块,如果长度为零就 ...

关于 XP 反馈的信息,你给出的这种解释,或许不符合 Windows XP 开发者的想法。Windows 开发者有可能是把内存块长度减去 1,算出内存块最末尾的字节(相对于内存块开头)的偏移量。0 长度算出的最大偏移量就是 0xFFFFFFFF 了。既然有这么大的一个偏移量,就相当于说,该内存块占满了所有的内存,于是,常规内存也被 “吞噬”,或者说,与该内存块 “有重叠”。如果 “被吞噬” 的常规内存算作 “不存在” 的话,那么,常规内存量就成为 0 了。

XP 所说的 512K,是指常规内存底端的 512K,这不能随便从别处分配(不能位于扩展内存中)。它是指 “起始于物理地址 0,终止于物理地址 0x80000” 的这段常规内存。Windows 启动程序(甚至 Windows 内核),有可能使用这 512K 的空间。只要这个空间被别的软件占用,Windows 就要报错。

Win7~Win10 可能发现 XP(对于长度为 0 的内存块)的那种 “理解” 太过于 “绕弯”,于是就纠正过来了。这说明微软(或者 Windows 的开发者)认为 XP 的那种处理,是个 bug。
回复

使用道具 举报

1198#
 楼主| 发表于 2017-8-29 18:14:18 来自手机 | 只看该作者
长度是指基地址开始的长度。如果觉得太大,那也是从基地址开始的长度太大,此时不应当包含常规内存吧。
回复

使用道具 举报

1199#
发表于 2017-8-30 00:00:12 | 只看该作者
2011yaya2007777 发表于 2017-8-29 18:14
长度是指基地址开始的长度。如果觉得太大,那也是从基地址开始的长度太大,此时不应当包含常规内存吧。

现在不是跟别人 “讲道理”的时候。我们作为 “外界”的人,程序不是我们写的,我们只能 “猜测”,只能尽量想出一些 “可能性”(这些 “可能性”还都“堂而皇之”、能够“说得过去”)。换句话说,我们是尽量替人家“找理由”。

譬如你刚刚提到的这个疑问,那我们如何替人家“自圆其说”呢?我觉得可以像这样(仅仅是举例,其实可能性多得很):

人家只要发现内存块长度为 4G,就认为这个内存块已经“包括所有的内存”了,此时忽略内存块的基地址。

是我们得替人家找理由;不是反过来,即,由人家来回答我们的问题。
回复

使用道具 举报

1200#
发表于 2017-8-30 17:34:19 | 只看该作者
怪不得MS要不断打补丁。比尔起先不是说PC机最多2M内存就够了吗?
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-6-11 06:14

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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