无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 8504|回复: 23
打印 上一主题 下一主题

[讨论]关于hal.dll与ntoskrnl.exe自动选择的问题

  [复制链接]
跳转到指定楼层
1#
发表于 2008-1-30 11:11:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这两天研究在PE下加回双核 发现一个有趣问题

对于[hal]段,有:
[hal]
486c_up=hal.dll,2,hal.dll
acpipic_up=halacpi.dll,2,hal.dll
e_isa_up=hal.dll,2,hal.dll
mps_up=hal.dll,2,hal.dll
mps_mp=hal.dll,2,hal.dll
syspro_mp=hal.dll,2,hal.dll
acpiapic_up=halaacpi.dll,2,hal.dll
acpiapic_mp=hal.dll,2,hal.dll

理所当然的 系统会自动选择合适的hal.dll

但对于[SpecialFiles],有:
[SpecialFiles]
Multiprocessor=ntkrnlmp.exe,2,ntoskrnl.exe
Uniprocessor=ntoskrnl.exe,2
MPKrnlPa=ntkrpamp.exe,2,ntkrnlpa.exe
UPKrnlPa=ntkrnlpa.exe,2

很TNND的系统不会自动选择合适的ntoskrnl.exe 而是直接指向ntoskrnl.exe(ex_)

而诡异的是 靠修改setupldr.bin实现双sif
不行 还是老样子 始终指向ntoskrnl.ex_
好吧 在setupldr.bin中把ntoskrnl.exe也替换成ntkrnlmp.exe

这下牛B了 在双核机器上正常(认单核)
单核机器上死在please wait...那里


大家讨论下 有没办法自动识别ntoskrnl.exe
2#
发表于 2008-1-30 11:13:35 | 只看该作者
先顶你`不过我不知道怎么自动识别ntoskrnl.exe。
出成果了叫我。
回复

使用道具 举报

3#
 楼主| 发表于 2008-1-30 11:18:37 | 只看该作者
我寒

对了 更诡异的还有

刚才翻了下deepin xp 5.7的txtsetup.sif 发现里面的描述是一样的
但它却能正确识别正确的ntoskrnl.exe
回复

使用道具 举报

4#
 楼主| 发表于 2008-1-30 12:45:27 | 只看该作者
估计死认ntoskrnl的不是setupldr.bin
而是system32下某文件
回复

使用道具 举报

5#
发表于 2008-4-22 08:51:26 | 只看该作者
楼主问题解决了没有,我想知道是怎样解决的。
回复

使用道具 举报

6#
发表于 2008-4-22 11:44:46 | 只看该作者
ntoskrnl.exe的内部名称有两种,有的是ntoskrnl.exe,有的是ntkrnlmp.exe。
CPU有两种,有的是单核,有的是多核。
理论上ntoskrnl.exe与CPU有四种组合
在不易判别的情况下,目前我的做法是交由用户选择:
启动期间发现有双核的可能性就作提示,用户回车则采用双核方案,否则5秒后默认按单核处理。
把内部名为ntkrnlmp.exe的误作单核处理可能造成无法启用网络,遇到这种情况下次启动注意回车一下就是了。
回复

使用道具 举报

7#
 楼主| 发表于 2008-4-22 12:06:25 | 只看该作者
lz详细说说如何做?先用grub载入然后在dos下改名?
回复

使用道具 举报

8#
发表于 2008-4-22 12:18:41 | 只看该作者
911cd 上有人讨论过,说setupldr设计“好象是”能够自动识别单双核,但实际是它只加载ntoskrnl.exe。setupldr是不会处理[SpecialFiles]的。安装版的XP是识别后将ntkrnlmp.exe复制并改名为ntoskrnl.exe,重启后使用。而PE是不能重启的。
回复

使用道具 举报

9#
发表于 2008-4-22 12:57:21 | 只看该作者

两阶段启动

原帖由 neo4026 于 2008-4-22 12:06 PM 发表
lz详细说说如何做?先用grub载入然后在dos下改名?

“零体积可扩展PE”的伸缩机制:
grub4dos启动4M最小内核,进入dos。如果PE自带一级外置扩展映像(目前11M,基本上就是普通PE内核)也由grub4dos同时加载。
进入dos后,发现上述外置扩展映像就用之,这就还原成普通自带核心文件的PE(即使无硬盘也可启动),然后第二次grub4dos启动PE。
进入dos后,如果没有发现上述外置扩展映像,就从硬盘XP中提取PE需要的核心文件,最终也得到普通自带核心文件的PE所应有的文件,然后第二次grub4dos启动PE。
这个方案使得一级外置扩展映像可有可无,增强了伸缩性,PE核心最小达到4M(当然这时离开XP只能玩DOS)。进入windows CMD后,shell(即二级扩展)也是发现PE自带就用自带的,否则从硬盘XP取。
目前初步实现了DOS下自动提取XP的硬盘驱动文件,然后再启动PE。这样PE本身即使不带硬盘驱动,也可当场提取硬盘驱动解决问题。
启动进入桌面后,需要的显声网驱动、应用程序,如果PE本身没带,也可通过《XP资源》就地取材。
这就是利用硬盘资源的整个可伸缩机制。

由于启动PE前有一个dos阶段,在此阶段有充足条件判断单双核,动态生成不同的txtsetup.sif。最简单判断方法是,多核的会伴随有一些别的单核没有的文件,发现这些文件就表示有双核可能。
dos下可以用批处理或汇编、C编程,动态生成txtsetup.sif、menu.lst、setupldr都好办。而非两阶段启动方式通常只能在grub4dos的菜单、配备多个不同文件名的setupldr、txtsetup上做文章。

实践证明,两阶段启动速度也不错的。
回复

使用道具 举报

10#
发表于 2008-4-22 13:30:51 | 只看该作者
这“两阶段启动”理论值得进一步探索……
回复

使用道具 举报

11#
发表于 2008-4-28 00:44:48 | 只看该作者
我也发现这个很郁闷的问题了
回复

使用道具 举报

12#
发表于 2008-4-28 11:45:55 | 只看该作者
问题1:DOS下如何区分双核、单核?到了CMD就迟了(虽然NT下可以用GetNumberOfProcessors判断)。
问题2:如何判断是双核CPU还是双路CPU(即两个CPU),同样要在DOS下实现?

[ 本帖最后由 netwinxp 于 2008-4-28 12:02 PM 编辑 ]
回复

使用道具 举报

13#
发表于 2008-4-28 13:39:20 | 只看该作者
不懂!!!!

这个有什么影响????
比如:

      不能正常上网
      不能正常运行PE
      浪费资源.......
回复

使用道具 举报

14#
发表于 2008-4-28 14:28:46 | 只看该作者

回复 #15 netwinxp 的帖子

原帖由 netwinxp 于 2008-4-28 11:45 AM 发表
问题1:DOS下如何区分双核、单核?到了CMD就迟了(虽然NT下可以用GetNumberOfProcessors判断)。
问题2:如何判断是双核CPU还是双路CPU(即两个CPU),同样要在DOS下实现?

问题2:双核、双路所用的软件也许相同,但与单核不同。目前双核/多核是最需要关注的。
问题1:借助工具可以判断(命令行方式的也有)。问题转化为找好的、小的工具,或自己编程。
回复

使用道具 举报

15#
发表于 2008-4-28 14:30:28 | 只看该作者
原帖由 xuexiang 于 2008-4-28 01:39 PM 发表
这个有什么影响????

弄不好不能正常上网
回复

使用道具 举报

16#
发表于 2008-4-28 14:59:55 | 只看该作者

回复 #17 pseudo 的帖子

那个只是根据取得的CPU信息和已知的cpu硬件库再转化成对应的字符串而已,那些文字只不过是由该软件内置的字符串转化而来,并不是真正的判断cpu的核心数量,对于新的cpu类型、双路cpu(比如双p2)仍然无法判断,不具有通用性。也就是说越新的cpu越不支持-_-!!
举个例子,比如我们知道VEN_10DE是nVIDIA,但是不是所有的nVIDIA都是VEN_10DE,答案是否定的。相对而言,我们只能根据现在已知的硬件库知道少量的双核或多核cpu,不在这库里面的无法判断,而且随着硬件增加,这个库将会庞大无比...
你找一个新出的扣肉或老的双路p2,然后用它测试,再用cpuz等测试就会发现其中的区别。

[ 本帖最后由 netwinxp 于 2008-4-28 03:11 PM 编辑 ]
回复

使用道具 举报

17#
发表于 2008-4-28 15:10:02 | 只看该作者

回复 #19 netwinxp 的帖子

原帖由 netwinxp 于 2008-4-28 02:59 PM 发表
那个只是根据acpi取得的CPU信息然后再转化成对应的字符串而已,那些文字只不过是由该软件内置的字符串转化而来,并不是真正的判断cpu的核心数量,对于新的cpu类型、双路cpu(比如双p2)仍然无法判断,不具有通用性。

前两幅图是字符串,供参考,市场上流行的cpu有限,通过特征字符串列表可以对付已知的cpu。
最后一幅图是第二个处理器信息,该信息表明非单核。目前似乎只需区分单核、非单核两种情况。ntoskrnl.exe可能是由ntkrnlmp.exe复制来的,ntoskrnl.exe的内部名称有两种,有的是ntoskrnl.exe,有的是ntkrnlmp.exe。准备两套相应注册信息似乎可以了。

[ 本帖最后由 pseudo 于 2008-4-28 03:15 PM 编辑 ]
回复

使用道具 举报

18#
发表于 2008-4-28 15:12:58 | 只看该作者
原帖由 pseudo 于 2008-4-28 15:10 发表

前两幅图是字符串,供参考,市场上流行的cpu有限,通过特征字符串列表可以对付已知的cpu。
最后一幅图是第二个处理器信息,该信息表明非单核。目前似乎只需区分单核、非单核两种情况。

你用它不认识的新版cpu看是否能识别出多核?cpu一直出新的,版本号也一直在变,对于新的它根本无法显示X2之类的字符串。那些不是CPU的特征码,只不过是该软件内置的字符串而已,特征码是“AuthenticAMD_-_x86_Family_?”、"GenuineIntel_-_x86_Family_?"等
另外多路的cpu比双核一般具有更高的效率,它用的ntoskrnl好像也不一样。

[ 本帖最后由 netwinxp 于 2008-4-28 03:20 PM 编辑 ]
回复

使用道具 举报

19#
发表于 2008-4-28 15:23:54 | 只看该作者
原帖由 netwinxp 于 2008-4-28 03:12 PM 发表
你用它不认识的新版cpu看是否能识别出多核?cpu一直出新的,版本号也一直在变,对于新的它根本无法显示X2之类的字符串。
另外多路的cpu比双核一般具有更高的效率,它用的ntoskrnl好像也不一样。

赫赫,ls标准高。
我感觉能对付已知的cpu就知足了。新的cpu出来后,我就等工具出认识它的新版后更换新版工具。除了借助工具自动识别之外,再保留一招:手工选择,偶尔补救一下。
回复

使用道具 举报

20#
发表于 2008-4-28 15:34:50 | 只看该作者
先把你的CPU信息贴上来,我先举我的例子,如果收集足够多的信息,我就会在以后加入cpu检测信息。

xp1800.PNG (13.1 KB, 下载次数: 48)

例子

例子
回复

使用道具 举报

21#
发表于 2008-4-28 15:42:13 | 只看该作者
原帖由 netwinxp 于 2008-4-28 03:34 PM 发表
先把你的CPU信息贴上来,我先举我的例子,如果收集足够多的信息,我就会在以后加入cpu检测信息。

前面dos的截图是VMware客户机里的。
下面是真机:
回复

使用道具 举报

22#
发表于 2008-4-28 15:47:32 | 只看该作者
原帖由 pseudo 于 2008-4-28 15:42 发表

前面dos的截图是VMware客户机里的。
下面是真机:
39973

AMD F15 M107,是amd64 x2 3600+,这个好,偶喜欢,先记下来:)还有一个0,一个1,嘿嘿:)
回复

使用道具 举报

23#
发表于 2008-5-5 15:53:31 | 只看该作者
其实问题很简单,真正的NT核心是ntoskrnl.exe(单路单核)(Standard PC、ACPI PC、ACPI Uniprocessor)、ntkrnlmp.exe(单路多核)(ACPI MultiProcessor PC)、ntkrnlpa.exe(多路单核)(MPS UniProcessor)、ntkrpamp.exe(多路多核)(MPS MultiProcessor PC),它们与CPU息息相关,在SETUPLDR.BIN载入txtsetup.sif之前可能就被调入内存中,也就是说即使硬盘中的ntkrnlmp.exe被改名成ntoskrnl.exe但依然不起作用(由于xp修改计算机类型后需重启,所以重启后ntoskrnl.exe事实上就是ntkrnlmp.exe,用ACPI MultiProcessor PC的XP用户可以检查ntoskrnl.exe,它其实就是ntkrnlmp.exe),而HAL*.DLL事实上是被NTOSKRNL.EXE装入内存的(它是除CPU之外硬件层兼容的冬冬,比如ACPI、APM等等)。目前本人可以在DOS检测前两种(多路的暂时还没找到资料),也就是说如果在setupldr.bin之前把ntkrnlmp.exe改成ntoskrnl.exe就可以真正支持单路多核(不知多路多核可否当成单路多核使用?)。
当然SpecialFiles仍然要按以下写——
[SpecialFiles]
Multiprocessor=ntoskrnl.exe,2
Uniprocessor=ntoskrnl.exe,2
MPKrnlPa=ntoskrnl.exe,2
UPKrnlPa=ntoskrnl.exe,2
通常其他三种方式用作单路单核还是没有问题的。
至于HAL主要看是否支持ACPI、APIC来决定:HALSTND.DLL(就是安装包里面的HAL.DLL)(两个都不支持);HALAPIC.DLL(仅支持APIC);HALACPI.DLL(仅支持ACPI);HALAACPI.DLL(两个都支持);多路单核用HALAPIC.DLL;多路多核用HALMPS.DLL;HALSP.DLL好像是SGI这类机子用的。HAL还是让txtsetup.sif系统自己去判断比较合适。
2000PRO、XP Home不支持多路。

[ 本帖最后由 netwinxp 于 2008-5-5 04:18 PM 编辑 ]
回复

使用道具 举报

24#
发表于 2008-5-5 17:07:32 | 只看该作者

回复 #26 netwinxp 的帖子

研究得深入,结果说起来就简单。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-24 09:08

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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