OSDev

для всех
Текущее время: 29 апр 2024, 18:14

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: 17 фев 2013, 19:27 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Zealint писал(а):
Читал и главу 20 про 8086 emulation в Intel® 64 and IA-32 Architectures Software Developer’s Manual, там вообще ни слова.
Первая же таблица в 20-ой главе.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 фев 2013, 19:37 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Zealint писал(а):
Это печально. А я думал, что чего-то не понимаю в этом великом замысле


Что процессоры Интел, что ПК от ИБМ -- это одна сплошная ошибка компьютерной генетики. Костыль на костыле, кривизна на кривизне... Но что имеем, то имеем :)

Цитата:
В том-то и дело, что читал. Взял, например, Combined Volume Set of Intel® 64 and IA-32 Architectures Software Developer’s Manuals. Раздел 6.4. Там, во-первых, таблица всех исключений и прерываний без указаний того, что в реальном режиме, а что в защищенном. А во-вторых, написано
Цитата:
Vectors 0 through 8, 10 through 14, and 16 through 19 are the predefined
interrupts and exceptions, and vectors 32 through 255 are the user-defined interrupts,
called maskable interrupts.

Что никак не объясняет то, что я хочу узнать: какие прерывания на самом деле могут быть вызваны аппаратурой в реальном режиме, а какие не могут.


Чтобы это понять, достаточно обычного здравого смысла и понимания того, как работает процессор. Например, защита памяти, основанная на сегментах, работает только в защищённом режиме, страничный механизм -- тоже, а значит, соответствующие исключения возникнуть в реальном режиме не могут. А вот деление на 0 -- запросто, поскольку оно не привязано к режиму.

Читал и главу 20 про 8086 emulation в Intel® 64 and IA-32 Architectures Software Developer’s Manual, там вообще ни слова. Также открывал техническую документацию по процессорам. Конечно, там ничего не нашёл.

Цитата:
Я могу всё перечитать, но на это уйдет несколько недель. Поэтому спрашиваю, кто сейчас помнит, где всё написано. Не обязательно специально искать, просто может у кого-то под рукой как раз.


Ну, даже если точный ответ получите, прочитать самому всё не помешает -- хотя б для общего развития. Мало ли что в дальнейшем потребуется, а так будет некое общее представление...

Цитата:
Какой механизм позволяет различать прерывание и исключение.


Если один и тот же вектор назначен и исключению, и внешнему прерыванию, обработчик может определить причину, посмотрев состояние контроллера прерываний (PIC). У него есть регистр, содержащий установленные биты для тех запросов, которые в данный момент обслуживаются. Естественно, при этом надо гарантировать, что сами обработчики прерываний не могут вызывать исключения с такими разделяемыми номерами -- но это уже задача БИОСописателя.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 фев 2013, 20:02 
Аватара пользователя

Зарегистрирован: 17 фев 2013, 16:13
Сообщения: 163
phantom-84 писал(а):
Первая же таблица в 20-ой главе.

Так в том-то и дело, что там написано
Код:
16         Floating-Point Error (#MF)        Yes       Yes        Reserved

То есть буквально это означает, что в реальном режиме прерывание 10h происходит в случае Floating Point Error, а не программным образом. То есть оно как бы занято аппаратурой, какого фига оно срабатывает при программном вызова так, как надо?

Но если я правильно понял SII:
SSI писал(а):
Если один и тот же вектор назначен и исключению, и внешнему прерыванию, обработчик может определить причину, посмотрев состояние контроллера прерываний (PIC). У него есть регистр, содержащий установленные биты для тех запросов, которые в данный момент обслуживаются. Естественно, при этом надо гарантировать, что сами обработчики прерываний не могут вызывать исключения с такими разделяемыми номерами -- но это уже задача БИОСописателя.

то это означает, что в BIOS так и сделано: в случае исключения 10h будет исключение, а в случае программного вызова int 10h будет вызов функции BIOS. Значит, следующим шагом будет смотреть исходники BIOS, чтобы в этом убедиться.


Цитата:
Чтобы это понять, достаточно обычного здравого смысла и понимания того, как работает процессор. Например, защита памяти, основанная на сегментах, работает только в защищённом режиме, страничный механизм -- тоже, а значит, соответствующие исключения возникнуть в реальном режиме не могут. А вот деление на 0 -- запросто, поскольку оно не привязано к режиму.

Это я понял, но, занимаясь изучением процессоров Intel, я перестал полагаться на СВОЙ здравый смысл и стараюсь во всём ссылаться на документацию. Я иногда угадываю, что сделали разработчики там-то и там-то, вместо того, чтобы сразу читать документацию, но иногда возникают такие сюжеты, что со зла не придумаешь. Как Вы сами пишите
Цитата:
Что процессоры Интел, что ПК от ИБМ -- это одна сплошная ошибка компьютерной генетики.

С тех пор стараюсь всегда находить точные ссылки.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 фев 2013, 20:36 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Zealint писал(а):
phantom-84 писал(а):
Первая же таблица в 20-ой главе.

Так в том-то и дело, что там написано
Код:
16         Floating-Point Error (#MF)        Yes       Yes        Reserved

То есть буквально это означает, что в реальном режиме прерывание 10h происходит в случае Floating Point Error, а не программным образом. То есть оно как бы занято аппаратурой, какого фига оно срабатывает при программном вызова так, как надо?


Потому что гениальные архитекторы Интел не предусмотрели отдельные наборы векторов для прерываний, возникающих при выполнении различных "обычных" команд (деление, операции с плавающей запятой и т.д.), специальных команд генерации прерываний (INT) и внешних прерываний -- у них всё свалено в одну кучу. Да, первые 32 вектора объявлены зарезервированными, но на практике ничто не мешает использовать команды INT с номерами 0-31 или же настроить контроллер прерываний так, чтобы он выдавал запросы на эти векторы. Иименно так и происходит в реальном режиме, но не потому, что это правильно, а потому, что так сделали другие гении, на этот раз из ИБМ, и с тех пор это тянется для совместимости.

Цитата:
в случае исключения 10h будет исключение, а в случае программного вызова int 10h будет вызов функции BIOS. Значит, следующим шагом будет смотреть исходники BIOS, чтобы в этом убедиться.


Физически произойдёт одно и то же -- вызов обработчика вектора 16. А уж ему придётся тем или иным путём пытаться угадать, какого хрена его вызвали. Потому-то нормальные системы перенастраивают контроллер прерываний таким образом, чтобы внешние прерывания начинались хотя б с 32-го вектора (т.е. не перекрывались с зарезервированными векторами), и не используют программные прерывания INT 0-31 (и те, на которые назначены внешние прерывания). В защищённом режиме, помнится, последнее можно даже запретить правильной настройкой дескрипторов этих прерываний, но подробностей не помню: я давно уже с ИА-32 не работаю.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 фев 2013, 20:44 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
SII, сопроцесор не является внешним устройством.
Да даже если и является, то исключение 16 это не внешнее прерывание и PIC про него ничего не знает.
Скорее всего хитрость в том что в реальном режиме оно не генерируется.

Цитата:
Interrupt 16—x87 FPU Floating-Point Error (#MF)
Exception ClassFault.
Description

Indicates that the x87 FPU has detected a floating-point error. The NE flag in the register CR0 must be set for an interrupt 16 (floating-point error exception) to be generated. (See Section 2.5, “Control Registers,” for a detailed description of the NE flag


А во вторых проверить легко - в FPU есть регистр отвечающий за прерывания.
Надо проверить, но турбо отладчик вешает свои прерывания на часть обработчиков надо смотреть.
Можно перепрограммировать обработчик 10h в котором проверять FPU на наличия прерывания.

Что хочу добавить FPU может работать в режиме без прерываний и это нормальное поведение.


Последний раз редактировалось pavia 17 фев 2013, 20:52, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 фев 2013, 20:44 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Zealint писал(а):
Но если я правильно понял SII:
SSI писал(а):
Если один и тот же вектор назначен и исключению, и внешнему прерыванию, обработчик может определить причину, посмотрев состояние контроллера прерываний (PIC). У него есть регистр, содержащий установленные биты для тех запросов, которые в данный момент обслуживаются. Естественно, при этом надо гарантировать, что сами обработчики прерываний не могут вызывать исключения с такими разделяемыми номерами -- но это уже задача БИОСописателя.

то это означает, что в BIOS так и сделано: в случае исключения 10h будет исключение, а в случае программного вызова int 10h будет вызов функции BIOS.
Да, только в случае вектора 10h это не маскируемое аппаратное прерывание, а исключение, поэтому нужно смотреть не на регистры PIC, а на регистры FPU. Аппаратные прерывания пересекаются с исключениями 8-15. Здесь уже нужно смотреть на PIC, т.к. далеко не всегда можно напрямую детектить исключение.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 фев 2013, 22:08 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Ну, я говорил прежде всего для внешних прерываний -- они ж тоже отображены на нижние векторы. В случае с сопроцессором метода определения другая, но общая идея та же самая: глянуть, не от него ли прерывание, и если не от него, тогда это INT.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 фев 2013, 23:45 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Даже в реальном режиме можно перепрограммировать контроллер прерываний на вектора выше 31 и транслировать вызовы на стандартные обработчики BIOS - он сам разберётся с обработкой, это не должно волновать программиста.
Исключения точно так же как и прерывания не делятся на реальный и защищённый режим, они просто происходят (или не происходят), и программист должен просто обрабатывать их в соответствии с заданной логикой.
Полагаю, что точные данные о вызываемых исключениях нужно смотреть с точки зрения описания инструкций (instruction set reference). Там по каждой инструкции указано, в каком режиме процессора какое исключение может возникнуть. Из этого можно составить полную таблицу всех возможных случаев.

Zealint писал(а):
А есть у кого-то возможность показать конкретное место в документации Intel или AMD, где написано, какие из младших прерываний в реальном режиме задействованы аппаратурой, а какие (типа #16) - нет?

BIOS стандартно использует прерывания 8...0xF и 0x70...0x77 для аппаратуры. Это стандарт не Intel и AMD, а разработчиков BIOS.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 фев 2013, 06:27 
Аватара пользователя

Зарегистрирован: 17 фев 2013, 16:13
Сообщения: 163
Himik писал(а):
BIOS стандартно использует прерывания 8...0xF и 0x70...0x77 для аппаратуры. Это стандарт не Intel и AMD, а разработчиков BIOS.

Ладно пусть так. А этот стандарт где-нибудь можно прочитать?

SII писал(а):
Ну, я говорил прежде всего для внешних прерываний -- они ж тоже отображены на нижние векторы. В случае с сопроцессором метода определения другая, но общая идея та же самая: глянуть, не от него ли прерывание, и если не от него, тогда это INT.


Zealint писал(а):
Значит, следующим шагом будет смотреть исходники BIOS, чтобы в этом убедиться.

Оказывается, не так просто отыскать полный исходный кода BIOS. Нашёл только для 286, но там обработка прерывания 10h начинается так, будто исключения #MF с тем же вектором произойти в принципе не может. Тогда я включил bochs в режиме отладки и начал смотреть по шагам, куда приведет вызов 10h. Как и ожидалось, он сразу начинает проверять, что лежит в AX, то есть смотрит номер функции прерывания 10h, чтобы к этой функции и перейти. Проверять флаги FPU там никто не собирается. Хотя глубоко я по шагам не заходил, т. к. становится непонятно.

Я, наверное, не один здесь такой: думал, что в обсуждаемых вещах есть какой-то чётко прописанный порядок, а его нету : ) Или всё-таки есть?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 фев 2013, 08:22 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Zealint писал(а):
Оказывается, не так просто отыскать полный исходный кода BIOS. Нашёл только для 286, но там обработка прерывания 10h начинается так, будто исключения #MF с тем же вектором произойти в принципе не может. Тогда я включил bochs в режиме отладки и начал смотреть по шагам, куда приведет вызов 10h. Как и ожидалось, он сразу начинает проверять, что лежит в AX, то есть смотрит номер функции прерывания 10h, чтобы к этой функции и перейти. Проверять флаги FPU там никто не собирается. Хотя глубоко я по шагам не заходил, т. к. становится непонятно.
Как сказал pavia, в реальном режиме исключение FPU обычно обрабатывается по старой схеме - через "прерывание сопроцессора".


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB