0x0000007F (0x00000008, 0x00000000, 0x00000000, 0x00000000)
UNEXPECTED_KERNEL_MODE_TRAP
Симптомы Ошибка может возникать на компьютерах под управлением Windows, оснащенных процессором Intel Xeon (или другими). При этом ошибка следующего вида
STOP 0x0000007F (0x00000008, 0x00000000, 0x00000000, 0x00000000) UNEXPECTED_KERNEL_MODE_TRAP
При возникновении ошибки наблюдаются следующие признаки.
- Первый параметр в данном сообщении равен 0x0000008 (ошибка является двойным исключением).
- Вследствие ошибки в одном из битов регистра ESP данный регистр содержит адрес, находящийся за пределами стека текущего потока.
Данная проблема возникает в следующих случаях.
- Система BIOS компьютера не загрузила обновление микрокода, необходимое для работы процессора компьютера.
- Процессор поврежден или неисправен.
- Нарушены условия эксплуатации процессора (процессор эксплуатируется при недопустимой температуре, неверном напряжении питания или с неверной частотой).
Решение Способ 1 Определите, установлена ли на компьютере последняя версия обновления микрокода.
Обновление микрокода исправляет ошибки во внутренней логике процессора. Обновления микрокода не могут храниться в процессоре и загружаются в процессор при каждой загрузке компьютера. Загрузка обновлений микрокода выполняется системой BIOS или драйвером Update.sys.
Если на компьютере установлен процессор, выпущенный компанией Intel, то для определения версии обновления микрокода, загружаемого в данный процессор загрузите программу определения частоты процессора Intel с сайта
http://support.intel.com/support/processors/tools/frequencyid; после чего установите и запустите программу.
Запишите следующие сведения:
- семейство;
- модель;
- степпинг;
редакция.
Номера семейства, модели и степпинга однозначно определяют тип процессора. Редакция процессора позволяет определить версию загруженного обновления микрокода.
Признаки, описанные в данной статье, наиболее часто наблюдаются на процессорах Intel Xeon с номером семейства 15, номером модели 2 и степпингом 9, которые установлены на системных платах, использующих набор микросхем ServerWorks (шестнадцатеричные значения указанных выше номеров семейства, модели и степпинга равны F, 2 и 9 соответственно). Чтобы эти процессоры работали правильно, необходима редакция 0x18 или более поздняя (значение 0x18 — это шестнадцатеричное представление десятичного числа 24).
Если номер редакции равен 0, значит, система BIOS компьютера не содержит обновление микрокода для установленных на компьютере процессоров. В этом случае необходимо установить обновление для BIOS, которое содержит обновление микрокода, поддерживающее используемые процессоры.
Способ 2 Убедитесь, что процессор исправен
Если у вас есть такая возможность, то попробуйте установить ваш процессор на компьютер, на котором указанная проблема не возникает либо установите на компьютер на котором проблема наблюдается процессор с компьютера на котором данной проблемы нет.
Внимание! Не производите действия по замене процессора без должной квалификации.
Если после замены процессора на исходном компьютере проблема не исчезнет, а на компьютере, на который установлен исходный процессор, проблема не возникнет, то процессор, скорее всего, исправен и не является причиной ошибки.
Если после замены процессора на исходном компьютере проблема исчезнет, а на компьютере, на который установлен исходный процессор, проблема возникнет, то причиной проблемы, скорее всего, является неисправность процессора.
Способ 3 Проверьте, соблюдаются ли условия эксплуатации процессора.
Высокая температура в помещении, плохая вентиляция или накопление пыли могут вызывать сбои в работе процессоров и других компонентов. Проблемы с вентиляцией могут быть вызваны неработающими вентиляторами или закупоркой вентиляционных каналов. Если внутренняя часть или вентиляционные каналы компьютера заполнены пылью или если описанные признаки наблюдаются только при установке компьютера в определенных местах, причиной проблемы может быть перегрев. Убедитесь, что компоненты компьютера очищены от пыли, вентиляторы работают надлежащим образом, вентиляционные каналы свободны, а место установки компьютера надлежащим образом вентилируется.
Сбои в работе процессоров и других компонентов могут вызываться выходом напряжения питания за допустимые пределы, а также перепадами напряжения. Использование напряжения питания ненадлежащего номинала или плохого качества, перегрузка или сбои блока питания компьютера, а также сбои в работе компонентов системной платы могут привести к тому, что напряжение питания процессора выйдет за допустимые пределы или будет ненадлежащего качества.
Дополнительно Регистр ESP также называют регистром указателя стека. Стек — это находящаяся в памяти структура данных, в которой хранятся сведения о текущем состоянии выполнения потока. Стек потока используется для отслеживания функций, выполняющихся в настоящий момент, а также для хранения параметров, передаваемых этим функциям, и переменных, используемых данными функциями. Регистр ESP должен содержать адрес вершины стека. Если данный регистр содержит ошибочное значение, он может ссылаться на неверные данные или недействительный адрес. Если регистр ESP ссылается на недействительный адрес, может возникнуть двойное исключение.
Чтобы определить, вызвана ли рассматриваемая STOP-ошибка ошибкой в одном из битов регистра ESP, выполните следующие действия.
1. Установите средство
Microsoft Debugging Tools for Windows.
2. Запустите средство WinDbg, откройте нужный файл дампа памяти через меню File -> Open Crash Dump.
Информация, отображаемая при начальном анализе файла дампа, может выглядеть следующим образом.
*******************************************************************************
* *
* Bugcheck Analysis *
* *
*******************************************************************************
Use !analyze -v to get detailed debugging information.
BugCheck 7F, {8, 0, 0, 0}
Probably caused by : ntkrnlmp.exe ( nt!KiUnlockDispatcherDatabase+1c )
Followup: MachineOwner
3. Чтобы автоматически проанализировать файл дампа, выполните команду !analyze -v. Ниже показан пример выходных данных команды !analyze -v.
0: kd> !analyze -v
*******************************************************************************
* *
* Bugcheck Analysis *
* *
*******************************************************************************
UNEXPECTED_KERNEL_MODE_TRAP (7f) This means a trap occurred in kernel mode, and it is a trap of a kind
that the kernel isn`t permitted to have/catch (bound trap) or that
is always instant death (double fault). The first number in the
bugcheck params is the number of the trap (8 = double fault, etc)
Consult an Intel x86 family manual to learn more about what these
traps are. Here is a *portion* of those codes:
If kv shows a taskGate
use .tss on the part before the colon, then kv.
Else if kv shows a trapframe
use .trap on that value
Else
.trap on the appropriate frame will show where the trap was taken
(on x86, this will be the ebp that goes with the procedure KiTrap)
Endif
kb will then show the corrected stack.
Arguments:
Arg1: 00000008, EXCEPTION_DOUBLE_FAULT
Arg2: 00000000
Arg3: 00000000
Arg4: 00000000
Debugging Details:
------------------
BUGCHECK_STR: 0x7f_8
TSS: 00000028 -- (.tss 28)
eax=ffdff4dc ebx=f5d299dc ecx=8046f1c0 edx=00000000 esi=853e7a60 edi=00000102
eip=8046a86c esp=f5da9948 ebp=f5d2997c iopl=0 nv up ei pl zr na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010246
nt!KiUnlockDispatcherDatabase+0x1c:
8046a86c 59 pop ecx
Resetting default scope
DEFAULT_BUCKET_ID: DRIVER_FAULT
LAST_CONTROL_TRANSFER: from 80450bb3 to 8046a86c
STACK_TEXT:
f5d2997c 80450bb3 00000003 f5d299f8 00000001 nt!KiUnlockDispatcherDatabase+0x1c
f5d29d48 80466389 00000003 0076fe84 00000001 nt!NtWaitForMultipleObjects+0x385
f5d29d48 77f9323e 00000003 0076fe84 00000001 nt!KiSystemService+0xc9
0076fe5c 77e7a059 00000003 0076fe84 00000001 ntdll!ZwWaitForMultipleObjects+0xb
0076feac 77dee9fb 0076fe84 00000001 00000000 KERNEL32!WaitForMultipleObjectsEx+0xea
0076ff08 77deea48 0076fed4 0076ff5c 00000000 USER32!MsgWaitForMultipleObjectsEx+0x153
0076ff24 6d095a7c 00000002 0076ff5c 00000000 USER32!MsgWaitForMultipleObjects+0x1d
0076ff7c 780085bc 00283a90 0062f5ac 0062ffdc IisRTL!SchedulerWorkerThread+0xa7
0076ff90 8042fa31 85400680 0076ff88 ffffffff MSVCRT!_endthreadex+0xc1
00283ab8 ffffffff 00000000 00000000 00000000 nt!KiDeliverApc+0x1a1
00283ab8 ffffffff 00000000 00000000 00000000 0xffffffff
0000096c 00000000 00000000 00000000 00000000 0xffffffff
FOLLOWUP_IP:
nt!KiUnlockDispatcherDatabase+1c
8046a86c 59 pop ecx
SYMBOL_STACK_INDEX: 0
FOLLOWUP_NAME: MachineOwner
SYMBOL_NAME: nt!KiUnlockDispatcherDatabase+1c
MODULE_NAME: nt
IMAGE_NAME: ntkrnlmp.exe
DEBUG_FLR_IMAGE_TIMESTAMP: 3ee650b3
STACK_COMMAND: .tss 28 ; kb
BUCKET_ID: 0x7f_8_nt!KiUnlockDispatcherDatabase+1c
Followup: MachineOwner
4. Проанализируйте результаты работы команды !analyze -v и определите, содержатся ли в них сведения о возникновении двойной ошибки. Если будет обнаружена двойная ошибка, выполните команду .tss 28, чтобы отобразить состояние системы в момент возникновения данной ошибки. В приведенном ниже примере показаны значения регистров процессора в момент возникновения двойного исключения.
0: kd> .tss 28
eax=ffdff4dc ebx=f5d299dc ecx=8046f1c0 edx=00000000 esi=853e7a60 edi=00000102
eip=8046a86c esp=f5da9948 ebp=f5d2997c iopl=0 nv up ei pl zr na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010246
nt!KiUnlockDispatcherDatabase+0x1c:
8046a86c 59 pop ecx
В данном примере в регистре ESP содержится значение f5da9948. Как правило, адрес, хранящийся в регистре ESP, незначительно отличается от адреса, хранящегося в регистре EBP. В данном примере в регистре EBP содержится значение f5d2997c.
5. Выполните команду !thread, чтобы отобразить диапазон адресов, выделенный под стек текущего потока. Как правило, двойное исключение возникает в тех случаях, когда адрес, хранящийся в регистре ESP, находится за пределами диапазона адресов, зарезервированных для стека текущего потока. Ниже показан пример выходных данных команды !thread.
0: kd> !thread
THREAD 853e7a60 Cid 904.96c Teb: 7ffdc000 Win32Thread: a21a5c48 RUNNING
Not impersonating
Owning Process 85400680
Wait Start TickCount 578275 Elapsed Ticks: 0
Context Switch Count 38423 LargeStack
UserTime 0:00:02.0031
KernelTime 0:00:06.0640
Start Address KERNEL32!BaseThreadStartThunk (0x77e5b700)
Win32 Start Address MSVCRT!_threadstartex (0x78008532)
Stack Init f5d2a000 Current f5d29c9c Base f5d2a000 Limit f5d27000 Call 0
Priority 8 BasePriority 8 PriorityDecrement 0 DecrementCount 0
ChildEBP RetAddr Args to Child
00000000 8046a86c 00000000 00000000 00000000 nt!_KiTrap08+0x41
f5d2997c 80450bb3 00000003 f5d299f8 00000001 nt!KiUnlockDispatcherDatabase+0x1c
f5d29d48 80466389 00000003 0076fe84 00000001 nt!NtWaitForMultipleObjects+0x385
f5d29d48 77f9323e 00000003 0076fe84 00000001 nt!_KiSystemService+0xc9
0076fe5c 77e7a059 00000003 0076fe84 00000001 ntdll!ZwWaitForMultipleObjects+0xb
0076feac 77dee9fb 0076fe84 00000001 00000000 KERNEL32!WaitForMultipleObjectsEx+0xea
0076ff08 77deea48 0076fed4 0076ff5c 00000000 USER32!MsgWaitForMultipleObjectsEx+0x153
0076ff24 6d095a7c 00000002 0076ff5c 00000000 USER32!MsgWaitForMultipleObjects+0x1d
0076ff7c 780085bc 00283a90 0062f5ac 0062ffdc IisRTL!SchedulerWorkerThread+0xa7
0076ffb4 77e5b382 00283ab8 0062f5ac 0062ffdc MSVCRT!_threadstartex+0x8f
0076ffec 00000000 78008532 00283ab8 00000000 KERNEL32!BaseThreadStart+0x52
В данном примере диапазон адресов, выделенных под стек, отображается в следующей строке.
Stack Init f5d2a000 Current f5d29c9c Base f5d2a000 Limit f5d27000 Call 0
При работе потока значение регистра ESP должно находиться в пределах между базовым (Base, f5d2a000) и минимальным (Limit, f5d27000) адресами стека. Как правило, адрес, хранящийся в регистре регистра ESP, незначительно отличается от текущего адреса (Current, f5d29c9c). Текущий адрес также находится между базовым и минимальным адресами. В данном примере в регистре ESP содержится значение f5da9948. Этот адрес находится далеко за пределами диапазона адресов, выделенных для стека.
Чтобы определить диапазон адресов, выделенных под стек, можно также воспользоваться командой !pcr. Ниже показан пример выходных данных команды !pcr.
0: kd> !pcr
PCR Processor 0 @ffdff000
NtTib.ExceptionList: f5d29d38
NtTib.StackBase: f5d29df0
NtTib.StackLimit: f5d27000
NtTib.SubSystemTib: 00000000
NtTib.Version: 00000000
NtTib.UserPointer: 00000000
NtTib.SelfTib: 7ffdc000
SelfPcr: ffdff000
Prcb: ffdff120
Irql: 00000000
IRR: 00000000
IDR: ffffffff
InterruptMode: 00000000
IDT: 80036400
GDT: 80036000
TSS: 80474850
CurrentThread: 853e7a60
NextThread: 00000000
IdleThread: 80470600
DpcQueue:
Значение NtTib.StackLimit представляет собой младший адрес из диапазона адресов, выделенных под стек. NtTib.StackBase — это последнее значение регистра ESP. Чтобы определить, возникла ли в одном из битов регистра ESP ошибка, сравните текущее значение регистра ESP со значением NtTib.StackBase.
6. Чтобы определить разницу между значениями регистров ESP и EBP, выполните команду .formats esp ^ ebp. Если ошибка не возникала, значение, хранящееся в регистре EBP, будет незначительно отличаться от значения указателя стека, хранящегося в регистре ESP. Как правило, использование этой команды позволяет обнаружить старший бит регистра ESP, содержащий ошибку. Обнаружение данного бита облегчается при отображении результатов в двоичном виде, как показано в следующем примере.
0: kd> .formats esp ^ ebp
Evaluate expression:
Hex: 00080034
Decimal: 524340
Octal: 00002000064
Binary: 00000000 00001000 00000000 00110100
Chars: ...4
Time: Tue Jan 06 17:39:00 1970
Float: low 7.34757e-040 high 0
Double: 2.59058e-318
Если не рассматривать младшие (менее значимые) биты, то значения регистров ESP и EBP отличаются одним битом. Разность этих значений равна 00000000 00001000 00000000 00000000 (в двоичном виде) или 00080000 (в шестнадцатеричном виде).
Это показывает, что в одном из битов регистра ESP возникла ошибка, в результате чего данный регистр содержит неправильное значение, которое приводит к появлению двойного исключения, системной ошибки и аварийному завершению работы системы.
Для получения дополнительных сведений об используемом оборудовании выполните следующие действия.
1. Выполните команду !cpuinfo, чтобы получить сведения о процессоре. Ниже показан пример выходных данных команды !cpuinfo.
0: kd> !cpuinfo
TargetInfo::ReadMsr is not available in the current debug session
CP F/M/S Manufacturer MHz Update Signature Features
0 15,2,9 GenuineIntel 2790>0000000000000000 !cpuinfo
CP F/M/S Manufacturer MHz Update Signature Features
TargetInfo::ReadMsr is not available in the current debug session
0 15,2,9 GenuineIntel 2994>0000001800000000 !pcitree
Bus 0x0 (FDO Ext 85dceed8)
0600 00141166 (d=0, f=0) devext 85dcf348 Bridge/HOST to PCI
0600 00141166 (d=0, f=1) devext 85e110e8 Bridge/HOST to PCI
0600 00141166 (d=0, f=2) devext 85e11ee8 Bridge/HOST to PCI
0100 00c09005 (d=2, f=0) devext 85e11ce8 Mass Storage Controller/SCSI
0100 00c09005 (d=2, f=1) devext 85e11ae8 Mass Storage Controller/SCSI
0300 47521002 (d=3, f=0) devext 85e11788 Display Controller/VGA
0200 16a614e4 (d=4, f=0) devext 85e11428 Network Controller/Ethernet
0880 a0f00e11 (d=5, f=0) devext 85dcdee8 Base System Device/`Other` base system device
0601 02011166 (d=f, f=0) devext 85dcdb88 Bridge/PCI to ISA
0101 02121166 (d=f, f=1) devext 85dcd988 Mass Storage Controller/IDE
0c03 02201166 (d=f, f=2) devext 85dcd628 Serial Bus Controller/USB
0600 02251166 (d=f, f=3) devext 85dcd2c8 Bridge/HOST to PCI
0600 01011166 (d=11, f=0) devext 85e100e8 Bridge/HOST to PCI
0600 01011166 (d=11, f=2) devext 85e10ee8 Bridge/HOST to PCI
Bus 0x2 (FDO Ext 85dcecd8)
0104 00460e11 (d=2, f=0) devext 85e0f9a8 Mass Storage Controller/RAID Bus 0x5 (FDO Ext 85dce9d8)
No devices have been enumerated on this bus.
Total PCI Root busses processed = 3
Для всех перечисленных PCI-устройств первое шестнадцатеричное значение в каждой строке (это значение состоит из 8 цифр и имеет тип DWORD) представляет собой идентификатор производителя и устройства (VenDev ID). Фактически идентификатор производителя определяется последними четырьмя цифрами. Например, первое устройство в приведенном выше списке имеет идентификатор VenDev ID, равный 0x00141166. При этом идентификатор устройства (Device ID) равен 0x0014, а идентификатор производителя (Vendor ID) — 0x1166. Идентификатор производителя для наборов микросхем ServerWorks равен 0x1166. Это означает, что выше приведен результат работы команды !pcitree на компьютере с системной платой, использующей набор микросхем ServerWorks.