OSDev
http://osdev.su/

поток double fault exceptions
http://osdev.su/viewtopic.php?f=6&t=320
Страница 5 из 5

Автор:  Himik [ 19 авг 2010, 20:41 ]
Заголовок сообщения:  Re: поток double fault exceptions

ZarathustrA, чтобы на 100% убедиться, что Local APIC отсутствует, надо прочитать версию из его регистра версии. И желательно перед прочтением записать в него 0, т.к. этот регистр всё-равно не изменяемый. Если прочитается 0, то LAPICа нет, а если не ноль, то сообщи его здесь, будем думать.
Вообще LAPIC бывает разных конструкций. С процессорами i486 он был внешним (ищи доку на микросхему 82489DX), а c Pentuim стал внутренним. И у них разные номера версий, вот почему важно выяснить версию. Функционал у них тоже разный.

Автор:  ZarathustrA [ 19 авг 2010, 22:04 ]
Заголовок сообщения:  Re: поток double fault exceptions

Вообще-то, Local APIC присутствует на каждом интеловском процессоре начиная с Intel Pentium (ядро P54C) (По крайней мере я так думал). В том числе и на моем ноутбучном Pentium M. Поэтому я даже не заморачивался насчет посмотреть его регистры или получить СPUID info, так как за базовый процессор брал именно этот, а не i386. Верил в спецификацию. Но как оказалось вы были правы. Товарищи из Интел решили сэкономить транзисторы (миливатты мощности) и не включили его в Pentium M, хотя спецификация Intel на Pentium подразумевает, что Local APIC является неотъемлемой частью процессора в настоящем и будущем. По крайней мере в графу "Осторожно! Может не присутствовать на будущих процессорах" он не попал.

В общем, проблема исчерпана. Нужно менять ноутбук.

Автор:  ZarathustrA [ 20 авг 2010, 18:40 ]
Заголовок сообщения:  Re: поток double fault exceptions

Хотя нет. Есть еще один вопрос. Как в отсутствие Local APIC-а запись в несуществующий регистр TPR может менять содержимое регистров PPR и APR Local APIC-а. И как в отсутствии Local APIC-а может корректно отрабатывать встроенный в него высокочастотный таймер (отсчитывать значения, генерить прерывание по истечению заданного количества тактов)?

Автор:  Himik [ 21 авг 2010, 13:41 ]
Заголовок сообщения:  Re: поток double fault exceptions

ZarathustrA, ты хочешь сказать, что регистр версии содержит 0, а некоторые функции всё-равно работают? Это вполне допустимая кривизна аппаратной реализации. Довольно часто реально существующие компоненты отключаются путём обнуления ключевого регистра, который является индикатором наличия компонента. Например, многие процессоры Intel и AMD физически содержат больше ядер, чем отображено на логическом уровне.
Я думаю, надо ориентироваться на регистр версии. Он должен быть главным показателем наличия или отсутствия устройства, тоесть в (полно)функциональном он состоянии или нет.

Автор:  ZarathustrA [ 22 авг 2010, 12:24 ]
Заголовок сообщения:  Re: поток double fault exceptions

Спасибо за пояснение. Похоже все происходит именно тем образом, каким вы это и объясняете. Я как-то и не думал о частичной аппаратной реализации, хотя этот вариант выглядит очень правдоподобно. Вторым вариантом могут быть особенности реализации VmWare.

Автор:  JSON [ 13 май 2011, 21:06 ]
Заголовок сообщения:  Re: поток double fault exceptions

У меня тажа проблема. Выбрасывает двойную ошибку. Может все дело в APIC.

Код:
; Отключаем APIC   
mov     ecx, 0001b
rdmsr
or      ah, 1000b
wrmsr


Я почему-то уверен, что необходимо инициализировать все оборудование. Тогда есть гарантия стабильной работы всей системы компьютера.

Автор:  ZarathustrA [ 14 май 2011, 15:37 ]
Заголовок сообщения:  Re: поток double fault exceptions

Корнень проблемы в том, что по умолчанию, PIC инициализирован таким образом, что переводит IRQ0 в INT8. В итоге я решил это следующим образом: В загрузчике просто стал маскировать все прерывания на PIC-е. И все. А вот когда ядро уже загрузится, поднимутся драйвера, в том числе и драйвер PIC-a, то тогда и будет программироваться/перепрограммироваться PIC.

P.S.:насколько я понял проблема является актуальной только для процессоров без APIC-а. На процессорах с APIC-ом решается она еще проще. Выставляется нужное значение в TPR (например 0х2F), и сам проц в не зависимости от желания контроллера прерываний на мамке, начинает игнорировать все прерывания у которых вектор меньше 0x30. То бишь PIC и IO APIC могут надрываться сколько хотят пытаясь отправить тебе сообщение о прерывании. Но до тех пор пока они не начнут отправлять прерывания с корректными векторами, твое ядро не будет даже подозревать об их существовании.

Страница 5 из 5 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/