【IT168服务器频道】用了一段时间的RTM版windows7,发现貌似windows7在存储控制器方面有些问题,这里做下总结。
一、我的台式计算机dell inspiron530
我在以前的文章里也摸索过一些问题,这里简要的介绍下硬件配置。主板是intel的3系列,南桥只有sata接口,接了一个硬盘和一个光驱。 pci卡上插了一块silicon image的i680存储控制器,以兼容我老式机器的一块硬盘和一个光驱。
问题1:安装时不能正常加载silicon image存储控制器的驱动。
这个问题以前的文章里也提及过,安装时驱动不能加载,或者说是在加载画面卡住。即使过了很长时间,加载画面过去了,此时又回到安装时的硬盘选项,驱动任然没有被安装。安装系统时不去安装这个驱动,直接安装系统(安装在主板集成的那个控制器下挂载的硬盘上),等安装好了系统,操作系统会自动加载驱动,这个驱动还和我用介质安装时手动加载的驱动还是一样。
问题2:自动安装存储控制器之后,硬盘和光驱被计算机管理工具识别,但是我的电脑里不能被加载使用,重启一下计算机,所有的硬盘和光驱才可以正常使用。
问题3:安装存储控制器驱动后的第一次关机不正常。
操作系统刚安装好的时候,会自动安装一些硬件和驱动,这时出现了问题2。经过我实践证明,只要重启下,以后再次使用,问题2就不存在了。但是第一次系统重启时又会出现新的问题,就是不能正常关机。屏幕显示正在关机,然后就卡住了。过了正常的关机时间范围,看看硬盘灯基本也不亮了,电源就是不熄火,屏幕卡在正在关机画面。
在7260版本时,我过了个十多分钟就直接强制重启了,之后的系统一切正常,什么问题都没有了。
这次是装RTM版,由于已经有了前一次这样的情况。我直接搬来本本,看着它,看它到底能发生什么。一直等待了大约半个小时,蓝屏了哈。这就意味着我可以去看看dump文件了。
DRIVER_POWER_STATE_FAILURE (9f)
A driver is causing an inconsistent power state.
Arguments:
Arg1: 00000004, The power transition timed out waiting to synchronize with the Pnp
subsystem.
Arg2: 00000258, Timeout in seconds.
Arg3: 84d7ad48, The thread currently holding on to the Pnp lock.
Arg4: 8275db24
上面的报错信息是说一个驱动导致错误的电源状态,电源传输等待即插即用设备同步超时。
FOLLOWUP_IP:
cdrom!DeviceSendPowerProcessRequest+15b
8b7f4916 84c0 test al,al
SYMBOL_STACK_INDEX: 8
SYMBOL_NAME: cdrom!DeviceSendPowerProcessRequest+15b
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: cdrom
IMAGE_NAME: cdrom.sys
DEBUG_FLR_IMAGE_TIMESTAMP: 4a5bbf1c
FAILURE_BUCKET_ID: 0x9F_cdrom!DeviceSendPowerProcessRequest+15b
BUCKET_ID: 0x9F_cdrom!DeviceSendPowerProcessRequest+15b
上面的信息给出了错误指令和所在模块以及偏移地址。上面橙色mark的地方就是我猜测的错误的地方了哈:test al,al。test指令是条测试指令,要根据结果影响FR(标志寄存器)的。test al,al,自己和自己比较,这个结果肯定是一个一定的结果,如果后面的指令根据test al,al所影响的标志寄存器的位来判断转跳什么的,这个很可能造成死循环哦,死循环就可能导致其他进程超时。我猜这个算是微软coder的一个笔误吧!
0: kd> lmvm cdrom
start end module name
8b7df000 8b7fe000 cdrom (pdb symbols) d:\symbolslocal\cdrom.pdb\45095501C39640C5BEEACE8E677232CC2\cdrom.pdb
Loaded symbol image file: cdrom.sys
Mapped memory image file: D:\symbolslocal\cdrom.sys\4A5BBF1C1f000\cdrom.sys
Image path: \SystemRoot\system32\DRIVERS\cdrom.sys
Image name: cdrom.sys
Timestamp: Tue Jul 14 07:11:24 2009 (4A5BBF1C)
CheckSum: 00029646
ImageSize: 0001F000
File version: 6.1.7600.16385
Product version: 6.1.7600.16385
File flags: 0 (Mask 3F)
File OS: 40004 NT Win32
File type: 3.7 Driver
File date: 00000000.00000000
Translations: 0000.04b0
CompanyName: Microsoft Corporation
ProductName: Microsoft? Windows? Operating System
InternalName: cdrom.sys
OriginalFilename: cdrom.sys
ProductVersion: 6.1.7600.16385
FileVersion: 6.1.7600.16385 (win7_rtm.090713-1255)
FileDescription: SCSI CD-ROM Driver
LegalCopyright: ? Microsoft Corporation. All rights reserved.
这里给出的就是错误的cdrom模块的信息,这个是微软提供的驱动哦。FileDescription: SCSI CD-ROM Driver,这个是一个scsi类型的驱动,和我最前面给出的硬件示意图不同哈。其实这个PCI扩展的存储控制器是把IDE设备模拟成scsi设备的。这个也就解释了为什么这个设备会被定义为pnp设备了,IDE不可以热插拔,sata和scsi是可以热插拔的,所以后两者应该也算pnp吧。
Debugging Details:
------------------
DRVPOWERSTATE_SUBCODE: 4
FAULTING_THREAD: 84d7ad48
CUSTOMER_CRASH_COUNT: 1
DEFAULT_BUCKET_ID: VISTA_DRIVER_FAULT
BUGCHECK_STR: 0x9F
PROCESS_NAME: System
CURRENT_IRQL: 2
LAST_CONTROL_TRANSFER: from 826a5b15 to 8269e966
STACK_TEXT:
8d5136c0 826a5b15 84d7ad48 00000000 807c2120 nt!KiSwapContext+0x26
8d5136f8 826a4403 84d7ae08 84d7ad48 8d5137e4 nt!KiSwapThread+0x266
8d513720 8269e2cf 84d7ad48 84d7ae08 00000000 nt!KiCommitThreadWait+0x1df
8d51379c 8b21d0a5 8d5137e4 00000000 00000000 nt!KeWaitForSingleObject+0x393
8d5137bc 8b21d5de 00000000 85197010 8d513814 Wdf01000!FxCREvent::EnterCRAndWait+0x1d
8d5137cc 8b21f4df 00000000 79ea1d58 8d51385c Wdf01000!FxCREvent::EnterCRAndWaitAndLeave+0xe
8d513814 8b22affe 00197010 8d51385c 8d513840 Wdf01000!FxIoTarget::SubmitSync+0x1db
8d513838 8b7f4916 00000020 85197010 8615e2a0 Wdf01000!imp_WdfRequestSend+0x178
8d51387c 8b7f4790 00000004 00000314 86e4d010 cdrom!DeviceSendPowerProcessRequest+0x15b
8d513890 8b25fd5c 792ba660 00000005 00000314 cdrom!DeviceEvtD0Exit+0x83
8d5138b0 8b25ed81 86e4d010 86e4d11c 86e4d010 Wdf01000!FxPkgPnp::PowerGotoD3Stopped+0xc7
8d513938 8b25fbb2 00000314 86e4d11c 86e4d010 Wdf01000!FxPkgPnp::PowerEnterNewState+0x11c
8d51395c 8b2605bb 8d513974 00000008 86e4d010 Wdf01000!FxPkgPnp::PowerProcessEventInner+0x171
8d513980 8b269747 00000001 8d5139b4 8b26967c Wdf01000!FxPkgPnp::PowerProcessEvent+0x15c
8d51398c 8b26967c 86e4d010 86e4d18c 86e4d010 Wdf01000!FxPkgPnp::NotPowerPolOwnerStopping+0x12
8d5139b4 8b2667f5 0000055b 86e4d18c 86e4d010 Wdf01000!FxPkgPnp::NotPowerPolicyOwnerEnterNewState+0x105
8d5139d8 8b267388 00000002 00000008 86e4d010 Wdf01000!FxPkgPnp::PowerPolicyProcessEventInner+0x264
8d5139fc 8b264079 00000001 00000000 8d513a34 Wdf01000!FxPkgPnp::PowerPolicyProcessEvent+0x172
8d513a0c 8b263484 86e4d010 86e4d0b8 86e4d010 Wdf01000!FxPkgPnp::PnpEventStartedStopping+0x11
8d513a34 8b263db2 0000010e 86e4d0b8 86e4d010 Wdf01000!FxPkgPnp::PnpEnterNewState+0x104
8d513a58 8b26447a 8d513a70 00000000 86e4d010 Wdf01000!FxPkgPnp::PnpProcessEventInner+0x149
8d513a7c 8b25b68f 00000200 00000000 85c43828 Wdf01000!FxPkgPnp::PnpProcessEvent+0x13e
8d513aa8 8b25ce02 86e4d010 86d64cc0 86d64cc0 Wdf01000!FxPkgPnp::_PnpRemoveDevice+0x8b
8d513ac8 8b239a3f 86d64cc0 8d513af0 8b239c63 Wdf01000!FxPkgPnp::Dispatch+0x207
8d513ad4 8b239c63 86752ef0 86d64cc0 86d64d9c Wdf01000!FxDevice::Dispatch+0x7f
8d513af0 826734bc 86752ef0 00000000 8d513b8c Wdf01000!FxDevice::DispatchWithLock+0x7b
8d513b08 82813edf 861e1030 868b1c20 861e1030 nt!IofCallDriver+0x63
8d513b38 827eab3d 861e1030 00000000 868b1c20 nt!IopSynchronousCall+0xc2
8d513b90 8264bc3a 861e1030 00000002 b7be0d78 nt!IopRemoveDevice+0xd4
8d513bbc 827ea951 00000015 b7be0d78 00000000 nt!PnpRemoveLockedDeviceNode+0x16c
8d513bd0 827ea8b7 00000002 00000015 00000000 nt!PnpDeleteLockedDeviceNode+0x2d
8d513c04 827ea238 861e1030 b7be0d78 00000002 nt!PnpDeleteLockedDeviceNodes+0x4c
8d513cc4 827ec210 8d513cf4 00000000 c20ba8b8 nt!PnpProcessQueryRemoveAndEject+0x946
8d513cdc 827edd58 00000000 8546c0c0 84d7ad48 nt!PnpProcessTargetDeviceEvent+0x38
8d513d00 826a4f2b 8546c0c0 00000000 84d7ad48 nt!PnpDeviceEventWorker+0x216
8d513d50 8284566d 00000001 a72c37ea 00000000 nt!ExpWorkerThread+0x10d
8d513d90 826f70d9 826a4e1e 00000001 00000000 nt!PspSystemThreadStartup+0x9e
00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x19
上面是stack,从上面的函数名和调用关系可以看出调用关系和函数大概功能。先说下Wdf01000.sys这个系统文件,lmvm它一下,FileDescription: Kernel Mode Driver Framework Runtime,这个是个内核模式下的驱动构架运行时库。(哎~~要是有这些内核函数的文档就好了,真想看哈!)
大略的可以看下上面的调用:关机时,内核删除pnp设备,通过调用Wdf01000,经过Wdf01000的分发器,调整pnp的设备状态以及电源状态。在橙色标记的那个函数发生了错误,导致之后同步错误吧。而这里的同步可能就是指设备状态和电源状态的同步吧。
关于电源状态:
对于一些设备. 例如调制解调器 , 硬盘, 光驱等. 可分为:
D0 - Fully-On 正常工作下.
D1 可节省较少的功耗,仍然保持ACTIVE的设备功能较D2要多的多,该状态由设备本身所决定,有些设备不能进入D1 STATE。
D2 某些功能被关闭. 可省较多的电源. 该状态由设备本身所决定,有些设备不能进入D2 STATE。
D3 - Off 此状态下设备的电源完全被移出, 所以下次电源再一次被供应时需要操作系统重新再对这个设备作一次设定(此状态下设备不对地址线进行译码)该状态需要最长的唤醒时间,所有的设备都可以进入该状态。
在绿色mark的那个函数可以看到电源状态已经被要求进入D3状态了。应该说这个设备已经关闭了,也就是在后面同步电源状态的时候出问题,导致我电脑总是不断电,而是在关机画面定住了哈。
总的来说,windows7各个方面的表现还是很抢眼的,虽然上面我遇到了很多问题,但是这些问题都出在刚安装系统或者加载设备驱动。属于"一次性错误"哈。以后的使用不会再出现了,可能安装好设备后,那个错误的指令就不再被调用到了吧。