Warning: Declaration of JDocumentRendererAtom::render() should be compatible with JDocumentRenderer::render($name, $params = Array, $content = NULL) in /var/www/u1741842/public_html/club155.ru/libraries/joomla/document/feed/renderer/atom.php on line 33
Club155.ru Club155.ru! - собрание справочной информации по программированию и схемотехнике (ассемблер x86, диоды, транзисторы, схемы) http://www.club155.ru 2024-04-27T12:50:08Z Введение 2011-06-14T14:58:54Z 2011-06-14T14:58:54Z http://www.club155.ru/index.php?option=com_content&view=article&id=44&catid=31 Administrator admin@club155.ru <p> </p> <p style="text-align: justify;">Самый ранний из описываемых микропроцессоров — 8086, был полностью 16-разрядным прибором, ориентированным на использование в универсальных вычислительных устройствах в качестве одиночного центрального процессорного устройства (CPU). Этот микропроцессор имел 16-разрядные внутренние регистры, 16-разрядные внутренние и внешние шины данных и мог адресовать до 1 Мб физической памяти. Производительность микропроцессора 8086 могла достигать 0,8 MIPS (млн. операций в секунду).</p> <p style="text-align: justify;">В 1982 году Intel внесла значительные усовершенствования в архитектуру x86 и выпустила новый микропроцессор Intel286. Он также был полностью 16-разрядным, однако, мог адресовать до 16 Мб физической памяти и имел специальный защищенный режим работы, в котором обеспечивались гибкие механизмы адресации, управления доступом к памяти, управления привилегиями и т.п. Система команд этого микропроцессора также была существенно расширена. Его быстродействие достигало уже 2,7 MIPS.</p> <p style="text-align: justify;">Еще большие нововведения в архитектуру x86 были воплощены в процессоре Intel386, который вышел в 1985 году. Это был полностью 32-разрядный микропроцессор, который имел 32-разрядные внутренние регистры и 32-разрядные шины данных. Адресное пространство микропроцессора Intel386 было по тем временам просто безграничным — 4 Гб. Были добавлены также: специальный страничный механизм и новый режим работы — V86, который обеспечивал совместимость данного микропроцессора с программами, написанными для предыдущих устройств серии. Внутренняя микроархитектура микропроцессора Intel386 также была уникальной — она впервые позволяла осуществлять параллельное выполнение нескольких действий (выборка команд и данных, декодирование команд, исполнение команд и т.п.), чем обеспечивалось увеличение быстродействия до 6 MIPS. Примерно в это же время была разработана новая ОС для персональных компьютеров, построенных на микропроцессорах x86 — Windows. С тех пор пара Windows–Intel настолько популярна и неразлучна, что для обозначения архитектуры x86 даже появился новый термин — Wintel.</p> <p style="text-align: justify;">Развитие микроэлектронных технологий позволило существенно повысить вместимость кристаллов электронных схем. В 1989 году появился микропроцессор Intel486. Он содержал интегрированное устройство вычислений с плавающей точкой (FPU) и внутреннюю КЭШ-память для данных и команд. Было также повышено быстродействие процессора (в т.ч. и за счет совершенствования микроархитектуры, которая позволяла еще более запаралелить выполнение многих действий внутри микропроцессора).</p> <p style="text-align: justify;">В 1993 году вышел первый микропроцессор семества P5. Микропроцессор Pentium имел значительно усовершенствованную микроархитектуру. Теперь устройство целочисленных вычислений имело два практически идентичных блока, в которых различные команды могли выполняться параллельно. Были усовершенствованы модули, отвечающие за выборку и декодирование команд, они стали более интеллектуальными и пытались прогнозировать действия процессора, осуществляя предвыборку и преддекодирование команд еще до получения результатов предыдущих команд. Устройство вычислений с плавающей запятой было существенно переработано для достижения большего быстродействия. Были внесены некоторые доработки и в программную архитектуру процессора: появилась поддержка страниц большого размера, режим V86 стал более гибким при обработке прерываний, а средства внутренней самодиагностики вышли из зачаточного состояния. Быстродействие первых процессоров Pentium могло достигать 100 MIPS.</p> <p style="text-align: justify;">C 1993 по 1997 гг. фирма Intel продолжала усовершенствование архитектуры своих процессоров. Был выпущен Pentium Pro — микропроцессор микроархитектуры P6, которая стала основой и для более поздних микропроцессоров. Уже не два, а четыре внутренних модуля параллельно осуществляли выполнение команд, предвыборка дополнилась многими интелектуальными функциями, такими как предсказание ветвлений и т.п. Внутренняя КЭШ-память стала двухуровневой, что позволило, с одной стороны, увеличить ее объем, а с другой обеспечить разумную стоимость микропроцессора. Новая расширенная система команд для обработки мультимедийной информации (MMX) была введена в новые модели микропроцессоров Pentium и Pentium Pro.</p> <p style="text-align: justify;">Современная индустрия микропроцессоров практически прекратила развивать 32-разрядные архитектуры x86 (получив здесь сильнейшего конкурента в лице архитектуры ARM) и переключилась на новый сегмент 64-разрядных архитектур. Последними из существенных нововведений 32-разрядного сегмента стали новые так называемые SIMD (или SSE) команды, впервые введеные в микропроцессоре Pentium III. Однако все эти усовершенствования и потрясающие возможности с программной точки зрения все равно базируются на стандартной архитектуре x86, которая существует уже более 30 лет.</p> <p style="text-align: justify;">Основные элементы архитектуры <span style="mso-ansi-language: EN-US;" lang="EN-US">x</span>86 последовательно описываются в следующих разделах.</p> <ul> <li> <p><a href="http://www.club155.ru/index.php?Itemid=63" title="Система команд x86"><strong>Система команд</strong> </a>– здесь содержится подробная информация обо всех командах процессоров архитектуры x86, в т.ч. и о расширенных наборах команд MMX, 3DNow!, и SIMD (SSE). Для каждой команды указаны выполняемые ей действия и возможные последствия ее применения в различных ситуациях, даны комментарии и рекомендации.</p> </li> <li> <p><a href="http://www.club155.ru/x86internalreg-common" title="Внутренние регистры"><strong>Внутренние регистры</strong></a>– содержит описание всех внутренних регистров процессоров. К ним относятся регистры общего назначения, сегментные регистры, регистры управления и отладки, системные регистры, регистры математического сопроцессора, а также некоторые регистры специального назначения</p> </li> <li> <p><a href="http://www.club155.ru/x86addr-logicaladdress" title="Адресация и многозадачность"><strong>Механизмы адресации, управления памятью, поддержки многозадачности и защиты</strong> </a>– посвящена описанию работы механизма адресации процессора в различных режимах. Также описан страничный механизм, механизм поддержки многозадачности и средства защиты, приведены форматы всех элементов системной архитектуры</p> </li> <li> <p><a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации"><strong>Прерывания, исключения и особые ситуации</strong></a> – содержит подробное описание действий процессора по обработке прерываний и особых ситуаций. Приведены все возможные причины их генерации и протокол реакции процессора на их возникновение. Также описаны исключения математического сопроцессора и исключения для команд потоковой обработки SIMD (SSE).</p> </li> <li> <p><a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=69" title="Форматы данных"><strong>Форматы данных</strong></a>– это описание всех применяемых в архитектуре x86 форматов данных. Здесь представлены как форматы для целочисленной арифметики, так и для арифметики с плавающей запятой, описание данных для команд MMX, 3DNow, SIMD (SSE).</p> </li> <li> <p><a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=73" title="Форматы команд"><strong>Форматы команд</strong></a>– содержит информацию о кодировании команд. Здесь описаны все возможные форматы для кодов команд процессора, приведено назначение и правила кодирования отдельных полей.</p> </li> </ul> <p> </p> <p style="text-align: justify;">С момента появления самого первого микропроцессора архитектуры x86 самые разнообразные фирмы по всему миру производят разработку совместимых устройств. Такие микропроцессоры, как правило, полностью копируют архитектуру приборов Intel и совместимы с программным обеспечением для них.</p> <p style="text-align: justify;">Микропроцессоры-клоны существуют для всех устройств серии x86. В различные периоды из них были наиболее известны: MII (Cyrix, IBM), K6 (AMD), Winchip (IDT) и некоторые другие. Специфика этих микропроцессоров в том, что они предназначались для применения в промышленном оборудовании и недорогих компьютерах средней производительности и не претендовали на лидерство в сфере мощных многопроцессорных сверхвысокопроизводительных систем. До определенного времени производители клонов лишь шли по стопам Intel, производя устройства максимально приближенные по своим характеристикам к приборам Intel и не содержащие никаких структурных расширений. Нововведением стал шаг фирмы AMD, которая разработала и реализовала в своих микропроцессорах новую расширенную систему команд 3DNow! Это расширение было поддержано и другими производителями. Intel, однако, не стала копировать разработки AMD и ввела в свои новые микропроцессоры другое расширение, называемое SIMD или SSE. Впоследствии большинство команд 3DNow! были реализованы в составе новых расширений SSE2 и SSE3, которые появились в процессорах Intel начиная с Pentium IV.</p> <p style="text-align: justify;">Как правило, фирмы производители заявляют о полной совместимости своих изделий с микропроцессорами Intel, однако, как показывает практика, поведение клонов может отличаться от поведения приборов Intel (например, в случае конкурирующих прерываний). Тем не менее, в подавляющем большинстве случаев все что изложено на данном сайте о процессорах Intel верно и для их аналогов производства других фирм.</p> <p> </p> <!-- <p align="center">{jumi [adabracadabra.php]}</p> --> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> <p> </p> <p style="text-align: justify;">Самый ранний из описываемых микропроцессоров — 8086, был полностью 16-разрядным прибором, ориентированным на использование в универсальных вычислительных устройствах в качестве одиночного центрального процессорного устройства (CPU). Этот микропроцессор имел 16-разрядные внутренние регистры, 16-разрядные внутренние и внешние шины данных и мог адресовать до 1 Мб физической памяти. Производительность микропроцессора 8086 могла достигать 0,8 MIPS (млн. операций в секунду).</p> <p style="text-align: justify;">В 1982 году Intel внесла значительные усовершенствования в архитектуру x86 и выпустила новый микропроцессор Intel286. Он также был полностью 16-разрядным, однако, мог адресовать до 16 Мб физической памяти и имел специальный защищенный режим работы, в котором обеспечивались гибкие механизмы адресации, управления доступом к памяти, управления привилегиями и т.п. Система команд этого микропроцессора также была существенно расширена. Его быстродействие достигало уже 2,7 MIPS.</p> <p style="text-align: justify;">Еще большие нововведения в архитектуру x86 были воплощены в процессоре Intel386, который вышел в 1985 году. Это был полностью 32-разрядный микропроцессор, который имел 32-разрядные внутренние регистры и 32-разрядные шины данных. Адресное пространство микропроцессора Intel386 было по тем временам просто безграничным — 4 Гб. Были добавлены также: специальный страничный механизм и новый режим работы — V86, который обеспечивал совместимость данного микропроцессора с программами, написанными для предыдущих устройств серии. Внутренняя микроархитектура микропроцессора Intel386 также была уникальной — она впервые позволяла осуществлять параллельное выполнение нескольких действий (выборка команд и данных, декодирование команд, исполнение команд и т.п.), чем обеспечивалось увеличение быстродействия до 6 MIPS. Примерно в это же время была разработана новая ОС для персональных компьютеров, построенных на микропроцессорах x86 — Windows. С тех пор пара Windows–Intel настолько популярна и неразлучна, что для обозначения архитектуры x86 даже появился новый термин — Wintel.</p> <p style="text-align: justify;">Развитие микроэлектронных технологий позволило существенно повысить вместимость кристаллов электронных схем. В 1989 году появился микропроцессор Intel486. Он содержал интегрированное устройство вычислений с плавающей точкой (FPU) и внутреннюю КЭШ-память для данных и команд. Было также повышено быстродействие процессора (в т.ч. и за счет совершенствования микроархитектуры, которая позволяла еще более запаралелить выполнение многих действий внутри микропроцессора).</p> <p style="text-align: justify;">В 1993 году вышел первый микропроцессор семества P5. Микропроцессор Pentium имел значительно усовершенствованную микроархитектуру. Теперь устройство целочисленных вычислений имело два практически идентичных блока, в которых различные команды могли выполняться параллельно. Были усовершенствованы модули, отвечающие за выборку и декодирование команд, они стали более интеллектуальными и пытались прогнозировать действия процессора, осуществляя предвыборку и преддекодирование команд еще до получения результатов предыдущих команд. Устройство вычислений с плавающей запятой было существенно переработано для достижения большего быстродействия. Были внесены некоторые доработки и в программную архитектуру процессора: появилась поддержка страниц большого размера, режим V86 стал более гибким при обработке прерываний, а средства внутренней самодиагностики вышли из зачаточного состояния. Быстродействие первых процессоров Pentium могло достигать 100 MIPS.</p> <p style="text-align: justify;">C 1993 по 1997 гг. фирма Intel продолжала усовершенствование архитектуры своих процессоров. Был выпущен Pentium Pro — микропроцессор микроархитектуры P6, которая стала основой и для более поздних микропроцессоров. Уже не два, а четыре внутренних модуля параллельно осуществляли выполнение команд, предвыборка дополнилась многими интелектуальными функциями, такими как предсказание ветвлений и т.п. Внутренняя КЭШ-память стала двухуровневой, что позволило, с одной стороны, увеличить ее объем, а с другой обеспечить разумную стоимость микропроцессора. Новая расширенная система команд для обработки мультимедийной информации (MMX) была введена в новые модели микропроцессоров Pentium и Pentium Pro.</p> <p style="text-align: justify;">Современная индустрия микропроцессоров практически прекратила развивать 32-разрядные архитектуры x86 (получив здесь сильнейшего конкурента в лице архитектуры ARM) и переключилась на новый сегмент 64-разрядных архитектур. Последними из существенных нововведений 32-разрядного сегмента стали новые так называемые SIMD (или SSE) команды, впервые введеные в микропроцессоре Pentium III. Однако все эти усовершенствования и потрясающие возможности с программной точки зрения все равно базируются на стандартной архитектуре x86, которая существует уже более 30 лет.</p> <p style="text-align: justify;">Основные элементы архитектуры <span style="mso-ansi-language: EN-US;" lang="EN-US">x</span>86 последовательно описываются в следующих разделах.</p> <ul> <li> <p><a href="http://www.club155.ru/index.php?Itemid=63" title="Система команд x86"><strong>Система команд</strong> </a>– здесь содержится подробная информация обо всех командах процессоров архитектуры x86, в т.ч. и о расширенных наборах команд MMX, 3DNow!, и SIMD (SSE). Для каждой команды указаны выполняемые ей действия и возможные последствия ее применения в различных ситуациях, даны комментарии и рекомендации.</p> </li> <li> <p><a href="http://www.club155.ru/x86internalreg-common" title="Внутренние регистры"><strong>Внутренние регистры</strong></a>– содержит описание всех внутренних регистров процессоров. К ним относятся регистры общего назначения, сегментные регистры, регистры управления и отладки, системные регистры, регистры математического сопроцессора, а также некоторые регистры специального назначения</p> </li> <li> <p><a href="http://www.club155.ru/x86addr-logicaladdress" title="Адресация и многозадачность"><strong>Механизмы адресации, управления памятью, поддержки многозадачности и защиты</strong> </a>– посвящена описанию работы механизма адресации процессора в различных режимах. Также описан страничный механизм, механизм поддержки многозадачности и средства защиты, приведены форматы всех элементов системной архитектуры</p> </li> <li> <p><a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации"><strong>Прерывания, исключения и особые ситуации</strong></a> – содержит подробное описание действий процессора по обработке прерываний и особых ситуаций. Приведены все возможные причины их генерации и протокол реакции процессора на их возникновение. Также описаны исключения математического сопроцессора и исключения для команд потоковой обработки SIMD (SSE).</p> </li> <li> <p><a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=69" title="Форматы данных"><strong>Форматы данных</strong></a>– это описание всех применяемых в архитектуре x86 форматов данных. Здесь представлены как форматы для целочисленной арифметики, так и для арифметики с плавающей запятой, описание данных для команд MMX, 3DNow, SIMD (SSE).</p> </li> <li> <p><a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=73" title="Форматы команд"><strong>Форматы команд</strong></a>– содержит информацию о кодировании команд. Здесь описаны все возможные форматы для кодов команд процессора, приведено назначение и правила кодирования отдельных полей.</p> </li> </ul> <p> </p> <p style="text-align: justify;">С момента появления самого первого микропроцессора архитектуры x86 самые разнообразные фирмы по всему миру производят разработку совместимых устройств. Такие микропроцессоры, как правило, полностью копируют архитектуру приборов Intel и совместимы с программным обеспечением для них.</p> <p style="text-align: justify;">Микропроцессоры-клоны существуют для всех устройств серии x86. В различные периоды из них были наиболее известны: MII (Cyrix, IBM), K6 (AMD), Winchip (IDT) и некоторые другие. Специфика этих микропроцессоров в том, что они предназначались для применения в промышленном оборудовании и недорогих компьютерах средней производительности и не претендовали на лидерство в сфере мощных многопроцессорных сверхвысокопроизводительных систем. До определенного времени производители клонов лишь шли по стопам Intel, производя устройства максимально приближенные по своим характеристикам к приборам Intel и не содержащие никаких структурных расширений. Нововведением стал шаг фирмы AMD, которая разработала и реализовала в своих микропроцессорах новую расширенную систему команд 3DNow! Это расширение было поддержано и другими производителями. Intel, однако, не стала копировать разработки AMD и ввела в свои новые микропроцессоры другое расширение, называемое SIMD или SSE. Впоследствии большинство команд 3DNow! были реализованы в составе новых расширений SSE2 и SSE3, которые появились в процессорах Intel начиная с Pentium IV.</p> <p style="text-align: justify;">Как правило, фирмы производители заявляют о полной совместимости своих изделий с микропроцессорами Intel, однако, как показывает практика, поведение клонов может отличаться от поведения приборов Intel (например, в случае конкурирующих прерываний). Тем не менее, в подавляющем большинстве случаев все что изложено на данном сайте о процессорах Intel верно и для их аналогов производства других фирм.</p> <p> </p> <!-- <p align="center">{jumi [adabracadabra.php]}</p> --> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> Адресация и многозадачность: Средства поддержки мультизадачности 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86addr-multitasking Administrator admin@club155.ru <p>&nbsp;</p> <p style="text-align: justify;">Процессоры, начиная с Intel286, обладают средствами, позволяющими организовать попеременное выполнение процессором разных задач. Под <strong><em>задачей</em></strong> понимается программа, которая оперирует в своем (отведенном только для нее) адресном пространстве, со своими данными в памяти и внутренних регистрах. При необходимости процессор может переключаться между разными задачами, обеспечивая полное переключение <em>контекста</em> и сохранение <em>контекста</em> старой задачи (с возможностью последующего возврата к ней).</p> <p style="text-align: justify;">Во всех описываемых процессорах, начиная с Intel286, имеется так называемый <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенный режим работы</a> (включается битом <a href="http://www.club155.ru/index.php?Itemid=242#CR0" title="Управляющие регистры - Регистр CR0">CR0.PE</a>). В этом режиме помимо <a href="http://www.club155.ru//x86addr-mempages#PAE" title="Расширение физического адреса (PAE)">средств расширенной адресации</a> и <a href="http://www.club155.ru//x86addr-multitasking" title="Адресация и многозадачность: Средства поддержки мультизадачности">поддержки мультизадачности</a> процессор обеспечивает многоуровневую <a href="http://www.club155.ru//x86addr-protection" title="Адресация и многозадачность: Механизм защиты">систему защиты</a> кодов (программ, данных и т.п.) от несанкционированного использования и изменения.</p> <p><a name="multitasking"></a></p> <h3>Механизм мультизадачности</h3> <p style="text-align: justify;"><strong><em>Механизм поддержки мультизадачности</em></strong> функционирует только в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a>. Его работа обеспечивается следующими элементами прикладной и системной архитектуры процессора:</p> <ul> <li><a href="http://www.club155.ru/index.php?Itemid=240" title="Системные регистры">регистр задачи TR</a>;</li> <li>флаг вложенной задачи NT в <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">регистре EFLAGS</a>;</li> <li>флаг TS в <a href="http://www.club155.ru/index.php?Itemid=242#CR0" title="Управляющие регистры - Регистр CR0">регистре CR0</a>;</li> <li>специальный блок данных задачи &mdash;&nbsp;<a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">сегмент состояния задачи</a> (<em>Task State Segment</em>);</li> <li><a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескриптор</a>&nbsp;TSS;</li> <li><a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескриптор</a> шлюза задачи.</li> </ul> <p>&nbsp;</p> <p style="text-align: justify;"><a href="http://www.club155.ru/index.php?Itemid=240" title="Системные регистры">Регистр задачи</a> хранит <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектор</a>&nbsp;<a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a>&nbsp;текущей задачи. Сам <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> предназначен для хранения полного <em>контекста</em> и <em>состояния задачи</em> и уникален для каждой выполняемой задачи (см. рис. 2.6.).</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-6_MultiTask-TR.pdf|500|354}</p> --> <p align="center"><img src="http://www.club155.ru/images/x86_images/2-6_MultiTask-TR.svgz" alt="Связь регистра задачи TR и сегмента состояния задачи TSS" width="400" height="489" /></p> <p align="center"><strong><em>Рис. 2.6. Связь регистра задачи TR и сегмента состояния задачи TSS</em></strong></p> <p>&nbsp;</p> <p style="text-align: justify;">После сброса процессора <em>механизм мультизадачности</em> отключен, для его инициализации необходимо сначала перевести процессор в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенный режим</a>, затем создать <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> для новой задачи и загрузить командой&nbsp;<a href="http://www.club155.ru/x86cmd/LTR" title="LTR - Загрузить регистр задачи">LTR</a> <a href="http://www.club155.ru/index.php?Itemid=240" title="Системные регистры">регистр задачи</a> корректным <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектором</a>. Корректное выполнение программ в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a> возможно только при инициализированной <em>мультизадачности</em>. Даже если предстоит выполнять одну программу, она запускается как одна задача в мультизадачном окружении. Более сложные системы могут использовать развитые возможности процессора по диспетчеризации, сохранению состояния и переключению различных задач.</p> <p><a name="context"></a></p> <h3>Типы задач и контекст задачи</h3> <p style="text-align: justify;">Существует несколько типов задач, которые отличаются режимами работы процессора при их выполнении: <strong>32-разрядные задачи</strong>, <strong><em>16-разрядные задачи</em></strong>, <strong><em>задачи V86</em></strong>. Все эти задачи могут попеременно выполняться совершенно независимо друг от друга. Процессор обеспечивает полное переключение контекста и режима при переходе от одной задачи к другой. Переключение задач может осуществляться в следующих случаях:</p> <ul> <li>при явном вызове командой <a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>;</li> <li>при явном переходе по команде <a href="http://www.club155.ru/x86cmd/JMP" title="JMP - Переход">JMP</a>;</li> <li>при неявном вызове (автоматически процессором) задачи обработки <a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации">прерывания</a>;</li> <li>при неявном вызове задачи обработчика <a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации">исключения</a>;</li> <li>при возврате из процедуры по команде <a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>, когда&nbsp;<a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">EFLAGS.NT</a> = 1.</li> </ul> <p style="text-align: justify;"><strong><em>Контекст</em></strong> каждой задачи хранится в соответствующем <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> и включает:</p> <ul> <li>задание текущей рабочей области памяти задачи (значения всех <a href="http://www.club155.ru/index.php?Itemid=241" title="Сегментные регистры">сегментных регистров</a>);</li> <li>значения всех <a href="http://www.club155.ru/index.php?Itemid=246" title="Регистры общего назначения">регистров общего назначения</a>;</li> <li>значения регистров&nbsp;<a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">EFLAGS</a> и <a href="http://www.club155.ru/index.php?Itemid=251" title="Регистры-указатели FPU">EIP</a>;</li> <li>значения регистра <a href="http://www.club155.ru/index.php?Itemid=240" title="Системные регистры">LDTR</a>;</li> <li>значение регистра <a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR3</a>;</li> <li><a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">карту ввода/вывода</a> и <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">карту прерываний</a>;</li> <li>указатели на стеки 0, 1 и 2-го уровней привилегий;</li> <li><a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектор</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> предыдущей задачи.</li> </ul> <p style="text-align: justify;">Таким образом, каждая задача может иметь: свое <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейное адресное пространство</a>, заданное своей локальной&nbsp;<a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">таблицей дескрипторов</a> (LDT), свое <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">физическое адресное пространство</a>, расположенное в любой доступной области и задаваемое&nbsp;<a href="http://www.club155.ru/index.php?Itemid=485" title="Страничный механизм">страничным механизмом</a> (базовый адрес каталога страниц в <a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR3</a>), свой протокол защиты, обеспечиваемый указателями на стеки разных уровней привилегий и <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">картой ввода/вывода</a>. Поле <em>селектора TSS</em> предыдущей задачи обеспечивает возможность возврата при последовательном вызове нескольких вложенных задач.</p> <p><a name="switching"></a></p> <h3>Переключение задач</h3> <p style="text-align: justify;">Нормальное переключение задач обеспечивается специальными&nbsp;<a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескрипторами</a> в <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">таблицах дескрипторов</a> <strong>LDT</strong>, <strong>GDT</strong> или <strong>IDT</strong>. Такими дескрипторами являются 16- и 32-разрядные <strong><em>дескрипторы TSS</em></strong> и <strong><em>дескриптор шлюза задачи</em></strong>. <em>Дескриптор шлюза задачи</em> предназначен для перенаправления всех указывающих на него вызовов (<a href="http://www.club155.ru/x86cmd/CALL" style="line-height: 16.8px;" title="CALL - Вызов процедуры">CALL</a>), переходов (<a href="http://www.club155.ru/x86cmd/JMP" style="line-height: 16.8px;" title="JMP - Переход">JMP</a>) и векторов прерываний (особых ситуаций) на обработку в отдельную задачу (рис. 2.7.).</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-7_MultiTask-TaskSw.pdf|500|354}</p> --> <p align="center"><img src="http://www.club155.ru/images/x86_images/2-7_MultiTask-TaskSw.svgz" alt="Принцип работы механизма переключения задач" width="450" height="424" /></p> <p align="center"><strong><em>Рис. 2.7. Принцип работы механизма переключения задач</em></strong></p> <p>&nbsp;</p> <p style="text-align: justify;">Полностью процесс переключения задачи (все выполняемые процессором действия) выглядит следующим образом.</p> <ol> <li style="text-align: justify;">Получение <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектор</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> новой задачи либо как операнда в командах <a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>, <a href="http://www.club155.ru/x86cmd/JMP" title="JMP - Переход">JMP</a>, либо из дескриптора шлюза задачи, либо из поля LINK <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">сегмента состояния</a>&nbsp; текущей задачи (если переключение задач инициализировано командой <a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>).</li> <li style="text-align: justify;">Проверка соответствия всех уровней привилегий с целью определения допустимости переключения на новую задачу.</li> <li style="text-align: justify;">Проверка <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескриптора</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> новой задачи (сегмент присутствует и имеет корректный предел, не менее 67h для 32-битного TSS).</li> <li style="text-align: justify;">Проверка того, что новая задача своботна (<a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>, <a href="http://www.club155.ru/x86cmd/JMP" title="JMP - Переход">JMP</a>, <a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации">особая ситуация или прерывание</a>) или занята (<a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>).</li> <li style="text-align: justify;">Проверка того, что <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> текущей (старой) задачи, <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> новой задачи и все <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескрипторы</a>, используемые при переключении задач, отображены <a href="http://www.club155.ru/index.php?Itemid=485" title="Страничный механизм">страничным механизмом</a> на физическую память (т.е. присутствуют в памяти).</li> <li style="text-align: justify;">Очистка бита занятости задачи в <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> старой задачи, если переключение задач инициировано командами <a href="http://www.club155.ru/x86cmd/JMP" title="JMP - Переход">JMP</a> или <a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a> (для <a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>, <a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации">особой ситуации или прерывания</a>&nbsp;бит занятости остается установленным).</li> <li style="text-align: justify;">Производится сохранение контекста старой задачи. Процессор определяет базовый адрес <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> текущей задачи по значению в&nbsp;<a href="http://www.club155.ru/x86internalreg-system#TR" title="Системные регистры - Регистр задачи TR">регистре TR</a> и затем последовательно сохраняет дянные из всех <a href="http://www.club155.ru/index.php?Itemid=246" title="Регистры общего назначения">регистров общего назначения</a>, <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селекторы</a> из <a href="http://www.club155.ru/index.php?Itemid=241" title="Сегментные регистры">сегментных регистров</a>, значение&nbsp;<a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">регистра EFLAGS</a> (причем, если переключение задач инициировано командой <a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>, процессор очищает флаг NT в сохраняемой копии <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">регистра EFLAGS</a>), значение <a href="http://www.club155.ru/index.php?Itemid=251" title="Регистры-указатели FPU">указателя команд EIP</a> и т.д. <br /><em>В данной точке процессор осуществляет переключение задачи. Это означает, что если какая-либо ошибка вознкает на шагах с 1 по 7, то переключения задач не происходит и процессор полностью возвращается в состояние, предшествовавшее команде, инициировавшей переключение задач. Но если ошибка происходит на последующих шагах, то процессор заканчивает переключение задач (без некоторых проверок) и генерирует соответствующую ошибку перед началом выполнения новой задачи (в этом случае обработчик ошибки должен сам полностью завершить переключение задач для запуска новой задачи).</em></li> <li style="text-align: justify;">Если переключение задач было инициировано командой <a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>, <a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации">прерыванием или особой&nbsp;ситуацией</a>, то процессор копирует <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектор</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> старой задачи в поле LINK <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">сегмента TSS</a> новой задачи и устанавливает флаг NT в образе <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">регистра EFLAGS</a>, хранимом в <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> новой задачи.</li> <li style="text-align: justify;">Если переключение задач было инициировано командами <a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>, <a href="http://www.club155.ru/x86cmd/JMP" title="JMP - Переход">JMP</a>, <a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации">прерыванием или особой&nbsp;ситуацией</a>, процессор устанавливает флаг занятости B в <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескрипторе</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> новой задачи.</li> <li style="text-align: justify;">Устанавливается флаг TS в <a href="http://www.club155.ru/index.php?Itemid=242#CR0" title="Управляющие регистры - Регистр CR0">регистре CR0</a>.</li> <li style="text-align: justify;">Производится запись в <a href="http://www.club155.ru/x86internalreg-system#TR" title="Системные регистры - Регистр задачи TR">регистр TR</a> значений <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектора</a> и <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескриптора</a> (в скрытую часть) <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> новой задачи.</li> <li style="text-align: justify;">Производится чтение контекста новой задачи из <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a>. Считываются значения всех <a href="http://www.club155.ru/index.php?Itemid=246" title="Регистры общего назначения">регистров общего назначения</a>, <a href="http://www.club155.ru/index.php?Itemid=241" title="Сегментные регистры">сегментных регистров</a>, <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">регистра флагов EFLAGS</a>,&nbsp;<a href="http://www.club155.ru/index.php?Itemid=251" title="Регистры-указатели FPU">указателя команд EIP</a> и др. (в т.ч. значения для регистров <a href="http://www.club155.ru/index.php?Itemid=240" title="Системные регистры">LDTR</a>, <a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR3</a>).</li> <li style="text-align: justify;">Начинается выполнение команд новой задачи.</li> </ol> <p>&nbsp;</p> <p style="text-align: center;"><strong><em>Таблица 2.3. Проверки и исключения, инициируемые в процессе переключения задач</em></strong></p> <p style="text-align: center;">{loadposition custom_position_T2-3}</p> <p>&nbsp;</p> <p><a name="linked"></a></p> <h3>Вложенные задачи</h3> <p style="text-align: justify;">Для отслеживания цепочек последовательных вызовов задач предназначено поле <strong>LINK</strong> в <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">сегменте TSS</a> и флаг NT <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">регистра EFLAGS</a>. При вызове (командой <a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>, <a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации">прерыванием или особой&nbsp;ситуацией</a>) новой задачи из кода другой задачи (напрямую или через дескриптор шлюза задачи) для индикации того, что новая задача является вложенной, устанавливается флаг <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">NT.EFLAGS</a>, а <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектор</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> старой задачи помещается в поле обратной связи LINK <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">сегмента TSS</a> новой задачи. Указанные действия повторяются, если вложенная задача сама вызывает еще одну задачу и т.д. (см. рис. 2.8.).</p> <p style="text-align: justify;">При приходе команды <a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a> процессор производит возврат к задаче более высокого уровня. При этом поле LINK <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">сегмента TSS</a> закрываемой задачи используется для получения <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектора</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> задачи, к которой производится возврат, флаг <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">NT.EFLAGS</a>&nbsp;после возврата устанавливается в значение, которое было сохранено в <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> перед вызовом вложенной задачи.</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-8_NestedTask.pdf|500|354}</p> --> <p align="center"><img src="http://www.club155.ru/images/x86_images/2-8_NestedTask.svgz" alt="Связь между вложенными задачами" width="540" height="192" /></p> <p align="center"><strong><em>Рис. 2.8. Связь между вложенными задачами</em></strong></p> <p>&nbsp;</p> <p style="text-align: justify;">В случае, если обращение к новой задаче производится командой <a href="http://www.club155.ru/x86cmd/JMP" title="JMP - Переход">JMP</a>, новая задача не считается вложенной, <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">флаг NT</a> не устанавливается и поле <strong>LINK</strong> не используется.</p> <p style="text-align: justify;">Во всех случаях и для всех типов описываемых процессоров рекурсивный вызов задач невозможен. Процессор автоматически предотвращает такую возможность опираясь на значение флага B (<em>занятость</em>) в <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескрипторе</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> вызываемой задачи.</p> <p>&nbsp;</p> <p style="text-align: center;"><strong><em>Таблица 2.4. Влияние различных способов переключения задач на флаги EFLAGS.NT, CR0.TS, поле занятости дескриптора B, поле обратной связи LINK</em></strong></p> <p style="text-align: center;">{loadposition custom_position_T2-4}</p> <p>&nbsp;</p> <p><strong>&nbsp;</strong></p> <p><a name="fpu-task"></a></p> <h3>Особенности переключения задач в программах, использующих FPU и расширенные системы команд <a href="http://www.club155.ru/index.php?option=com_sobipro&amp;sid=10" title="Набор команд MMX"><strong>MMX</strong></a>, <a href="http://www.club155.ru/index.php?option=com_sobipro&amp;sid=11" title="Набор команд 3DNow!"><strong>3DNow</strong>!</a>, <a href="http://www.club155.ru/index.php?option=com_sobipro&amp;sid=12" title="Набор команд SIMD"><strong>SIMD</strong></a></h3> <p style="text-align: justify;">При переключении задач процессор не производит автоматического переключения контекста для FPU/MMX/SIMD. Программа должна самостоятельно позаботится о том, чтобы значения в соответствующих <a href="http://www.club155.ru/index.php?Itemid=247" title="Регистры общего назначения FPU">FPU</a>/<a href="http://www.club155.ru/index.php?Itemid=252" title="Регистры MMX и 3DNow!">MMX</a>/<a href="http://www.club155.ru/index.php?Itemid=253" title="Регистры SIMD">SIMD-регистрах</a> соответствовали текущей выполняемой задаче. Однако ввиду того, что в мультизадачных операционных системах переключение задач может происходить в случайные моменты времени (например, ввиду генерации внешнего прерывания) в процессор введен специальный механизм для поддержки переключения контекста FPU/MMX/SIMD. Работа этого механизма обуславливается наличием специального флага индикации переключения задач <a href="http://www.club155.ru/index.php?Itemid=242#CR0" title="Управляющие регистры - Регистр CR0">CR0.TS</a>, который устанавливается во всех без исключения случаях переключения задач.</p> <p style="text-align: justify;">В нормальном режиме флаг <a href="http://www.club155.ru/index.php?Itemid=242#CR0" title="Управляющие регистры - Регистр CR0">CR0.TS</a> сброшен и все команды FPU/MMX/SIMD выполняются в обычном режиме. После того, как произошло переключение задач <a href="http://www.club155.ru/index.php?Itemid=242#CR0" title="Управляющие регистры - Регистр CR0">CR0.TS</a> автоматически устанавливается. Теперь любая команда FPU/MMX/SIMD (в т.ч. и все <a href="http://www.club155.ru/index.php?option=com_sobipro&amp;sid=11" title="Набор команд 3DNow!">3DNow! команды</a>) перед своим исполнением вызовет генерацию <a href="http://www.club155.ru/x86exceptions-conditions#NM" title="Прерывание 7 &mdash; Сопроцессор отсутствует (#NM): Intel286 &hellip;">особой ситуации #NM (Сопроцессор отсутствует)</a>.</p> <p style="text-align: justify;">Многозадачные операционные системы должны содержать в себе специальную программу обработчик <a href="http://www.club155.ru/x86exceptions-conditions#NM" title="Прерывание 7 &mdash; Сопроцессор отсутствует (#NM): Intel286 &hellip;">прерывания #NM</a>, которая обеспечит соответствие контекста FPU/MMX/SIMD текущей задаче. Т.е. этот обработчик при получении управления должен: сбросить флаг <a href="http://www.club155.ru/index.php?Itemid=242#CR0" title="Управляющие регистры - Регистр CR0">CR0.TS</a>; проверить, соответствует ли текущий контекст FPU/MMX/SIMD текущей выполняемой задаче, если соответствует &mdash; управление возвращается к прерванной команде, если нет &mdash; обработчик должен сохранить значения всех регистров FPU/MMX/SIMD в специальной области памяти, загрузить из другой специальной области памяти значения всех этих регистров для новой задачи и затем передать управление прерванной команде. Естественно в обработчик должен быть заложен механизм слежения за текущими задачами для гарантии полного соответствия всех сохраняемых и загружаемых контекстов своим задачам.</p> <p style="text-align: justify;">Для сохранения контекста FPU/MMX/SIMD могут применяться различные команды и последовательности команд. Это вызвано прежде всего тем, что с развитием архитектуры процессоров старые команды для сохранения совместимости оставлялись без изменений, а новые команды вводились для обеспечения работы появившихся расширений.</p> <p>&nbsp;</p> <p style="text-align: center;"><strong><em>Таблица 2.5. Команды, применяемые для сохранения/восстановления контекста FPU/MMX/SIMD</em></strong></p> <p style="text-align: center;">{loadposition custom_position_T2-5}</p> <p>&nbsp;</p> <p style="text-align: justify;">Специальный флаг <a href="http://www.club155.ru/index.php?Itemid=242#CR4" title="Управляющие регистры - Регистр CR4">CR4.OSFXSR</a>&nbsp;введен для индикации операционной системой того, осуществляет ли она переключение контекста FPU командами&nbsp;<a href="http://www.club155.ru/x86cmd/FXSAVE" title="FXSAVE - Сохранить состояние FPU/MMX/SIMD">FXSAVE</a> и <a href="http://www.club155.ru/x86cmd/FXRSTOR" title="FXRSTOR - Восстановить состояние FPU/MMX/SIMD">FXRSTOR</a>, обеспечивая таким образом переключение контекста SIMD.</p> <p>&nbsp;</p> <p style="text-align: center;">{loadposition article_footer}</p> <p>&nbsp;</p> <p>&nbsp;</p> <p style="text-align: justify;">Процессоры, начиная с Intel286, обладают средствами, позволяющими организовать попеременное выполнение процессором разных задач. Под <strong><em>задачей</em></strong> понимается программа, которая оперирует в своем (отведенном только для нее) адресном пространстве, со своими данными в памяти и внутренних регистрах. При необходимости процессор может переключаться между разными задачами, обеспечивая полное переключение <em>контекста</em> и сохранение <em>контекста</em> старой задачи (с возможностью последующего возврата к ней).</p> <p style="text-align: justify;">Во всех описываемых процессорах, начиная с Intel286, имеется так называемый <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенный режим работы</a> (включается битом <a href="http://www.club155.ru/index.php?Itemid=242#CR0" title="Управляющие регистры - Регистр CR0">CR0.PE</a>). В этом режиме помимо <a href="http://www.club155.ru//x86addr-mempages#PAE" title="Расширение физического адреса (PAE)">средств расширенной адресации</a> и <a href="http://www.club155.ru//x86addr-multitasking" title="Адресация и многозадачность: Средства поддержки мультизадачности">поддержки мультизадачности</a> процессор обеспечивает многоуровневую <a href="http://www.club155.ru//x86addr-protection" title="Адресация и многозадачность: Механизм защиты">систему защиты</a> кодов (программ, данных и т.п.) от несанкционированного использования и изменения.</p> <p><a name="multitasking"></a></p> <h3>Механизм мультизадачности</h3> <p style="text-align: justify;"><strong><em>Механизм поддержки мультизадачности</em></strong> функционирует только в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a>. Его работа обеспечивается следующими элементами прикладной и системной архитектуры процессора:</p> <ul> <li><a href="http://www.club155.ru/index.php?Itemid=240" title="Системные регистры">регистр задачи TR</a>;</li> <li>флаг вложенной задачи NT в <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">регистре EFLAGS</a>;</li> <li>флаг TS в <a href="http://www.club155.ru/index.php?Itemid=242#CR0" title="Управляющие регистры - Регистр CR0">регистре CR0</a>;</li> <li>специальный блок данных задачи &mdash;&nbsp;<a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">сегмент состояния задачи</a> (<em>Task State Segment</em>);</li> <li><a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескриптор</a>&nbsp;TSS;</li> <li><a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескриптор</a> шлюза задачи.</li> </ul> <p>&nbsp;</p> <p style="text-align: justify;"><a href="http://www.club155.ru/index.php?Itemid=240" title="Системные регистры">Регистр задачи</a> хранит <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектор</a>&nbsp;<a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a>&nbsp;текущей задачи. Сам <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> предназначен для хранения полного <em>контекста</em> и <em>состояния задачи</em> и уникален для каждой выполняемой задачи (см. рис. 2.6.).</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-6_MultiTask-TR.pdf|500|354}</p> --> <p align="center"><img src="http://www.club155.ru/images/x86_images/2-6_MultiTask-TR.svgz" alt="Связь регистра задачи TR и сегмента состояния задачи TSS" width="400" height="489" /></p> <p align="center"><strong><em>Рис. 2.6. Связь регистра задачи TR и сегмента состояния задачи TSS</em></strong></p> <p>&nbsp;</p> <p style="text-align: justify;">После сброса процессора <em>механизм мультизадачности</em> отключен, для его инициализации необходимо сначала перевести процессор в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенный режим</a>, затем создать <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> для новой задачи и загрузить командой&nbsp;<a href="http://www.club155.ru/x86cmd/LTR" title="LTR - Загрузить регистр задачи">LTR</a> <a href="http://www.club155.ru/index.php?Itemid=240" title="Системные регистры">регистр задачи</a> корректным <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектором</a>. Корректное выполнение программ в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a> возможно только при инициализированной <em>мультизадачности</em>. Даже если предстоит выполнять одну программу, она запускается как одна задача в мультизадачном окружении. Более сложные системы могут использовать развитые возможности процессора по диспетчеризации, сохранению состояния и переключению различных задач.</p> <p><a name="context"></a></p> <h3>Типы задач и контекст задачи</h3> <p style="text-align: justify;">Существует несколько типов задач, которые отличаются режимами работы процессора при их выполнении: <strong>32-разрядные задачи</strong>, <strong><em>16-разрядные задачи</em></strong>, <strong><em>задачи V86</em></strong>. Все эти задачи могут попеременно выполняться совершенно независимо друг от друга. Процессор обеспечивает полное переключение контекста и режима при переходе от одной задачи к другой. Переключение задач может осуществляться в следующих случаях:</p> <ul> <li>при явном вызове командой <a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>;</li> <li>при явном переходе по команде <a href="http://www.club155.ru/x86cmd/JMP" title="JMP - Переход">JMP</a>;</li> <li>при неявном вызове (автоматически процессором) задачи обработки <a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации">прерывания</a>;</li> <li>при неявном вызове задачи обработчика <a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации">исключения</a>;</li> <li>при возврате из процедуры по команде <a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>, когда&nbsp;<a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">EFLAGS.NT</a> = 1.</li> </ul> <p style="text-align: justify;"><strong><em>Контекст</em></strong> каждой задачи хранится в соответствующем <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> и включает:</p> <ul> <li>задание текущей рабочей области памяти задачи (значения всех <a href="http://www.club155.ru/index.php?Itemid=241" title="Сегментные регистры">сегментных регистров</a>);</li> <li>значения всех <a href="http://www.club155.ru/index.php?Itemid=246" title="Регистры общего назначения">регистров общего назначения</a>;</li> <li>значения регистров&nbsp;<a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">EFLAGS</a> и <a href="http://www.club155.ru/index.php?Itemid=251" title="Регистры-указатели FPU">EIP</a>;</li> <li>значения регистра <a href="http://www.club155.ru/index.php?Itemid=240" title="Системные регистры">LDTR</a>;</li> <li>значение регистра <a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR3</a>;</li> <li><a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">карту ввода/вывода</a> и <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">карту прерываний</a>;</li> <li>указатели на стеки 0, 1 и 2-го уровней привилегий;</li> <li><a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектор</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> предыдущей задачи.</li> </ul> <p style="text-align: justify;">Таким образом, каждая задача может иметь: свое <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейное адресное пространство</a>, заданное своей локальной&nbsp;<a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">таблицей дескрипторов</a> (LDT), свое <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">физическое адресное пространство</a>, расположенное в любой доступной области и задаваемое&nbsp;<a href="http://www.club155.ru/index.php?Itemid=485" title="Страничный механизм">страничным механизмом</a> (базовый адрес каталога страниц в <a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR3</a>), свой протокол защиты, обеспечиваемый указателями на стеки разных уровней привилегий и <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">картой ввода/вывода</a>. Поле <em>селектора TSS</em> предыдущей задачи обеспечивает возможность возврата при последовательном вызове нескольких вложенных задач.</p> <p><a name="switching"></a></p> <h3>Переключение задач</h3> <p style="text-align: justify;">Нормальное переключение задач обеспечивается специальными&nbsp;<a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескрипторами</a> в <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">таблицах дескрипторов</a> <strong>LDT</strong>, <strong>GDT</strong> или <strong>IDT</strong>. Такими дескрипторами являются 16- и 32-разрядные <strong><em>дескрипторы TSS</em></strong> и <strong><em>дескриптор шлюза задачи</em></strong>. <em>Дескриптор шлюза задачи</em> предназначен для перенаправления всех указывающих на него вызовов (<a href="http://www.club155.ru/x86cmd/CALL" style="line-height: 16.8px;" title="CALL - Вызов процедуры">CALL</a>), переходов (<a href="http://www.club155.ru/x86cmd/JMP" style="line-height: 16.8px;" title="JMP - Переход">JMP</a>) и векторов прерываний (особых ситуаций) на обработку в отдельную задачу (рис. 2.7.).</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-7_MultiTask-TaskSw.pdf|500|354}</p> --> <p align="center"><img src="http://www.club155.ru/images/x86_images/2-7_MultiTask-TaskSw.svgz" alt="Принцип работы механизма переключения задач" width="450" height="424" /></p> <p align="center"><strong><em>Рис. 2.7. Принцип работы механизма переключения задач</em></strong></p> <p>&nbsp;</p> <p style="text-align: justify;">Полностью процесс переключения задачи (все выполняемые процессором действия) выглядит следующим образом.</p> <ol> <li style="text-align: justify;">Получение <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектор</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> новой задачи либо как операнда в командах <a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>, <a href="http://www.club155.ru/x86cmd/JMP" title="JMP - Переход">JMP</a>, либо из дескриптора шлюза задачи, либо из поля LINK <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">сегмента состояния</a>&nbsp; текущей задачи (если переключение задач инициализировано командой <a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>).</li> <li style="text-align: justify;">Проверка соответствия всех уровней привилегий с целью определения допустимости переключения на новую задачу.</li> <li style="text-align: justify;">Проверка <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескриптора</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> новой задачи (сегмент присутствует и имеет корректный предел, не менее 67h для 32-битного TSS).</li> <li style="text-align: justify;">Проверка того, что новая задача своботна (<a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>, <a href="http://www.club155.ru/x86cmd/JMP" title="JMP - Переход">JMP</a>, <a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации">особая ситуация или прерывание</a>) или занята (<a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>).</li> <li style="text-align: justify;">Проверка того, что <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> текущей (старой) задачи, <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> новой задачи и все <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескрипторы</a>, используемые при переключении задач, отображены <a href="http://www.club155.ru/index.php?Itemid=485" title="Страничный механизм">страничным механизмом</a> на физическую память (т.е. присутствуют в памяти).</li> <li style="text-align: justify;">Очистка бита занятости задачи в <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> старой задачи, если переключение задач инициировано командами <a href="http://www.club155.ru/x86cmd/JMP" title="JMP - Переход">JMP</a> или <a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a> (для <a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>, <a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации">особой ситуации или прерывания</a>&nbsp;бит занятости остается установленным).</li> <li style="text-align: justify;">Производится сохранение контекста старой задачи. Процессор определяет базовый адрес <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> текущей задачи по значению в&nbsp;<a href="http://www.club155.ru/x86internalreg-system#TR" title="Системные регистры - Регистр задачи TR">регистре TR</a> и затем последовательно сохраняет дянные из всех <a href="http://www.club155.ru/index.php?Itemid=246" title="Регистры общего назначения">регистров общего назначения</a>, <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селекторы</a> из <a href="http://www.club155.ru/index.php?Itemid=241" title="Сегментные регистры">сегментных регистров</a>, значение&nbsp;<a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">регистра EFLAGS</a> (причем, если переключение задач инициировано командой <a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>, процессор очищает флаг NT в сохраняемой копии <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">регистра EFLAGS</a>), значение <a href="http://www.club155.ru/index.php?Itemid=251" title="Регистры-указатели FPU">указателя команд EIP</a> и т.д. <br /><em>В данной точке процессор осуществляет переключение задачи. Это означает, что если какая-либо ошибка вознкает на шагах с 1 по 7, то переключения задач не происходит и процессор полностью возвращается в состояние, предшествовавшее команде, инициировавшей переключение задач. Но если ошибка происходит на последующих шагах, то процессор заканчивает переключение задач (без некоторых проверок) и генерирует соответствующую ошибку перед началом выполнения новой задачи (в этом случае обработчик ошибки должен сам полностью завершить переключение задач для запуска новой задачи).</em></li> <li style="text-align: justify;">Если переключение задач было инициировано командой <a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>, <a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации">прерыванием или особой&nbsp;ситуацией</a>, то процессор копирует <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектор</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> старой задачи в поле LINK <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">сегмента TSS</a> новой задачи и устанавливает флаг NT в образе <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">регистра EFLAGS</a>, хранимом в <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> новой задачи.</li> <li style="text-align: justify;">Если переключение задач было инициировано командами <a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>, <a href="http://www.club155.ru/x86cmd/JMP" title="JMP - Переход">JMP</a>, <a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации">прерыванием или особой&nbsp;ситуацией</a>, процессор устанавливает флаг занятости B в <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескрипторе</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> новой задачи.</li> <li style="text-align: justify;">Устанавливается флаг TS в <a href="http://www.club155.ru/index.php?Itemid=242#CR0" title="Управляющие регистры - Регистр CR0">регистре CR0</a>.</li> <li style="text-align: justify;">Производится запись в <a href="http://www.club155.ru/x86internalreg-system#TR" title="Системные регистры - Регистр задачи TR">регистр TR</a> значений <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектора</a> и <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескриптора</a> (в скрытую часть) <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> новой задачи.</li> <li style="text-align: justify;">Производится чтение контекста новой задачи из <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a>. Считываются значения всех <a href="http://www.club155.ru/index.php?Itemid=246" title="Регистры общего назначения">регистров общего назначения</a>, <a href="http://www.club155.ru/index.php?Itemid=241" title="Сегментные регистры">сегментных регистров</a>, <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">регистра флагов EFLAGS</a>,&nbsp;<a href="http://www.club155.ru/index.php?Itemid=251" title="Регистры-указатели FPU">указателя команд EIP</a> и др. (в т.ч. значения для регистров <a href="http://www.club155.ru/index.php?Itemid=240" title="Системные регистры">LDTR</a>, <a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR3</a>).</li> <li style="text-align: justify;">Начинается выполнение команд новой задачи.</li> </ol> <p>&nbsp;</p> <p style="text-align: center;"><strong><em>Таблица 2.3. Проверки и исключения, инициируемые в процессе переключения задач</em></strong></p> <p style="text-align: center;">{loadposition custom_position_T2-3}</p> <p>&nbsp;</p> <p><a name="linked"></a></p> <h3>Вложенные задачи</h3> <p style="text-align: justify;">Для отслеживания цепочек последовательных вызовов задач предназначено поле <strong>LINK</strong> в <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">сегменте TSS</a> и флаг NT <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">регистра EFLAGS</a>. При вызове (командой <a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>, <a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации">прерыванием или особой&nbsp;ситуацией</a>) новой задачи из кода другой задачи (напрямую или через дескриптор шлюза задачи) для индикации того, что новая задача является вложенной, устанавливается флаг <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">NT.EFLAGS</a>, а <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектор</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> старой задачи помещается в поле обратной связи LINK <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">сегмента TSS</a> новой задачи. Указанные действия повторяются, если вложенная задача сама вызывает еще одну задачу и т.д. (см. рис. 2.8.).</p> <p style="text-align: justify;">При приходе команды <a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a> процессор производит возврат к задаче более высокого уровня. При этом поле LINK <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">сегмента TSS</a> закрываемой задачи используется для получения <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектора</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> задачи, к которой производится возврат, флаг <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">NT.EFLAGS</a>&nbsp;после возврата устанавливается в значение, которое было сохранено в <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> перед вызовом вложенной задачи.</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-8_NestedTask.pdf|500|354}</p> --> <p align="center"><img src="http://www.club155.ru/images/x86_images/2-8_NestedTask.svgz" alt="Связь между вложенными задачами" width="540" height="192" /></p> <p align="center"><strong><em>Рис. 2.8. Связь между вложенными задачами</em></strong></p> <p>&nbsp;</p> <p style="text-align: justify;">В случае, если обращение к новой задаче производится командой <a href="http://www.club155.ru/x86cmd/JMP" title="JMP - Переход">JMP</a>, новая задача не считается вложенной, <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">флаг NT</a> не устанавливается и поле <strong>LINK</strong> не используется.</p> <p style="text-align: justify;">Во всех случаях и для всех типов описываемых процессоров рекурсивный вызов задач невозможен. Процессор автоматически предотвращает такую возможность опираясь на значение флага B (<em>занятость</em>) в <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескрипторе</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> вызываемой задачи.</p> <p>&nbsp;</p> <p style="text-align: center;"><strong><em>Таблица 2.4. Влияние различных способов переключения задач на флаги EFLAGS.NT, CR0.TS, поле занятости дескриптора B, поле обратной связи LINK</em></strong></p> <p style="text-align: center;">{loadposition custom_position_T2-4}</p> <p>&nbsp;</p> <p><strong>&nbsp;</strong></p> <p><a name="fpu-task"></a></p> <h3>Особенности переключения задач в программах, использующих FPU и расширенные системы команд <a href="http://www.club155.ru/index.php?option=com_sobipro&amp;sid=10" title="Набор команд MMX"><strong>MMX</strong></a>, <a href="http://www.club155.ru/index.php?option=com_sobipro&amp;sid=11" title="Набор команд 3DNow!"><strong>3DNow</strong>!</a>, <a href="http://www.club155.ru/index.php?option=com_sobipro&amp;sid=12" title="Набор команд SIMD"><strong>SIMD</strong></a></h3> <p style="text-align: justify;">При переключении задач процессор не производит автоматического переключения контекста для FPU/MMX/SIMD. Программа должна самостоятельно позаботится о том, чтобы значения в соответствующих <a href="http://www.club155.ru/index.php?Itemid=247" title="Регистры общего назначения FPU">FPU</a>/<a href="http://www.club155.ru/index.php?Itemid=252" title="Регистры MMX и 3DNow!">MMX</a>/<a href="http://www.club155.ru/index.php?Itemid=253" title="Регистры SIMD">SIMD-регистрах</a> соответствовали текущей выполняемой задаче. Однако ввиду того, что в мультизадачных операционных системах переключение задач может происходить в случайные моменты времени (например, ввиду генерации внешнего прерывания) в процессор введен специальный механизм для поддержки переключения контекста FPU/MMX/SIMD. Работа этого механизма обуславливается наличием специального флага индикации переключения задач <a href="http://www.club155.ru/index.php?Itemid=242#CR0" title="Управляющие регистры - Регистр CR0">CR0.TS</a>, который устанавливается во всех без исключения случаях переключения задач.</p> <p style="text-align: justify;">В нормальном режиме флаг <a href="http://www.club155.ru/index.php?Itemid=242#CR0" title="Управляющие регистры - Регистр CR0">CR0.TS</a> сброшен и все команды FPU/MMX/SIMD выполняются в обычном режиме. После того, как произошло переключение задач <a href="http://www.club155.ru/index.php?Itemid=242#CR0" title="Управляющие регистры - Регистр CR0">CR0.TS</a> автоматически устанавливается. Теперь любая команда FPU/MMX/SIMD (в т.ч. и все <a href="http://www.club155.ru/index.php?option=com_sobipro&amp;sid=11" title="Набор команд 3DNow!">3DNow! команды</a>) перед своим исполнением вызовет генерацию <a href="http://www.club155.ru/x86exceptions-conditions#NM" title="Прерывание 7 &mdash; Сопроцессор отсутствует (#NM): Intel286 &hellip;">особой ситуации #NM (Сопроцессор отсутствует)</a>.</p> <p style="text-align: justify;">Многозадачные операционные системы должны содержать в себе специальную программу обработчик <a href="http://www.club155.ru/x86exceptions-conditions#NM" title="Прерывание 7 &mdash; Сопроцессор отсутствует (#NM): Intel286 &hellip;">прерывания #NM</a>, которая обеспечит соответствие контекста FPU/MMX/SIMD текущей задаче. Т.е. этот обработчик при получении управления должен: сбросить флаг <a href="http://www.club155.ru/index.php?Itemid=242#CR0" title="Управляющие регистры - Регистр CR0">CR0.TS</a>; проверить, соответствует ли текущий контекст FPU/MMX/SIMD текущей выполняемой задаче, если соответствует &mdash; управление возвращается к прерванной команде, если нет &mdash; обработчик должен сохранить значения всех регистров FPU/MMX/SIMD в специальной области памяти, загрузить из другой специальной области памяти значения всех этих регистров для новой задачи и затем передать управление прерванной команде. Естественно в обработчик должен быть заложен механизм слежения за текущими задачами для гарантии полного соответствия всех сохраняемых и загружаемых контекстов своим задачам.</p> <p style="text-align: justify;">Для сохранения контекста FPU/MMX/SIMD могут применяться различные команды и последовательности команд. Это вызвано прежде всего тем, что с развитием архитектуры процессоров старые команды для сохранения совместимости оставлялись без изменений, а новые команды вводились для обеспечения работы появившихся расширений.</p> <p>&nbsp;</p> <p style="text-align: center;"><strong><em>Таблица 2.5. Команды, применяемые для сохранения/восстановления контекста FPU/MMX/SIMD</em></strong></p> <p style="text-align: center;">{loadposition custom_position_T2-5}</p> <p>&nbsp;</p> <p style="text-align: justify;">Специальный флаг <a href="http://www.club155.ru/index.php?Itemid=242#CR4" title="Управляющие регистры - Регистр CR4">CR4.OSFXSR</a>&nbsp;введен для индикации операционной системой того, осуществляет ли она переключение контекста FPU командами&nbsp;<a href="http://www.club155.ru/x86cmd/FXSAVE" title="FXSAVE - Сохранить состояние FPU/MMX/SIMD">FXSAVE</a> и <a href="http://www.club155.ru/x86cmd/FXRSTOR" title="FXRSTOR - Восстановить состояние FPU/MMX/SIMD">FXRSTOR</a>, обеспечивая таким образом переключение контекста SIMD.</p> <p>&nbsp;</p> <p style="text-align: center;">{loadposition article_footer}</p> <p>&nbsp;</p> Адресация и многозадачность: Страничный механизм 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86addr-mempages Administrator admin@club155.ru <p> </p> <p style="text-align: justify;"><strong><em>Страничный механизм</em></strong> реализован в процессорах начиная с Intel386, он позволяет при наличии ограниченного объема физической памяти организовать виртуальную память на внешних носителях информации (винчестер и т.п.). Суть его работы в том, что все доступное <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейное адресное пространство</a> разбивается на страницы (стандартный размер, поддерживаемый всеми процессорами — 4Кб), каждая из этих страниц обладает определенным набором свойств, задающих правила доступа к ней, а также определяющих положение этой страницы либо в доступном физическом адресном поле, либо на внешнем устройстве (файл виртуальной памяти на винчестере и т.п.). Каждый раз, когда происходит обращение к конкретной странице (по конкретному <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейному адресу</a>) процессор автоматически определяет соответствующий <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">физический адрес</a>, либо передает управление страничному монитору для загрузки искомой страницы в память.</p> <p style="text-align: justify;">Страничный механизм может быть задействован только в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a> (а также и в режиме <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Режим V86">V86</a>) работы процессора. Включение/выключение страничного механизма производится установкой/сбросом бита <a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR0.PG</a>.</p> <p style="text-align: justify;">Страничный механизм и текущий объем поддерживаемой физической памяти не оказывают влияния на формирование <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейного адреса</a>, который всегда остается 32-разрядным. Однако страничный механизм позволяет для каждой задачи задать свой протокол отображения <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейного адреса</a> на <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">физический</a>. Это свойство используется при выполнении задач в режиме V86 для отображения урезанного линейного адресного пространства задач процессора 8086 на старшие области физической памяти.</p> <p style="text-align: justify;">Поскольку размер страниц 4 Кб существенно ограничивал возможности программистов, в процессоры начиная с Pentium было введено расширение, позволяющее наряду со стандартными 4 Кб страницами использовать большие страницы размером 4 Мб. При этом только незначительно изменилась интерпретация входного <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейного адреса</a> и был введен дополнительный формат <a href="http://www.club155.ru/index.php?Itemid=490" title="Каталоги и таблицы преобразований">элементов каталога страниц</a> (рис. 2.4.).</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-4_ADDR_Page32.pdf|500|620}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/2-4_ADDR_Page32.svgz" width="540" height="621" alt="Процесс формирования физического адреса при работе со страничным механизмом в режимах 4Кб и 4Мб страниц и 32-разрядного физического адреса и в режиме PSE-36"/> </p> <p align="center"><strong><em>Рис. 2.4. Процесс формирования физического адреса при работе со страничным механизмом в режимах 4Кб и 4Мб страниц и 32-разрядного физического адреса и в режиме PSE-36</em></strong></p> <p></p> <h3><a name="PAE"></a>Расширение физического адреса (PAE)</h3> <p style="text-align: justify;">В процессорах начиная с Pentium Pro возможна реализация специального механизма <strong><em>расширения физического адреса</em></strong> (управляется битом <a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR4.PAE</a>). При этом процессор может адресовать физическую память объемом до 2<sup>36</sup> байт (64 Гб). Для поддержки работы данного расширения некоторые изменения вводятся и в механизм страничных преобразований. Заметим, что изменения касаются только страничного механизма, формирование <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейного адреса</a> происходит обычным образом независимо от текущего значения <a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR4.PAE</a> и <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейный адрес</a> всегда остается 32-битным. Но поскольку для каждой задачи может быть задан свой протокол отображения <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейного адреса</a> на <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">физический</a>, в многозадачной среде становится возможным использование физической памяти объемом больше, чем общий объем линейного адресного пространства, доступного каждой конкретной задаче (2<sup>32</sup> байт).</p> <p style="text-align: justify;">Когда <em>расширение физического адреса</em> включено (<a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR4.PAE</a> = 1) страничный механизм поддерживает страницы размером 4 Кб и 2 Мб, а в иерархию таблиц страничных преобразований вводится еще одна таблица — <strong><em>таблица указателей на каталоги страниц</em></strong> (рис. 2.5.).</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-5_ADDR_Page36.pdf|500|620}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/2-5_ADDR_Page36.svgz" width="540" height="630" alt="Процесс формирования физического адреса при работе со страничным механизмом в режимах 4Кб и 2Мб страниц и 36-разрядного физического адреса"/> </p> <p align="center"><strong><em>Рис. 2.5. Процесс формирования физического адреса при работе со страничным механизмом в режимах 4Кб и 2Мб страниц и 36-разрядного физического адреса</em></strong></p> <p> </p> <h3><a name="PSE-36"></a>36-битное расширение размера страниц (PSE-36)</h3> <p style="text-align: justify;">Еще одно расширение страничного механизма может вводится в процессоры поддерживающие 36-разрядную адресацию физической памяти (Pentium Pro …). <strong><em>PSE‑36</em></strong> (<em>36-bit Page Size Extension</em>) — 36-битное расширение размера страниц. Это расширение не является управляемым, т.е. не может включаться/выключаться специальными битами в управляющих регистрах, оно либо поддерживается процессором, либо нет (определяется командой <a href="http://www.club155.ru/x86cmd/CPUID" title="CPUID - Идентификация CPU">CPUID</a>).</p> <p style="text-align: justify;">Расширение <strong>PSE-36</strong> позволяет организовать отображение 4 Мб страниц на 36-битное физическое адресное пространство. Характерно, что осуществляется это небольшой модификацией режима 32-битного физического адреса (<a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR4.PAE</a> = 0, <a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR4.PSE</a> = 1). В режиме 36-битного адреса (<a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR4.PAE</a> = 1) <strong>PSE-36</strong> не оказывает никакого влияния на работу процессора, так как структура таблиц страничных преобразований изменена и уже предполагает 36-битную адресацию.</p> <p style="text-align: justify;">Поддержка <strong>PSE-36</strong> означает, что в <a href="http://www.club155.ru/index.php?Itemid=490" title="Каталоги и таблицы преобразований">элементе каталога страниц</a> для 4 Мб страницы вместо 10 бит базового адреса страницы поддерживается 14 бит. Старшие 4 бита располагаются в поле ранее считавшемся зарезервированным и заполнявшемся нулями. Такое решение позволяет программному обеспечению, написанному для более ранних моделей процессоров, которые не поддерживают <strong>PSE-36</strong>, без изменений работать на всех современных моделях (если только ПО как-либо не использовало зарезервированные биты или не записывало в них единицы). Программы же, написанные для процессоров с поддержкой <strong>PSE-36</strong> и использующие это расширение, не смогут нормально функционировать на процессорах без <strong>PSE-36</strong>.</p> <p> </p> <p style="text-align: center;"><strong><em>Таблица 2.2. Размерность физического адреса в различных режимах работы процессора: Pentium Pro …</em></strong></p> <p style="text-align: center;">{loadposition custom_position_T2-2}</p> <p> </p> <p style="text-align: justify;">Работа страничного механизма при поддержке <strong>PSE-36</strong> изображена на рис. 2.4. (значения разрядности адреса для <strong>PSE-36</strong> приведены в скобках).</p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> <p> </p> <p style="text-align: justify;"><strong><em>Страничный механизм</em></strong> реализован в процессорах начиная с Intel386, он позволяет при наличии ограниченного объема физической памяти организовать виртуальную память на внешних носителях информации (винчестер и т.п.). Суть его работы в том, что все доступное <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейное адресное пространство</a> разбивается на страницы (стандартный размер, поддерживаемый всеми процессорами — 4Кб), каждая из этих страниц обладает определенным набором свойств, задающих правила доступа к ней, а также определяющих положение этой страницы либо в доступном физическом адресном поле, либо на внешнем устройстве (файл виртуальной памяти на винчестере и т.п.). Каждый раз, когда происходит обращение к конкретной странице (по конкретному <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейному адресу</a>) процессор автоматически определяет соответствующий <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">физический адрес</a>, либо передает управление страничному монитору для загрузки искомой страницы в память.</p> <p style="text-align: justify;">Страничный механизм может быть задействован только в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a> (а также и в режиме <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Режим V86">V86</a>) работы процессора. Включение/выключение страничного механизма производится установкой/сбросом бита <a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR0.PG</a>.</p> <p style="text-align: justify;">Страничный механизм и текущий объем поддерживаемой физической памяти не оказывают влияния на формирование <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейного адреса</a>, который всегда остается 32-разрядным. Однако страничный механизм позволяет для каждой задачи задать свой протокол отображения <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейного адреса</a> на <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">физический</a>. Это свойство используется при выполнении задач в режиме V86 для отображения урезанного линейного адресного пространства задач процессора 8086 на старшие области физической памяти.</p> <p style="text-align: justify;">Поскольку размер страниц 4 Кб существенно ограничивал возможности программистов, в процессоры начиная с Pentium было введено расширение, позволяющее наряду со стандартными 4 Кб страницами использовать большие страницы размером 4 Мб. При этом только незначительно изменилась интерпретация входного <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейного адреса</a> и был введен дополнительный формат <a href="http://www.club155.ru/index.php?Itemid=490" title="Каталоги и таблицы преобразований">элементов каталога страниц</a> (рис. 2.4.).</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-4_ADDR_Page32.pdf|500|620}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/2-4_ADDR_Page32.svgz" width="540" height="621" alt="Процесс формирования физического адреса при работе со страничным механизмом в режимах 4Кб и 4Мб страниц и 32-разрядного физического адреса и в режиме PSE-36"/> </p> <p align="center"><strong><em>Рис. 2.4. Процесс формирования физического адреса при работе со страничным механизмом в режимах 4Кб и 4Мб страниц и 32-разрядного физического адреса и в режиме PSE-36</em></strong></p> <p></p> <h3><a name="PAE"></a>Расширение физического адреса (PAE)</h3> <p style="text-align: justify;">В процессорах начиная с Pentium Pro возможна реализация специального механизма <strong><em>расширения физического адреса</em></strong> (управляется битом <a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR4.PAE</a>). При этом процессор может адресовать физическую память объемом до 2<sup>36</sup> байт (64 Гб). Для поддержки работы данного расширения некоторые изменения вводятся и в механизм страничных преобразований. Заметим, что изменения касаются только страничного механизма, формирование <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейного адреса</a> происходит обычным образом независимо от текущего значения <a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR4.PAE</a> и <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейный адрес</a> всегда остается 32-битным. Но поскольку для каждой задачи может быть задан свой протокол отображения <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">линейного адреса</a> на <a href="http://www.club155.ru/index.php?Itemid=484" title="Линейный и физический адрес">физический</a>, в многозадачной среде становится возможным использование физической памяти объемом больше, чем общий объем линейного адресного пространства, доступного каждой конкретной задаче (2<sup>32</sup> байт).</p> <p style="text-align: justify;">Когда <em>расширение физического адреса</em> включено (<a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR4.PAE</a> = 1) страничный механизм поддерживает страницы размером 4 Кб и 2 Мб, а в иерархию таблиц страничных преобразований вводится еще одна таблица — <strong><em>таблица указателей на каталоги страниц</em></strong> (рис. 2.5.).</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-5_ADDR_Page36.pdf|500|620}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/2-5_ADDR_Page36.svgz" width="540" height="630" alt="Процесс формирования физического адреса при работе со страничным механизмом в режимах 4Кб и 2Мб страниц и 36-разрядного физического адреса"/> </p> <p align="center"><strong><em>Рис. 2.5. Процесс формирования физического адреса при работе со страничным механизмом в режимах 4Кб и 2Мб страниц и 36-разрядного физического адреса</em></strong></p> <p> </p> <h3><a name="PSE-36"></a>36-битное расширение размера страниц (PSE-36)</h3> <p style="text-align: justify;">Еще одно расширение страничного механизма может вводится в процессоры поддерживающие 36-разрядную адресацию физической памяти (Pentium Pro …). <strong><em>PSE‑36</em></strong> (<em>36-bit Page Size Extension</em>) — 36-битное расширение размера страниц. Это расширение не является управляемым, т.е. не может включаться/выключаться специальными битами в управляющих регистрах, оно либо поддерживается процессором, либо нет (определяется командой <a href="http://www.club155.ru/x86cmd/CPUID" title="CPUID - Идентификация CPU">CPUID</a>).</p> <p style="text-align: justify;">Расширение <strong>PSE-36</strong> позволяет организовать отображение 4 Мб страниц на 36-битное физическое адресное пространство. Характерно, что осуществляется это небольшой модификацией режима 32-битного физического адреса (<a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR4.PAE</a> = 0, <a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR4.PSE</a> = 1). В режиме 36-битного адреса (<a href="http://www.club155.ru/index.php?Itemid=242" title="Управляющие регистры">CR4.PAE</a> = 1) <strong>PSE-36</strong> не оказывает никакого влияния на работу процессора, так как структура таблиц страничных преобразований изменена и уже предполагает 36-битную адресацию.</p> <p style="text-align: justify;">Поддержка <strong>PSE-36</strong> означает, что в <a href="http://www.club155.ru/index.php?Itemid=490" title="Каталоги и таблицы преобразований">элементе каталога страниц</a> для 4 Мб страницы вместо 10 бит базового адреса страницы поддерживается 14 бит. Старшие 4 бита располагаются в поле ранее считавшемся зарезервированным и заполнявшемся нулями. Такое решение позволяет программному обеспечению, написанному для более ранних моделей процессоров, которые не поддерживают <strong>PSE-36</strong>, без изменений работать на всех современных моделях (если только ПО как-либо не использовало зарезервированные биты или не записывало в них единицы). Программы же, написанные для процессоров с поддержкой <strong>PSE-36</strong> и использующие это расширение, не смогут нормально функционировать на процессорах без <strong>PSE-36</strong>.</p> <p> </p> <p style="text-align: center;"><strong><em>Таблица 2.2. Размерность физического адреса в различных режимах работы процессора: Pentium Pro …</em></strong></p> <p style="text-align: center;">{loadposition custom_position_T2-2}</p> <p> </p> <p style="text-align: justify;">Работа страничного механизма при поддержке <strong>PSE-36</strong> изображена на рис. 2.4. (значения разрядности адреса для <strong>PSE-36</strong> приведены в скобках).</p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> Внутренние регистры: Сегментные регистры 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86internalreg-segment Administrator admin@club155.ru <p> </p> <p style="text-align: justify;"><strong><em>Сегментные регистры</em></strong> используются при формировании полного <a href="http://www.club155.ru/index.php?Itemid=483" title="Логический адрес">логического адреса</a>. Они содержат <a href="http://www.club155.ru//x86addr-selectors" title="Адресация и многозадачность: Селекторы">селекторы сегментов</a>, которые используются процессором при доступе к данным, стеку и коду. Формат сегментных регистров приведен на рис. 1.2.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-2_SegR.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-2_SegR.svgz" width="450" height="166" alt="Формат сегментных регистров"/> </p> <p align="center"><strong><em>Рис. 1.2. Формат сегментных регистров</em></strong></p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> <p> </p> <p style="text-align: justify;"><strong><em>Сегментные регистры</em></strong> используются при формировании полного <a href="http://www.club155.ru/index.php?Itemid=483" title="Логический адрес">логического адреса</a>. Они содержат <a href="http://www.club155.ru//x86addr-selectors" title="Адресация и многозадачность: Селекторы">селекторы сегментов</a>, которые используются процессором при доступе к данным, стеку и коду. Формат сегментных регистров приведен на рис. 1.2.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-2_SegR.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-2_SegR.svgz" width="450" height="166" alt="Формат сегментных регистров"/> </p> <p align="center"><strong><em>Рис. 1.2. Формат сегментных регистров</em></strong></p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> Внутренние регистры: Регистр состояния FPU 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86internalreg-fpusw Administrator admin@club155.ru <p> </p> <p style="text-align: justify;"><strong><em>Регистр состояния FPU</em></strong> (рис. 1.13.) выполняет функции в чем-то аналогичные функциям <a href="http://www.club155.ru/index.php?Itemid=239" title="Регистр флагов">регистра флагов (E)FLAGS</a>, но только для операций с плавающей точкой. За исключением одного бита (SF), его формат и функции совершенно идентичны для всех сопроцессоров архитектуры x87 (начиная с 8087).</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-13_FPU-SW.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-13_FPU-SW.svgz" width="350" height="296" alt="Формат регистра состояния SW (регистра флагов FPU)"/> </p> <p align="center"><strong><em>Рис. 1.13. Формат регистра состояния SW (регистра флагов FPU)</em></strong></p> <p> </p> <p><a name="B"></a><strong>B</strong> (Бит занятости, бит 15)</p> <p style="text-align: justify;">Бит занятости сохранен для совместимости с 8087 и Intel287, где он устанавливается в 1, когда сопроцессор выполняет команду, или происходит прерывание в сопроцессоре в результате исключительной ситуации. Если сопроцессор свободен, бит занятости установлен в 0. В современных процессорах (Intel387, Intel486, …) этот бит дублирует состояние бита <a href="http://www.club155.ru//x86internalreg-fpusw#ES" title="Внутренние регистры: Регистр состояния FPU - Бит суммарной ошибки, бит 7: Intel287 …">ES</a>.</p> <p> </p> <p><a name="TOP"></a><strong>TOP</strong> (Указатель вершины стека FPU, биты 13, 12, 11)</p> <p style="text-align: justify;">Содержит номер 80-битного <a href="http://www.club155.ru/index.php?Itemid=247" title="Регистры общего назначения FPU">регистра общего назначения</a>, являющегося вершиной стека.</p> <p> <ul style='list-style-type:none;'> <li>000 – <strong>R0</strong>;</li> <li>001 – <strong>R1</strong>;</li> <li>...</li> <li>111 – <strong>R7</strong>.</li> </ul> </p> <p> </p> <p><a name="C0"></a><strong>C0, C1, C2, C3</strong> (Коды условий, биты 8, 9, 10, 14)</p> <p style="text-align: justify;">Коды условий FPU аналогичны флагам CPU из <a href="http://www.club155.ru/index.php?Itemid=239" title="Регистр флагов">регистра флагов (E)FLAGS</a>. FPU устанавливает значения этих битов по результатам арифметических операций.</p> <p> </p> <p style="text-align: center;"><strong><em>Таблица 1.1. Интерпретация кодов условий</em></strong></p> <p style="text-align: center;">{loadposition custom_position_T1-1}</p> <p style="text-align: justify;">Команда <a href="http://www.club155.ru/x86cmdfpu/FSTSW" title="FSTSW - Сохранить регистр SW с проверкой отложенных исключений">FSTSW</a> копирует значение слова состояния сопроцессора в регистр AX процессора. Далее командой <a href="http://www.club155.ru/x86cmd/SAHF" title="SAHF - Записать содержимое AH в регистр FLAGS">SAHF</a> можно скопировать флаги <strong>C3..C0</strong> в <a href="http://www.club155.ru/index.php?Itemid=239" title="Регистр флагов">регистр флагов FLAGS</a>.</p> <p> </p> <p style="text-align: center;"><strong><em>Таблица 1.2. Соответствие между битами C3..C0 и битами регистра флагов CPU</em></strong></p> <p style="text-align: center;">{loadposition custom_position_T1-2}</p> <p> </p> <p><a name="ES"><strong>ES</strong> (Бит суммарной ошибки, бит 7: Intel287 …), <br /></a><a name="IR"></a><strong>IR</strong> (Флаг запроса прерывания, бит 7: только для 8087)</p> <p style="text-align: justify;">В сопроцессорах 8087 этот бит содержит <strong><em>флаг запроса прерывания</em></strong> (IR), который устанавливается в единицу при возникновении какой-либо незамаскированной исключительной ситуации. Значение флага IR повторяется на выводе <strong>INT#</strong> сопроцессора. Флаг IR может быть замаскирован программно установкой <a href="http://www.club155.ru//x86internalreg-fpucw#IEM" title="Внутренние регистры: Регистр управления FPU - IEM (Запрет прерываний, бит 7: только для 8087)">бита IEM</a> регистра управления FPU.</p> <p style="text-align: justify;">Во всех последующих моделях FPU (Intel287 …) этот бит называется <strong><em>битом суммарной ошибки</em></strong> (ES) и устанавливается в 1 при возникновении какой-либо незамаскированной <a href="http://www.club155.ru//x86exceptions-fputypes" title="Прерывания и особые ситуации: Типы и средства индикации исключений FPU">исключительной ситуации</a>, иначе — очищается. При установленном бите ES, активизируется сигнал на выводе <strong>ERROR#</strong> (Intel287, Intel387) или <strong>FERR#</strong> (Intel486 …).</p> <p> </p> <p><a name="SF"></a><strong>SF</strong> (Стековая ошибка, бит 6: Intel387 …)</p> <p style="text-align: justify;">Eсли исключение <a href="http://www.club155.ru/x86exceptions-fpuconditions#I" title="Исключения FPU - Недействительная операция (#I)">недействительная операция (#I)</a> возникает в результате выхода за верхнюю или нижнюю границы регистрового стека (<a href="http://www.club155.ru/x86exceptions-fpuconditions#IS" title="Исключения FPU - Недействительная операция (#I) - Стековые операции (#IS)">#IS</a>), то устанавливается не только бит 0 (IE) слова состояния, но и бит 6 (SF), при этом бит 9 (C1) указывает на выход за верхнюю границу (переполнение) стека (C1 = 1) или на выход за нижнюю границу (C1 = 0).</p> <p style="text-align: justify;">В сопроцессорах Intel287 и 8087 этот бит не используется и является зарезервированным.</p> <p> </p> <p><a name="PE"></a><strong>PE, UE, OE, ZE, DE, IE</strong> (Флаги исключительных ситуаций, биты 5, 4, 3, 2, 1, 0)</p> <p style="text-align: justify;">Устанавливаются в случае возникновения одной из шести <a href="http://www.club155.ru/index.php?Itemid=499" title="Исключения FPU">особых ситуаций сопроцессора</a> (<em>исключений FPU</em>). Каждому исключению соответствует свой флаг:</p> <p> <ul style='list-style-type:none;'> <li><strong>PE</strong> – <a href="http://www.club155.ru//x86exceptions-fpuconditions#P" title="Исключения FPU - Неточный результат (#P)">неточный результат (#P)</a>;</li> <li><strong>UE</strong> – <a href="http://www.club155.ru//x86exceptions-fpuconditions#U" title="Исключения FPU - Антипереполнение (#U)">антипереполнение (#U)</a>;</li> <li><strong>OE</strong> – <a href="http://www.club155.ru//x86exceptions-fpuconditions#O" title="Исключения FPU - Переполнение (#O)">переполнение (#O)</a>;</li> <li><strong>ZE</strong> – <a href="http://www.club155.ru//x86exceptions-fpuconditions#Z" title="Исключения FPU - Деление на нуль (#Z)">деление на нуль (#Z)</a>;</li> <li><strong>DE</strong> – <a href="http://www.club155.ru//x86exceptions-fpuconditions#D" title="Исключения FPU - Денормализованный операнд (#D)">денормализованный операнд (#D)</a>;</li> <li><strong>IE</strong> – <a href="http://www.club155.ru//x86exceptions-fpuconditions#I" title="Исключения FPU - Недействительная операция (#I)">недействительная операция (#I)</a>.</li> </ul> </p> <p style="text-align: justify;">Помимо установки соответствующего <em>флага исключительной ситуации</em>, сопроцессор при возникновении исключения может выдавать или не выдавать сигнал прерывания. Это зависит от состояния соответствующих <a href="http://www.club155.ru//x86internalreg-fpucw#PM" title"Внутренние регистры: Регистр управления FPU - Маски исключений, биты 5, 4, 3, 2, 1, 0">битов маски исключений</a> регистра управления FPU. В случае, когда бит маски исключения установлен, внешний сигнал не выдается, но флаг исключения все равно устанавливается. Таким образом, используя эффект накопления ошибок, программное обеспечение может замаскировать все исключения до выполнения групповых вычислений, затем произвести вычисления и проверить содержимое всех флагов для выяснения того, какие исключения имели место.</p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> <p> </p> <p style="text-align: justify;"><strong><em>Регистр состояния FPU</em></strong> (рис. 1.13.) выполняет функции в чем-то аналогичные функциям <a href="http://www.club155.ru/index.php?Itemid=239" title="Регистр флагов">регистра флагов (E)FLAGS</a>, но только для операций с плавающей точкой. За исключением одного бита (SF), его формат и функции совершенно идентичны для всех сопроцессоров архитектуры x87 (начиная с 8087).</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-13_FPU-SW.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-13_FPU-SW.svgz" width="350" height="296" alt="Формат регистра состояния SW (регистра флагов FPU)"/> </p> <p align="center"><strong><em>Рис. 1.13. Формат регистра состояния SW (регистра флагов FPU)</em></strong></p> <p> </p> <p><a name="B"></a><strong>B</strong> (Бит занятости, бит 15)</p> <p style="text-align: justify;">Бит занятости сохранен для совместимости с 8087 и Intel287, где он устанавливается в 1, когда сопроцессор выполняет команду, или происходит прерывание в сопроцессоре в результате исключительной ситуации. Если сопроцессор свободен, бит занятости установлен в 0. В современных процессорах (Intel387, Intel486, …) этот бит дублирует состояние бита <a href="http://www.club155.ru//x86internalreg-fpusw#ES" title="Внутренние регистры: Регистр состояния FPU - Бит суммарной ошибки, бит 7: Intel287 …">ES</a>.</p> <p> </p> <p><a name="TOP"></a><strong>TOP</strong> (Указатель вершины стека FPU, биты 13, 12, 11)</p> <p style="text-align: justify;">Содержит номер 80-битного <a href="http://www.club155.ru/index.php?Itemid=247" title="Регистры общего назначения FPU">регистра общего назначения</a>, являющегося вершиной стека.</p> <p> <ul style='list-style-type:none;'> <li>000 – <strong>R0</strong>;</li> <li>001 – <strong>R1</strong>;</li> <li>...</li> <li>111 – <strong>R7</strong>.</li> </ul> </p> <p> </p> <p><a name="C0"></a><strong>C0, C1, C2, C3</strong> (Коды условий, биты 8, 9, 10, 14)</p> <p style="text-align: justify;">Коды условий FPU аналогичны флагам CPU из <a href="http://www.club155.ru/index.php?Itemid=239" title="Регистр флагов">регистра флагов (E)FLAGS</a>. FPU устанавливает значения этих битов по результатам арифметических операций.</p> <p> </p> <p style="text-align: center;"><strong><em>Таблица 1.1. Интерпретация кодов условий</em></strong></p> <p style="text-align: center;">{loadposition custom_position_T1-1}</p> <p style="text-align: justify;">Команда <a href="http://www.club155.ru/x86cmdfpu/FSTSW" title="FSTSW - Сохранить регистр SW с проверкой отложенных исключений">FSTSW</a> копирует значение слова состояния сопроцессора в регистр AX процессора. Далее командой <a href="http://www.club155.ru/x86cmd/SAHF" title="SAHF - Записать содержимое AH в регистр FLAGS">SAHF</a> можно скопировать флаги <strong>C3..C0</strong> в <a href="http://www.club155.ru/index.php?Itemid=239" title="Регистр флагов">регистр флагов FLAGS</a>.</p> <p> </p> <p style="text-align: center;"><strong><em>Таблица 1.2. Соответствие между битами C3..C0 и битами регистра флагов CPU</em></strong></p> <p style="text-align: center;">{loadposition custom_position_T1-2}</p> <p> </p> <p><a name="ES"><strong>ES</strong> (Бит суммарной ошибки, бит 7: Intel287 …), <br /></a><a name="IR"></a><strong>IR</strong> (Флаг запроса прерывания, бит 7: только для 8087)</p> <p style="text-align: justify;">В сопроцессорах 8087 этот бит содержит <strong><em>флаг запроса прерывания</em></strong> (IR), который устанавливается в единицу при возникновении какой-либо незамаскированной исключительной ситуации. Значение флага IR повторяется на выводе <strong>INT#</strong> сопроцессора. Флаг IR может быть замаскирован программно установкой <a href="http://www.club155.ru//x86internalreg-fpucw#IEM" title="Внутренние регистры: Регистр управления FPU - IEM (Запрет прерываний, бит 7: только для 8087)">бита IEM</a> регистра управления FPU.</p> <p style="text-align: justify;">Во всех последующих моделях FPU (Intel287 …) этот бит называется <strong><em>битом суммарной ошибки</em></strong> (ES) и устанавливается в 1 при возникновении какой-либо незамаскированной <a href="http://www.club155.ru//x86exceptions-fputypes" title="Прерывания и особые ситуации: Типы и средства индикации исключений FPU">исключительной ситуации</a>, иначе — очищается. При установленном бите ES, активизируется сигнал на выводе <strong>ERROR#</strong> (Intel287, Intel387) или <strong>FERR#</strong> (Intel486 …).</p> <p> </p> <p><a name="SF"></a><strong>SF</strong> (Стековая ошибка, бит 6: Intel387 …)</p> <p style="text-align: justify;">Eсли исключение <a href="http://www.club155.ru/x86exceptions-fpuconditions#I" title="Исключения FPU - Недействительная операция (#I)">недействительная операция (#I)</a> возникает в результате выхода за верхнюю или нижнюю границы регистрового стека (<a href="http://www.club155.ru/x86exceptions-fpuconditions#IS" title="Исключения FPU - Недействительная операция (#I) - Стековые операции (#IS)">#IS</a>), то устанавливается не только бит 0 (IE) слова состояния, но и бит 6 (SF), при этом бит 9 (C1) указывает на выход за верхнюю границу (переполнение) стека (C1 = 1) или на выход за нижнюю границу (C1 = 0).</p> <p style="text-align: justify;">В сопроцессорах Intel287 и 8087 этот бит не используется и является зарезервированным.</p> <p> </p> <p><a name="PE"></a><strong>PE, UE, OE, ZE, DE, IE</strong> (Флаги исключительных ситуаций, биты 5, 4, 3, 2, 1, 0)</p> <p style="text-align: justify;">Устанавливаются в случае возникновения одной из шести <a href="http://www.club155.ru/index.php?Itemid=499" title="Исключения FPU">особых ситуаций сопроцессора</a> (<em>исключений FPU</em>). Каждому исключению соответствует свой флаг:</p> <p> <ul style='list-style-type:none;'> <li><strong>PE</strong> – <a href="http://www.club155.ru//x86exceptions-fpuconditions#P" title="Исключения FPU - Неточный результат (#P)">неточный результат (#P)</a>;</li> <li><strong>UE</strong> – <a href="http://www.club155.ru//x86exceptions-fpuconditions#U" title="Исключения FPU - Антипереполнение (#U)">антипереполнение (#U)</a>;</li> <li><strong>OE</strong> – <a href="http://www.club155.ru//x86exceptions-fpuconditions#O" title="Исключения FPU - Переполнение (#O)">переполнение (#O)</a>;</li> <li><strong>ZE</strong> – <a href="http://www.club155.ru//x86exceptions-fpuconditions#Z" title="Исключения FPU - Деление на нуль (#Z)">деление на нуль (#Z)</a>;</li> <li><strong>DE</strong> – <a href="http://www.club155.ru//x86exceptions-fpuconditions#D" title="Исключения FPU - Денормализованный операнд (#D)">денормализованный операнд (#D)</a>;</li> <li><strong>IE</strong> – <a href="http://www.club155.ru//x86exceptions-fpuconditions#I" title="Исключения FPU - Недействительная операция (#I)">недействительная операция (#I)</a>.</li> </ul> </p> <p style="text-align: justify;">Помимо установки соответствующего <em>флага исключительной ситуации</em>, сопроцессор при возникновении исключения может выдавать или не выдавать сигнал прерывания. Это зависит от состояния соответствующих <a href="http://www.club155.ru//x86internalreg-fpucw#PM" title"Внутренние регистры: Регистр управления FPU - Маски исключений, биты 5, 4, 3, 2, 1, 0">битов маски исключений</a> регистра управления FPU. В случае, когда бит маски исключения установлен, внешний сигнал не выдается, но флаг исключения все равно устанавливается. Таким образом, используя эффект накопления ошибок, программное обеспечение может замаскировать все исключения до выполнения групповых вычислений, затем произвести вычисления и проверить содержимое всех флагов для выяснения того, какие исключения имели место.</p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> Адресация и многозадачность: Дескрипторы 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86addr-descriptors Administrator admin@club155.ru <p>&nbsp;</p> <p style="text-align: justify;">Ниже на рис. 2.10. ... 2.16. представлены форматы всех возможных типов <em>дескрипторов</em> для Intel386 и т.д. (32-битные дескрипторы). 16-битные дескрипторы процессора Intel286 для совместимости поддерживаются и всеми последующими процессорами, они во всем аналогичны 32-битным дескрипторам, за исключением того, что старшее слово старшего двойного слова в них описано как зарезервированное, и при запуске программ Intel286 на 32‑разрядных процессорах должно быть нулевым.</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-10_Descriptor-Data32.pdf|500|354}</p> --> <p align="center"><a name="data"></a><img src="http://www.club155.ru/images/x86_images/2-10_Descriptor-Data32.svgz" alt="Формат дескриптора сегмента данных" width="500" height="158" /></p> <p align="center"><strong><em>Рис. 2.10. Формат дескриптора сегмента данных</em></strong></p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-11_Descriptor-Code32.pdf|500|354}</p> --> <p align="center"><a name="code"></a><img src="http://www.club155.ru/images/x86_images/2-11_Descriptor-Code32.svgz" alt="Формат дескриптора сегмента кода" width="500" height="158" /></p> <p align="center"><strong><em>Рис. 2.11. Формат дескриптора сегмента кода</em></strong></p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-12_Descriptor-CallGate32.pdf|500|354}</p> --> <p align="center"><a name="callgate"></a><img src="http://www.club155.ru/images/x86_images/2-12_Descriptor-CallGate32.svgz" alt="Формат дескриптора 32-битного шлюза вызова" width="500" height="128" /></p> <p align="center"><strong><em>Рис. 2.12. Формат дескриптора 32-битного шлюза вызова</em></strong></p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-13_Descriptor-TSS32.pdf|500|354}</p> --> <p align="center"><a name="tss"></a><img src="http://www.club155.ru/images/x86_images/2-13_Descriptor-TSS32.svgz" alt="Формат дескриптора 32-битного TSS" width="500" height="128" /></p> <p align="center"><strong><em>Рис. 2.13. Формат дескриптора 32-битного TSS</em></strong></p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-14_Descriptor-TaskGate32.pdf|500|354}</p> --> <p align="center"><a name="taskgate"></a><img src="http://www.club155.ru/images/x86_images/2-14_Descriptor-TaskGate32.svgz" alt="Формат дескриптора шлюза задачи" width="500" height="158" /></p> <p align="center"><strong><em>Рис. 2.14. Формат дескриптора шлюза задачи</em></strong></p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-15_Descriptor-IntGate32.pdf|500|354}</p> --> <p align="center"><a name="intgate"></a><img src="http://www.club155.ru/images/x86_images/2-15_Descriptor-IntGate32.svgz" alt="Формат дескриптора 32-битного шлюза прерывания" width="500" height="158" /></p> <p align="center"><strong><em>Рис. 2.15. Формат дескриптора 32-битного шлюза прерывания</em></strong></p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-16_Descriptor-TrapGate32.pdf|500|354}</p> --> <p align="center"><a name="trapgate"></a><img src="http://www.club155.ru/images/x86_images/2-16_Descriptor-TrapGate32.svgz" alt="Формат дескриптора 32-битного шлюза ловушки" width="500" height="158" /></p> <p align="center"><strong><em>Рис. 2.16. Формат дескриптора 32-битного шлюза ловушки</em></strong></p> <p>&nbsp;</p> <p> <a name="A"></a><strong>A</strong> (Доступ: Intel286 &hellip;)</p> <p style="text-align: justify;">Бит доступа устанавливается процессором после загрузки в&nbsp;<a href="http://www.club155.ru/index.php?Itemid=241" title="Сегментные регистры">сегментный регистр</a> селектора соответствующего сегмента кода или данных. Предварительно очистив бит A, программное обеспечение может позже проверить, осуществлялся ли доступ к сегменту.</p> <p style="text-align: justify;">Процессоры Intel486 &hellip; осуществляют цикл записи в память нового значения бита A = 1, только если он не был установлен; Intel286 и Intel386 делают это независимо от его текущего значения.</p> <p>&nbsp;</p> <p> <a name="AVL"></a><strong>AVL</strong> (Свободный: Intel386 &hellip;)</p> <p style="text-align: justify;">Бит оставлен свободным и может использоваться системным ПО для своих нужд.</p> <p>&nbsp;</p> <p> <a name="B"></a><strong>B</strong> (Размерность: Intel386 &hellip;)</p> <p style="text-align: justify;">Бит размерности присутствует в дескрипторах сегментов данных. Он управляет следующими аспектами операций.</p> <ul> <li>Размерностью регистра указателя для стековых сегментов. Если B = 1, используется 32-битный указатель ESP. Если B = 0 &mdash; 16-битный указатель SP.</li> <li>Верхней границей расширяемого вниз сегмента. В расширяемых вниз сегментах нижняя граница задается полем LIMIT, а верхняя равна FFFFFFFFh, если B = 1, и FFFFh, если B = 0.</li> </ul> <p style="text-align: justify;">Бит размерности всегда должен устанавливаться в 0 для 16-битных сегментов и в 1 для 32-битных сегментов.</p> <p>&nbsp;</p> <p> <a name="BASE"></a><strong>BASE</strong> (База: Intel286 &ndash; 24 бита, Intel386 &hellip; &ndash; 32 бита)</p> <p style="text-align: justify;">Задает положение сегмента в 4 Гбайтном (16М для Intel286) адресном пространстве. Для максимального быстродействия рекомендуется, чтобы значение базы было выровнено по 16 байтным границам. Для дескрипторов Intel286 определены только младшие 24 бита этого поля.</p> <p>&nbsp;</p> <p> <a name="C"></a><strong>C</strong> (Согласование: Intel286 &hellip;)</p> <p style="text-align: justify;">Кодовый сегмент может быть <em>согласованным</em> или <em>несогласованным</em>. Передача управления из сегмента с меньшим уровнем привилегий (мало привилегий) в сегмент с большим уровнем привилегий (много привилегий) требует, чтобы сегмент, в который передается управление, был согласованным, иначе генерируется&nbsp;<a href="http://www.club155.ru/x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">особая ситуация общей защиты #GP</a> (кроме случая использования ловушки задачи).</p> <p>&nbsp;</p> <p> <a name="COUNT"></a><strong>COUNT</strong> (Счетчик: Intel286 &hellip;)</p> <p style="text-align: justify;">Для 32-битного шлюза задает количество двойных слов, копируемых из стека вызывающей процедуры в стек вызываемой. В случае 16-битного шлюза, задает количество слов, копируемых из стека вызывающей процедуры в стек вызываемой.</p> <p>&nbsp;</p> <p> <a name="D"></a><strong>D</strong> (Разрядность по умолчанию: Intel386 &hellip;)</p> <p style="text-align: justify;">Задает разрядность операндов и адресов, принимаемую по умолчанию (разрядность по умолчанию может быть изменена&nbsp;<a href="http://www.club155.ru/index.php?Itemid=510" title="Атрибуты и префиксы">префиксом размера операнда</a> и <a href="http://www.club155.ru/index.php?Itemid=510" title="Атрибуты и префиксы">префиксом размера адреса</a>). Если D = 1, то устанавливается режим 32-битных операндов и 32-битного адреса. Если D = 0, то адреса и операнды 16-битные.</p> <p>&nbsp;</p> <p> <a name="DPL"></a><strong>DPL</strong> (Уровень привилегий дескриптора: Intel286 &hellip;)</p> <p style="text-align: justify;">Задает уровень привилегий сегмента или шлюза, который (уровень) используется механизмом защиты для контроля доступа к сегменту или шлюзу. Наивысшие привилегии имеет уровень 0, наименьшие &mdash; уровень 3. В зависимости от способа доступа и типа сегмента, DPL выполняет следующие функции:</p> <ul> <li style="text-align: justify;">Для сегмента данных. DPL содержит самое высокое числовое значение уровня привилегий, который может иметь программа, чтобы ей был разрешен доступ к такому сегменту. Например, только программы с CPL = 0 или CPL = 1 могут обращаться к сегменту данных с DPL = 1. В случае стекового сегмента, при загрузке в регистр SS нового селектора необходимо, чтобы все привилегии (текущий CPL, RPL загружаемого селектора и DPL дескриптора) совпадали, в противном случае генерируется <a href="http://www.club155.ru/x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">ошибка общей защиты (#GP)</a>.</li> <li style="text-align: justify;">Для несогласованного кодового сегмента. DPL содержит уровень привилегий, который должна иметь программ для доступа к сегменту. Например, если DPL = 2, то только программы с CPL = 2 могут обращаться к сегменту. При обращении к такому сегменту через шлюз вызова командой <a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>, DPL содержит самое низкое числовое значение уровня привилегий, который может иметь программа, чтобы ей был разрешен доступ. Например, только программы с CPL = 2 или CPL = 3 могут обращаться к сегменту с DPL = 2.</li> <li style="text-align: justify;">Для согласованного кодового сегмента и для сегмента <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a>. DPL содержит самое низкое числовое значение уровня привилегий, который может иметь программа, чтобы ей был разрешен доступ к такому сегменту (задаче). Например, только программы с CPL = 2 или CPL = 3 могут обращаться к сегменту с DPL = 2. При обращении к новой задаче через шлюз задачи поле DPL дескриптора <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> новой задачи не проверяется.</li> <li style="text-align: justify;">Для шлюзов. DPL содержит самое высокое числовое значение уровня привилегий, который может иметь программа, чтобы ей был разрешен доступ к шлюзу. Например, только программы с CPL = 0 или CPL = 1 могут обращаться к шлюзу с DPL = 1. Для шлюза ловушки и шлюза прерывания процессор проверяет значение DPL, только если прерывание вызвано командами <a href="http://www.club155.ru/x86cmd/INTn" title="INT n - Вызов процедуры прерывания">INT n</a>, <a href="http://www.club155.ru/x86cmd/INT3" title="INT 3 - Вызов процедуры прерывания отладки 3">INT 3</a>, <a href="http://www.club155.ru/x86cmd/INTO" title="INTO - Вызов процедуры прерывания 4 при переполнении">INTO</a>.</li> </ul> <p>&nbsp;</p> <p> <a name="E"></a><strong>E</strong> (Расширяемость: Intel286 &hellip;)</p> <p style="text-align: justify;">Задает направление расширения сегмента.</p> <ul> <li>E = 1 &mdash; сегмент расширяется вниз (стек);</li> <li>E = 0 &mdash; сегмент расширяется вверх.</li> </ul> <p>&nbsp;</p> <p> <a name="G"></a><strong>G</strong> (Гранулярность: Intel386 &hellip;)</p> <p style="text-align: justify;">Бит гранулярности задает масштаб поля LIMIT. Когда G = 0, предел задается в байтах, если G = 1 &mdash; в 4-Кбайтных блоках.</p> <p>&nbsp;</p> <p> <a name="LIMIT"></a><strong>LIMIT</strong> (Предел: Intel286 &ndash; 16 бит, Intel386 &hellip; &ndash; 20 бит)</p> <p style="text-align: justify;">Задает размер сегмента. Процессор может интерпретировать это поле двумя способами в зависимости от значения поля G (гранулярность).</p> <ul> <li>Если G = 0, то предел задает размер сегмента в байтах (от 1 байта до 1 Мбайта).</li> <li>Если G = 1, то предел задает размер сегмента в 4-Кбайтных параграфах (от 4 Кбайт до 4 Гбайт).</li> </ul> <p style="text-align: justify;">Для сегментов, расширяющихся вверх, логический адрес может принимать любое значение от 0 до LIMIT. Для сегментов, расширяющихся вниз (стековые сегменты), смысл поля LIMIT переворачивается, т.е. логический адрес может принимать любые значения кроме значений от 0 до LIMIT.</p> <p style="text-align: justify;">Для дескрипторов Intel286 определены только младшие 16 бит этого поля, а размер сегмента всегда задается только в байтах.</p> <p>&nbsp;</p> <p> <a name="OFFSET"></a><strong>OFFSET</strong> (Смещение: Intel286 &hellip;)</p> <p style="text-align: justify;">Смещение точки входа в целевом сегменте.</p> <p>&nbsp;</p> <p> <a name="P"></a><strong>P</strong> (Присутствие: Intel286 &hellip;)</p> <p style="text-align: justify;">Бит присутствия сегмента в физической памяти. Если этот бит не установлен, процессор генерирует <a href="http://www.club155.ru/x86exceptions-conditions#NP" title="Прерывание 11 &mdash; Сегмент не присутствует (#NP): Intel286 &hellip;">особую ситуацию #NP (Сегмент не присутствует)</a>, когда&nbsp;<a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектор</a> дескриптора загружается в <a href="http://www.club155.ru/index.php?Itemid=241" title="Сегментные регистры">сегментный регистр</a>.</p> <p>&nbsp;</p> <p> <a name="R"></a><strong>R</strong> (Разрешение чтения: Intel286 &hellip;)</p> <p style="text-align: justify;">Бит R разрешает/запрещает чтение из кодового сегмента. Когда чтение запрещено программы могут передавать управление в сегмент (т.е. он остается исполняемым), но чтение кода как данных из сегмента невозможно.</p> <ul> <li>R = 1 &mdash; чтение возможно;</li> <li>R = 0 &mdash; чтение запрещено.</li> </ul> <p>&nbsp;</p> <p> <a name="S"></a><strong>S</strong> (Системный, бит 12 старшего двойного слова дескриптора: Intel286 &hellip;)</p> <p style="text-align: justify;">Задает вид дескриптора. Если S = 0, то дескриптор считается системным. Если S=1, то это дескриптор сегмента кода или данных. Системные дескрипторы выполняют важнейшие функции по управлению прерываниями, вызовами подпрограмм, переключениями задач. Тип системного дескриптора задается полем TYPE.</p> <p>&nbsp;</p> <p> <a name="SELECTOR"></a><strong>SELECTOR</strong> (Селектор: Intel286 &hellip;)</p> <p style="text-align: justify;">Селектор целевого сегмента или (для шлюза задачи) селектор TSS целевой задачи.</p> <p>&nbsp;</p> <p> <a name="TYPE"></a><strong>TYPE</strong> (Тип, биты 11..8 старшего двойного слова дескриптора: Intel286 &hellip;)</p> <p style="text-align: justify;">Поле тип содержит биты, которые задают назначение (тип) системного дескриптора.</p> <p>TYPE Описание<br />---------------------------------- Intel286 &hellip;<br />0000 Зарезервировано<br />0001 Свободный 16-битный TSS<br />0010 Локальная таблица дескрипторов (LDT)<br />0011 Занятый 16-битный TSS<br />0100 16-битный шлюз вызова<br />0101 Шлюз задачи<br />0110 16-битный шлюз прерывания<br />0111 16-битный шлюз ловушки<br />-------------------------------------------- Intel386 &hellip;<br />1000 Зарезервировано<br />1001 Свободный 32-битный TSS<br />1010 Зарезервировано<br />1011 Занятый 32-битный TSS<br />1100 32-битный шлюз вызова<br />1101 Зарезервировано<br />1110 32-битный шлюз прерывания<br />1111 32-битный шлюз ловушки</p> <p>&nbsp;</p> <p> <a name="W"></a><strong>W</strong> (Разрешение записи: Intel286 &hellip;)</p> <p style="text-align: justify;">Бит разрешения/запрещения записи в сегмент данных.</p> <ul> <li>W = 1 &mdash; запись возможна;</li> <li>W = 0 &mdash; запись запрещена.</li> </ul> <p>&nbsp;</p> <p style="text-align: center;">{loadposition article_footer}</p> <p>&nbsp;</p> <p>&nbsp;</p> <p style="text-align: justify;">Ниже на рис. 2.10. ... 2.16. представлены форматы всех возможных типов <em>дескрипторов</em> для Intel386 и т.д. (32-битные дескрипторы). 16-битные дескрипторы процессора Intel286 для совместимости поддерживаются и всеми последующими процессорами, они во всем аналогичны 32-битным дескрипторам, за исключением того, что старшее слово старшего двойного слова в них описано как зарезервированное, и при запуске программ Intel286 на 32‑разрядных процессорах должно быть нулевым.</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-10_Descriptor-Data32.pdf|500|354}</p> --> <p align="center"><a name="data"></a><img src="http://www.club155.ru/images/x86_images/2-10_Descriptor-Data32.svgz" alt="Формат дескриптора сегмента данных" width="500" height="158" /></p> <p align="center"><strong><em>Рис. 2.10. Формат дескриптора сегмента данных</em></strong></p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-11_Descriptor-Code32.pdf|500|354}</p> --> <p align="center"><a name="code"></a><img src="http://www.club155.ru/images/x86_images/2-11_Descriptor-Code32.svgz" alt="Формат дескриптора сегмента кода" width="500" height="158" /></p> <p align="center"><strong><em>Рис. 2.11. Формат дескриптора сегмента кода</em></strong></p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-12_Descriptor-CallGate32.pdf|500|354}</p> --> <p align="center"><a name="callgate"></a><img src="http://www.club155.ru/images/x86_images/2-12_Descriptor-CallGate32.svgz" alt="Формат дескриптора 32-битного шлюза вызова" width="500" height="128" /></p> <p align="center"><strong><em>Рис. 2.12. Формат дескриптора 32-битного шлюза вызова</em></strong></p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-13_Descriptor-TSS32.pdf|500|354}</p> --> <p align="center"><a name="tss"></a><img src="http://www.club155.ru/images/x86_images/2-13_Descriptor-TSS32.svgz" alt="Формат дескриптора 32-битного TSS" width="500" height="128" /></p> <p align="center"><strong><em>Рис. 2.13. Формат дескриптора 32-битного TSS</em></strong></p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-14_Descriptor-TaskGate32.pdf|500|354}</p> --> <p align="center"><a name="taskgate"></a><img src="http://www.club155.ru/images/x86_images/2-14_Descriptor-TaskGate32.svgz" alt="Формат дескриптора шлюза задачи" width="500" height="158" /></p> <p align="center"><strong><em>Рис. 2.14. Формат дескриптора шлюза задачи</em></strong></p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-15_Descriptor-IntGate32.pdf|500|354}</p> --> <p align="center"><a name="intgate"></a><img src="http://www.club155.ru/images/x86_images/2-15_Descriptor-IntGate32.svgz" alt="Формат дескриптора 32-битного шлюза прерывания" width="500" height="158" /></p> <p align="center"><strong><em>Рис. 2.15. Формат дескриптора 32-битного шлюза прерывания</em></strong></p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/2-16_Descriptor-TrapGate32.pdf|500|354}</p> --> <p align="center"><a name="trapgate"></a><img src="http://www.club155.ru/images/x86_images/2-16_Descriptor-TrapGate32.svgz" alt="Формат дескриптора 32-битного шлюза ловушки" width="500" height="158" /></p> <p align="center"><strong><em>Рис. 2.16. Формат дескриптора 32-битного шлюза ловушки</em></strong></p> <p>&nbsp;</p> <p> <a name="A"></a><strong>A</strong> (Доступ: Intel286 &hellip;)</p> <p style="text-align: justify;">Бит доступа устанавливается процессором после загрузки в&nbsp;<a href="http://www.club155.ru/index.php?Itemid=241" title="Сегментные регистры">сегментный регистр</a> селектора соответствующего сегмента кода или данных. Предварительно очистив бит A, программное обеспечение может позже проверить, осуществлялся ли доступ к сегменту.</p> <p style="text-align: justify;">Процессоры Intel486 &hellip; осуществляют цикл записи в память нового значения бита A = 1, только если он не был установлен; Intel286 и Intel386 делают это независимо от его текущего значения.</p> <p>&nbsp;</p> <p> <a name="AVL"></a><strong>AVL</strong> (Свободный: Intel386 &hellip;)</p> <p style="text-align: justify;">Бит оставлен свободным и может использоваться системным ПО для своих нужд.</p> <p>&nbsp;</p> <p> <a name="B"></a><strong>B</strong> (Размерность: Intel386 &hellip;)</p> <p style="text-align: justify;">Бит размерности присутствует в дескрипторах сегментов данных. Он управляет следующими аспектами операций.</p> <ul> <li>Размерностью регистра указателя для стековых сегментов. Если B = 1, используется 32-битный указатель ESP. Если B = 0 &mdash; 16-битный указатель SP.</li> <li>Верхней границей расширяемого вниз сегмента. В расширяемых вниз сегментах нижняя граница задается полем LIMIT, а верхняя равна FFFFFFFFh, если B = 1, и FFFFh, если B = 0.</li> </ul> <p style="text-align: justify;">Бит размерности всегда должен устанавливаться в 0 для 16-битных сегментов и в 1 для 32-битных сегментов.</p> <p>&nbsp;</p> <p> <a name="BASE"></a><strong>BASE</strong> (База: Intel286 &ndash; 24 бита, Intel386 &hellip; &ndash; 32 бита)</p> <p style="text-align: justify;">Задает положение сегмента в 4 Гбайтном (16М для Intel286) адресном пространстве. Для максимального быстродействия рекомендуется, чтобы значение базы было выровнено по 16 байтным границам. Для дескрипторов Intel286 определены только младшие 24 бита этого поля.</p> <p>&nbsp;</p> <p> <a name="C"></a><strong>C</strong> (Согласование: Intel286 &hellip;)</p> <p style="text-align: justify;">Кодовый сегмент может быть <em>согласованным</em> или <em>несогласованным</em>. Передача управления из сегмента с меньшим уровнем привилегий (мало привилегий) в сегмент с большим уровнем привилегий (много привилегий) требует, чтобы сегмент, в который передается управление, был согласованным, иначе генерируется&nbsp;<a href="http://www.club155.ru/x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">особая ситуация общей защиты #GP</a> (кроме случая использования ловушки задачи).</p> <p>&nbsp;</p> <p> <a name="COUNT"></a><strong>COUNT</strong> (Счетчик: Intel286 &hellip;)</p> <p style="text-align: justify;">Для 32-битного шлюза задает количество двойных слов, копируемых из стека вызывающей процедуры в стек вызываемой. В случае 16-битного шлюза, задает количество слов, копируемых из стека вызывающей процедуры в стек вызываемой.</p> <p>&nbsp;</p> <p> <a name="D"></a><strong>D</strong> (Разрядность по умолчанию: Intel386 &hellip;)</p> <p style="text-align: justify;">Задает разрядность операндов и адресов, принимаемую по умолчанию (разрядность по умолчанию может быть изменена&nbsp;<a href="http://www.club155.ru/index.php?Itemid=510" title="Атрибуты и префиксы">префиксом размера операнда</a> и <a href="http://www.club155.ru/index.php?Itemid=510" title="Атрибуты и префиксы">префиксом размера адреса</a>). Если D = 1, то устанавливается режим 32-битных операндов и 32-битного адреса. Если D = 0, то адреса и операнды 16-битные.</p> <p>&nbsp;</p> <p> <a name="DPL"></a><strong>DPL</strong> (Уровень привилегий дескриптора: Intel286 &hellip;)</p> <p style="text-align: justify;">Задает уровень привилегий сегмента или шлюза, который (уровень) используется механизмом защиты для контроля доступа к сегменту или шлюзу. Наивысшие привилегии имеет уровень 0, наименьшие &mdash; уровень 3. В зависимости от способа доступа и типа сегмента, DPL выполняет следующие функции:</p> <ul> <li style="text-align: justify;">Для сегмента данных. DPL содержит самое высокое числовое значение уровня привилегий, который может иметь программа, чтобы ей был разрешен доступ к такому сегменту. Например, только программы с CPL = 0 или CPL = 1 могут обращаться к сегменту данных с DPL = 1. В случае стекового сегмента, при загрузке в регистр SS нового селектора необходимо, чтобы все привилегии (текущий CPL, RPL загружаемого селектора и DPL дескриптора) совпадали, в противном случае генерируется <a href="http://www.club155.ru/x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">ошибка общей защиты (#GP)</a>.</li> <li style="text-align: justify;">Для несогласованного кодового сегмента. DPL содержит уровень привилегий, который должна иметь программ для доступа к сегменту. Например, если DPL = 2, то только программы с CPL = 2 могут обращаться к сегменту. При обращении к такому сегменту через шлюз вызова командой <a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>, DPL содержит самое низкое числовое значение уровня привилегий, который может иметь программа, чтобы ей был разрешен доступ. Например, только программы с CPL = 2 или CPL = 3 могут обращаться к сегменту с DPL = 2.</li> <li style="text-align: justify;">Для согласованного кодового сегмента и для сегмента <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a>. DPL содержит самое низкое числовое значение уровня привилегий, который может иметь программа, чтобы ей был разрешен доступ к такому сегменту (задаче). Например, только программы с CPL = 2 или CPL = 3 могут обращаться к сегменту с DPL = 2. При обращении к новой задаче через шлюз задачи поле DPL дескриптора <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> новой задачи не проверяется.</li> <li style="text-align: justify;">Для шлюзов. DPL содержит самое высокое числовое значение уровня привилегий, который может иметь программа, чтобы ей был разрешен доступ к шлюзу. Например, только программы с CPL = 0 или CPL = 1 могут обращаться к шлюзу с DPL = 1. Для шлюза ловушки и шлюза прерывания процессор проверяет значение DPL, только если прерывание вызвано командами <a href="http://www.club155.ru/x86cmd/INTn" title="INT n - Вызов процедуры прерывания">INT n</a>, <a href="http://www.club155.ru/x86cmd/INT3" title="INT 3 - Вызов процедуры прерывания отладки 3">INT 3</a>, <a href="http://www.club155.ru/x86cmd/INTO" title="INTO - Вызов процедуры прерывания 4 при переполнении">INTO</a>.</li> </ul> <p>&nbsp;</p> <p> <a name="E"></a><strong>E</strong> (Расширяемость: Intel286 &hellip;)</p> <p style="text-align: justify;">Задает направление расширения сегмента.</p> <ul> <li>E = 1 &mdash; сегмент расширяется вниз (стек);</li> <li>E = 0 &mdash; сегмент расширяется вверх.</li> </ul> <p>&nbsp;</p> <p> <a name="G"></a><strong>G</strong> (Гранулярность: Intel386 &hellip;)</p> <p style="text-align: justify;">Бит гранулярности задает масштаб поля LIMIT. Когда G = 0, предел задается в байтах, если G = 1 &mdash; в 4-Кбайтных блоках.</p> <p>&nbsp;</p> <p> <a name="LIMIT"></a><strong>LIMIT</strong> (Предел: Intel286 &ndash; 16 бит, Intel386 &hellip; &ndash; 20 бит)</p> <p style="text-align: justify;">Задает размер сегмента. Процессор может интерпретировать это поле двумя способами в зависимости от значения поля G (гранулярность).</p> <ul> <li>Если G = 0, то предел задает размер сегмента в байтах (от 1 байта до 1 Мбайта).</li> <li>Если G = 1, то предел задает размер сегмента в 4-Кбайтных параграфах (от 4 Кбайт до 4 Гбайт).</li> </ul> <p style="text-align: justify;">Для сегментов, расширяющихся вверх, логический адрес может принимать любое значение от 0 до LIMIT. Для сегментов, расширяющихся вниз (стековые сегменты), смысл поля LIMIT переворачивается, т.е. логический адрес может принимать любые значения кроме значений от 0 до LIMIT.</p> <p style="text-align: justify;">Для дескрипторов Intel286 определены только младшие 16 бит этого поля, а размер сегмента всегда задается только в байтах.</p> <p>&nbsp;</p> <p> <a name="OFFSET"></a><strong>OFFSET</strong> (Смещение: Intel286 &hellip;)</p> <p style="text-align: justify;">Смещение точки входа в целевом сегменте.</p> <p>&nbsp;</p> <p> <a name="P"></a><strong>P</strong> (Присутствие: Intel286 &hellip;)</p> <p style="text-align: justify;">Бит присутствия сегмента в физической памяти. Если этот бит не установлен, процессор генерирует <a href="http://www.club155.ru/x86exceptions-conditions#NP" title="Прерывание 11 &mdash; Сегмент не присутствует (#NP): Intel286 &hellip;">особую ситуацию #NP (Сегмент не присутствует)</a>, когда&nbsp;<a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектор</a> дескриптора загружается в <a href="http://www.club155.ru/index.php?Itemid=241" title="Сегментные регистры">сегментный регистр</a>.</p> <p>&nbsp;</p> <p> <a name="R"></a><strong>R</strong> (Разрешение чтения: Intel286 &hellip;)</p> <p style="text-align: justify;">Бит R разрешает/запрещает чтение из кодового сегмента. Когда чтение запрещено программы могут передавать управление в сегмент (т.е. он остается исполняемым), но чтение кода как данных из сегмента невозможно.</p> <ul> <li>R = 1 &mdash; чтение возможно;</li> <li>R = 0 &mdash; чтение запрещено.</li> </ul> <p>&nbsp;</p> <p> <a name="S"></a><strong>S</strong> (Системный, бит 12 старшего двойного слова дескриптора: Intel286 &hellip;)</p> <p style="text-align: justify;">Задает вид дескриптора. Если S = 0, то дескриптор считается системным. Если S=1, то это дескриптор сегмента кода или данных. Системные дескрипторы выполняют важнейшие функции по управлению прерываниями, вызовами подпрограмм, переключениями задач. Тип системного дескриптора задается полем TYPE.</p> <p>&nbsp;</p> <p> <a name="SELECTOR"></a><strong>SELECTOR</strong> (Селектор: Intel286 &hellip;)</p> <p style="text-align: justify;">Селектор целевого сегмента или (для шлюза задачи) селектор TSS целевой задачи.</p> <p>&nbsp;</p> <p> <a name="TYPE"></a><strong>TYPE</strong> (Тип, биты 11..8 старшего двойного слова дескриптора: Intel286 &hellip;)</p> <p style="text-align: justify;">Поле тип содержит биты, которые задают назначение (тип) системного дескриптора.</p> <p>TYPE Описание<br />---------------------------------- Intel286 &hellip;<br />0000 Зарезервировано<br />0001 Свободный 16-битный TSS<br />0010 Локальная таблица дескрипторов (LDT)<br />0011 Занятый 16-битный TSS<br />0100 16-битный шлюз вызова<br />0101 Шлюз задачи<br />0110 16-битный шлюз прерывания<br />0111 16-битный шлюз ловушки<br />-------------------------------------------- Intel386 &hellip;<br />1000 Зарезервировано<br />1001 Свободный 32-битный TSS<br />1010 Зарезервировано<br />1011 Занятый 32-битный TSS<br />1100 32-битный шлюз вызова<br />1101 Зарезервировано<br />1110 32-битный шлюз прерывания<br />1111 32-битный шлюз ловушки</p> <p>&nbsp;</p> <p> <a name="W"></a><strong>W</strong> (Разрешение записи: Intel286 &hellip;)</p> <p style="text-align: justify;">Бит разрешения/запрещения записи в сегмент данных.</p> <ul> <li>W = 1 &mdash; запись возможна;</li> <li>W = 0 &mdash; запись запрещена.</li> </ul> <p>&nbsp;</p> <p style="text-align: center;">{loadposition article_footer}</p> <p>&nbsp;</p> Внутренние регистры: Регистр управления FPU 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86internalreg-fpucw Administrator admin@club155.ru <p>&nbsp;</p> <p style="text-align: justify;"><strong><em>Регистр управления CW</em></strong> (рис. 1.14.) предназначен для управления режимами работы сопроцессора. Он содержит ряд полей, значения которых влияют на точность результата, поведение процессора при встрече некорректных операндов и результатов и т.п.</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-14_FPU-CW.pdf|500|354}</p> --> <p align="center"><img src="http://www.club155.ru/images/x86_images/1-14_FPU-CW.svgz" alt="Формат регистра управления FPU" width="540" height="445" /></p> <p align="center"><strong><em>Рис. 1.14. Формат регистра управления FPU</em></strong></p> <p>&nbsp;</p> <p> <a name="IC"></a><strong>IC</strong> (Управление бесконечностью, бит 12: Intel287, 8087)</p> <p style="text-align: justify;">В сопроцессорах Intel287 и 8087 данный бит определяет, что +&infin; и -&infin; считаются одной беззнаковой бесконечностью (IC = 0) &mdash; <strong><em>проективная арифметика</em></strong>; или что +&infin; и -&infin; считаются двумя знаковыми бесконечностями (IC = 1) &mdash; <strong><em>аффинная арифметика</em></strong>.</p> <p style="text-align: justify;">В более поздних сопроцессорах, поддерживающих <a href="http://ru.wikipedia.org/wiki/IEEE_754-2008" title="IEEE 754">стандарт IEEE-754</a> (Intel387, Intel486, Pentium, &hellip;), данный бит, хотя и может программироваться, но не влияет на работу FPU &mdash; независимо от значения IC всегда применяется <em>аффинная арифметика</em> (-&infin;&nbsp;&lt;&nbsp;+&infin;).</p> <p>&nbsp;</p> <p> <a name="RC"></a><strong>RC</strong> (Управление округлением, биты 11, 10)</p> <p style="text-align: justify;">Поле RC определяет выбор одного из четырех <strong><em>методов округления</em></strong> результатов операций&nbsp;FPU:</p> <ul style="list-style-type: none;"> <li><strong>00</strong> &ndash; округление к ближайшему (четному);</li> <li><strong>01</strong> &ndash; округление вниз (к -&infin;);</li> <li><strong>10</strong> &ndash; округление вверх (к +&infin;);</li> <li><strong>11</strong> &ndash; округление к нулю.</li> </ul> <p>&nbsp;</p> <p> <a name="PC"></a><strong>PC</strong> (Управление точностью, биты 9, 8)</p> <p style="text-align: justify;">Указывает <strong><em>точность представления</em></strong> результатов арифметических операций <a href="http://www.club155.ru/x86cmdfpu/FADD" title="FADD - Сложение">FADD</a>, <a href="http://www.club155.ru/x86cmdfpu/FADDP" title="FADDP - Сложение с извлечением из стека">FADDP</a>, <a href="http://www.club155.ru/x86cmdfpu/FSUB" title="FSUB - Вычитание">FSUB</a>, <a href="http://www.club155.ru/x86cmdfpu/FSUBP" title="FSUBP - Вычитание с извлечением из стека">FSUBP</a>, <a href="http://www.club155.ru/x86cmdfpu/FSUBR" title="FSUBR - Инверсное вычитание">FSUBR</a>, <a href="http://www.club155.ru/x86cmdfpu/FSUBRP" title="FSUBRP - Инверсное вычитание с извлечением из стека">FSUBRP</a>, <a href="http://www.club155.ru/x86cmdfpu/FMUL" title="FMUL - Умножение">FMUL</a>, <a href="http://www.club155.ru/x86cmdfpu/FMULP" title="FMULP - Умножение с извлечением из стека">FMULP</a>, <a href="http://www.club155.ru/x86cmdfpu/FDIV" title="FDIV - Деление">FDIV</a>, <a href="http://www.club155.ru/x86cmdfpu/FDIVP" title="FDIVP - Деление с извлечением из стека">FDIVP</a>, <a href="http://www.club155.ru/x86cmdfpu/FDIVR" title="FDIVR - Инверсное деление">FDIVR</a>,&nbsp;<a href="http://www.club155.ru/x86cmdfpu/FDIVRP" title="FDIVRP - Инверсное деление с извлечением из стека">FDIVRP</a> и <a href="http://www.club155.ru/x86cmdfpu/FSQRT" title="FSQRT - Вычислить квадратный корень">FSQRT</a>. Доступны следующие режимы представления:</p> <ul style="list-style-type: none;"> <li><strong>00</strong> &ndash; 24 бита мантисса, 7 бит порядок;</li> <li><strong>01</strong> &ndash; зарезервировано;</li> <li><strong>10</strong> &ndash; 53 бита мантисса, 10 бит порядок (<strong><em>двойная точность</em></strong>);</li> <li><strong>11</strong> &ndash; 64 бита мантисса, 15 бит порядок (<strong><em>расширенная точность</em></strong>).</li> </ul> <p style="text-align: justify;">На другие команды эти биты влияния не оказывают. Уменьшение точности может быть полезно для совместимости с ранними моделями арифметических сопроцессоров.</p> <p>&nbsp;</p> <p> <a name="IEM"></a><strong>IEM</strong> (Запрет прерываний, бит 7: только для 8087)</p> <p style="text-align: justify;">В сопроцессоре 8087 этот бит маскирует <a href="http://www.club155.ru//x86internalreg-fpusw#IR" title="Внутренние регистры: Регистр состояния FPU - IR (Флаг запроса прерывания, бит 7: только для 8087)">флаг запроса прерывания IR</a>, то есть, независимо от значений шести масок исключений, сигнал IEM = 1 запрещает генерацию прерываний при возникновении ошибок сопроцессора.</p> <p style="text-align: justify;">Во всех современных микропроцессорах (Intel287, Intel387, Intel486, &hellip;) бит 7 регистра CW зарезервирован.</p> <p>&nbsp;</p> <p> <a name="PM"></a><strong>PM, UM, OM, ZM, DM, IM</strong> (Маски исключений, биты 5, 4, 3, 2, 1, 0)</p> <p style="text-align: justify;">Биты содержат индивидуальные маски для каждой из шести <a href="http://www.club155.ru/index.php?Itemid=499" title="Исключения FPU">исключительных ситуаций сопроцессора</a>. Установка бита маски запрещает прерывание при возникновении соответствующей ошибки FPU (см. <a href="http://www.club155.ru//x86exceptions-fputypes" title="Прерывания и особые ситуации: Типы и средства индикации исключений FPU">Исключения FPU</a>). Каждому исключению соответствует свой бит маски:</p> <ul style="list-style-type: none;"> <li><strong>PM</strong> &ndash; <a href="http://www.club155.ru//x86exceptions-fpuconditions#P" title="Исключения FPU - Неточный результат (#P)">неточный результат (#P)</a>;</li> <li><strong>UM</strong> &ndash; <a href="http://www.club155.ru//x86exceptions-fpuconditions#U" title="Исключения FPU - Антипереполнение (#U)">антипереполнение (#U)</a>;</li> <li><strong>OM</strong> &ndash; <a href="http://www.club155.ru//x86exceptions-fpuconditions#O" title="Исключения FPU - Переполнение (#O)">переполнение (#O)</a>;</li> <li><strong>ZM</strong> &ndash; <a href="http://www.club155.ru//x86exceptions-fpuconditions#Z" title="Исключения FPU - Деление на нуль (#Z)">деление на нуль (#Z)</a>;</li> <li><strong>DM</strong> &ndash; <a href="http://www.club155.ru//x86exceptions-fpuconditions#D" title="Исключения FPU - Денормализованный операнд (#D)">денормализованный операнд (#D)</a>;</li> <li><strong>IM</strong> &ndash; <a href="http://www.club155.ru//x86exceptions-fpuconditions#I" title="Исключения FPU - Недействительная операция (#I)">недействительная операция (#I)</a>.</li> </ul> <p style="text-align: justify;">При возникновении исключения, когда соответствующий бит маски сброшен, устанавливается соответствующий <a href="http://www.club155.ru//x86internalreg-fpusw#PE" title="Внутренние регистры: Регистр состояния FPU - Флаги исключительных ситуаций, биты 5, 4, 3, 2, 1, 0">флаг в регистре состояния FPU</a> и выдается сигнал прерывания, сообщающий процессору об ошибке сопроцессора. В случае, когда бит маски исключения установлен, внешний сигнал не выдается, но флаг все равно устанавливается. Таким образом, используя эффект накопления ошибок, программное обеспечение может замаскировать все исключения до выполнения групповых вычислений, затем произвести вычисления и проверить содержимое всех флагов для выяснения того, какие исключения имели место.</p> <p>&nbsp;</p> <p style="text-align: center;">{loadposition article_footer}</p> <p>&nbsp;</p> <p>&nbsp;</p> <p style="text-align: justify;"><strong><em>Регистр управления CW</em></strong> (рис. 1.14.) предназначен для управления режимами работы сопроцессора. Он содержит ряд полей, значения которых влияют на точность результата, поведение процессора при встрече некорректных операндов и результатов и т.п.</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-14_FPU-CW.pdf|500|354}</p> --> <p align="center"><img src="http://www.club155.ru/images/x86_images/1-14_FPU-CW.svgz" alt="Формат регистра управления FPU" width="540" height="445" /></p> <p align="center"><strong><em>Рис. 1.14. Формат регистра управления FPU</em></strong></p> <p>&nbsp;</p> <p> <a name="IC"></a><strong>IC</strong> (Управление бесконечностью, бит 12: Intel287, 8087)</p> <p style="text-align: justify;">В сопроцессорах Intel287 и 8087 данный бит определяет, что +&infin; и -&infin; считаются одной беззнаковой бесконечностью (IC = 0) &mdash; <strong><em>проективная арифметика</em></strong>; или что +&infin; и -&infin; считаются двумя знаковыми бесконечностями (IC = 1) &mdash; <strong><em>аффинная арифметика</em></strong>.</p> <p style="text-align: justify;">В более поздних сопроцессорах, поддерживающих <a href="http://ru.wikipedia.org/wiki/IEEE_754-2008" title="IEEE 754">стандарт IEEE-754</a> (Intel387, Intel486, Pentium, &hellip;), данный бит, хотя и может программироваться, но не влияет на работу FPU &mdash; независимо от значения IC всегда применяется <em>аффинная арифметика</em> (-&infin;&nbsp;&lt;&nbsp;+&infin;).</p> <p>&nbsp;</p> <p> <a name="RC"></a><strong>RC</strong> (Управление округлением, биты 11, 10)</p> <p style="text-align: justify;">Поле RC определяет выбор одного из четырех <strong><em>методов округления</em></strong> результатов операций&nbsp;FPU:</p> <ul style="list-style-type: none;"> <li><strong>00</strong> &ndash; округление к ближайшему (четному);</li> <li><strong>01</strong> &ndash; округление вниз (к -&infin;);</li> <li><strong>10</strong> &ndash; округление вверх (к +&infin;);</li> <li><strong>11</strong> &ndash; округление к нулю.</li> </ul> <p>&nbsp;</p> <p> <a name="PC"></a><strong>PC</strong> (Управление точностью, биты 9, 8)</p> <p style="text-align: justify;">Указывает <strong><em>точность представления</em></strong> результатов арифметических операций <a href="http://www.club155.ru/x86cmdfpu/FADD" title="FADD - Сложение">FADD</a>, <a href="http://www.club155.ru/x86cmdfpu/FADDP" title="FADDP - Сложение с извлечением из стека">FADDP</a>, <a href="http://www.club155.ru/x86cmdfpu/FSUB" title="FSUB - Вычитание">FSUB</a>, <a href="http://www.club155.ru/x86cmdfpu/FSUBP" title="FSUBP - Вычитание с извлечением из стека">FSUBP</a>, <a href="http://www.club155.ru/x86cmdfpu/FSUBR" title="FSUBR - Инверсное вычитание">FSUBR</a>, <a href="http://www.club155.ru/x86cmdfpu/FSUBRP" title="FSUBRP - Инверсное вычитание с извлечением из стека">FSUBRP</a>, <a href="http://www.club155.ru/x86cmdfpu/FMUL" title="FMUL - Умножение">FMUL</a>, <a href="http://www.club155.ru/x86cmdfpu/FMULP" title="FMULP - Умножение с извлечением из стека">FMULP</a>, <a href="http://www.club155.ru/x86cmdfpu/FDIV" title="FDIV - Деление">FDIV</a>, <a href="http://www.club155.ru/x86cmdfpu/FDIVP" title="FDIVP - Деление с извлечением из стека">FDIVP</a>, <a href="http://www.club155.ru/x86cmdfpu/FDIVR" title="FDIVR - Инверсное деление">FDIVR</a>,&nbsp;<a href="http://www.club155.ru/x86cmdfpu/FDIVRP" title="FDIVRP - Инверсное деление с извлечением из стека">FDIVRP</a> и <a href="http://www.club155.ru/x86cmdfpu/FSQRT" title="FSQRT - Вычислить квадратный корень">FSQRT</a>. Доступны следующие режимы представления:</p> <ul style="list-style-type: none;"> <li><strong>00</strong> &ndash; 24 бита мантисса, 7 бит порядок;</li> <li><strong>01</strong> &ndash; зарезервировано;</li> <li><strong>10</strong> &ndash; 53 бита мантисса, 10 бит порядок (<strong><em>двойная точность</em></strong>);</li> <li><strong>11</strong> &ndash; 64 бита мантисса, 15 бит порядок (<strong><em>расширенная точность</em></strong>).</li> </ul> <p style="text-align: justify;">На другие команды эти биты влияния не оказывают. Уменьшение точности может быть полезно для совместимости с ранними моделями арифметических сопроцессоров.</p> <p>&nbsp;</p> <p> <a name="IEM"></a><strong>IEM</strong> (Запрет прерываний, бит 7: только для 8087)</p> <p style="text-align: justify;">В сопроцессоре 8087 этот бит маскирует <a href="http://www.club155.ru//x86internalreg-fpusw#IR" title="Внутренние регистры: Регистр состояния FPU - IR (Флаг запроса прерывания, бит 7: только для 8087)">флаг запроса прерывания IR</a>, то есть, независимо от значений шести масок исключений, сигнал IEM = 1 запрещает генерацию прерываний при возникновении ошибок сопроцессора.</p> <p style="text-align: justify;">Во всех современных микропроцессорах (Intel287, Intel387, Intel486, &hellip;) бит 7 регистра CW зарезервирован.</p> <p>&nbsp;</p> <p> <a name="PM"></a><strong>PM, UM, OM, ZM, DM, IM</strong> (Маски исключений, биты 5, 4, 3, 2, 1, 0)</p> <p style="text-align: justify;">Биты содержат индивидуальные маски для каждой из шести <a href="http://www.club155.ru/index.php?Itemid=499" title="Исключения FPU">исключительных ситуаций сопроцессора</a>. Установка бита маски запрещает прерывание при возникновении соответствующей ошибки FPU (см. <a href="http://www.club155.ru//x86exceptions-fputypes" title="Прерывания и особые ситуации: Типы и средства индикации исключений FPU">Исключения FPU</a>). Каждому исключению соответствует свой бит маски:</p> <ul style="list-style-type: none;"> <li><strong>PM</strong> &ndash; <a href="http://www.club155.ru//x86exceptions-fpuconditions#P" title="Исключения FPU - Неточный результат (#P)">неточный результат (#P)</a>;</li> <li><strong>UM</strong> &ndash; <a href="http://www.club155.ru//x86exceptions-fpuconditions#U" title="Исключения FPU - Антипереполнение (#U)">антипереполнение (#U)</a>;</li> <li><strong>OM</strong> &ndash; <a href="http://www.club155.ru//x86exceptions-fpuconditions#O" title="Исключения FPU - Переполнение (#O)">переполнение (#O)</a>;</li> <li><strong>ZM</strong> &ndash; <a href="http://www.club155.ru//x86exceptions-fpuconditions#Z" title="Исключения FPU - Деление на нуль (#Z)">деление на нуль (#Z)</a>;</li> <li><strong>DM</strong> &ndash; <a href="http://www.club155.ru//x86exceptions-fpuconditions#D" title="Исключения FPU - Денормализованный операнд (#D)">денормализованный операнд (#D)</a>;</li> <li><strong>IM</strong> &ndash; <a href="http://www.club155.ru//x86exceptions-fpuconditions#I" title="Исключения FPU - Недействительная операция (#I)">недействительная операция (#I)</a>.</li> </ul> <p style="text-align: justify;">При возникновении исключения, когда соответствующий бит маски сброшен, устанавливается соответствующий <a href="http://www.club155.ru//x86internalreg-fpusw#PE" title="Внутренние регистры: Регистр состояния FPU - Флаги исключительных ситуаций, биты 5, 4, 3, 2, 1, 0">флаг в регистре состояния FPU</a> и выдается сигнал прерывания, сообщающий процессору об ошибке сопроцессора. В случае, когда бит маски исключения установлен, внешний сигнал не выдается, но флаг все равно устанавливается. Таким образом, используя эффект накопления ошибок, программное обеспечение может замаскировать все исключения до выполнения групповых вычислений, затем произвести вычисления и проверить содержимое всех флагов для выяснения того, какие исключения имели место.</p> <p>&nbsp;</p> <p style="text-align: center;">{loadposition article_footer}</p> <p>&nbsp;</p> Внутренние регистры: Регистры-указатели FPU 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86internalreg-fpufip Administrator admin@club155.ru <p> </p> <p style="text-align: justify;"><strong><em>Регистр указателя команд</em></strong> (FIP), <strong><em>регистр указателя данных</em></strong> (FDP) и <strong><em>регистр кода операции</em></strong> (Opcode Register) предназначены для использования обработчиком исключений. Всегда при приходе команды <a href="http://www.club155.ru//x86cmdfpu" title="Система команд FPU">ESC</a> (кроме <a href="http://www.club155.ru/x86cmdfpu/FINIT" title="FINIT - Инициализировать FPU с проверкой отложенных исключений">FINIT</a>, <a href="http://www.club155.ru/x86cmdfpu/FCLEX" title="FCLEX - Сбросить флаги исключений с обработкой отложенных исключений">FCLEX</a>, <a href="http://www.club155.ru/x86cmdfpu/FLDCW" title="FLDCW - Загрузить регистр управления CW">FLDCW</a>, <a href="http://www.club155.ru/x86cmdfpu/FSTCW" title="FSTCW - Сохранить регистр управления CW с проверкой отложенных исключений">FSTCW</a>, <a href="http://www.club155.ru/x86cmdfpu/FSTSW" title="FSTSW - Сохранить регистр SW с проверкой отложенных исключений">FSTSW</a>, <a href="http://www.club155.ru/x86cmdfpu/FSTSW" title="FSTSW - Сохранить регистр SW с проверкой отложенных исключений">FSTSW AX</a>, <a href="http://www.club155.ru/x86cmdfpu/FSTENV" title="FSTENV - Сохранить среду FPU с проверкой отложенных исключений">FSTENV</a>, <a href="http://www.club155.ru/x86cmdfpu/FLDENV" title="FLDENV - Загрузить среду FPU">FLDENV</a>, <a href="http://www.club155.ru/x86cmdfpu/FSAVE" title="FSAVE - Сохранить и сбросить контекст FPU с проверкой отложенных исключений">FSAVE</a>, <a href="http://www.club155.ru/x86cmdfpu/FRSTOR" title="FRSTOR - Восстановить контекст FPU">FRSTOR</a> и <a href="http://www.club155.ru/x86cmdfpu/FWAIT" title="FWAIT - Ожидать">FWAIT</a>) процессор сохраняет адрес команды, адрес операнда (если присутствует) и код операции в названных регистрах указателях. Содержимое этих регистров не изменяется при выполнении последующих управляющих команд (перечислены выше).</p> <p style="text-align: justify;">Доступ к этим регистрам осуществляется с помощью команд <a href="http://www.club155.ru/x86cmdfpu/FSTENV" title="FSTENV - Сохранить среду FPU с проверкой отложенных исключений">FSTENV</a>, <a href="http://www.club155.ru/x86cmdfpu/FLDENV" title="FLDENV - Загрузить среду FPU">FLDENV</a>, <a href="http://www.club155.ru/x86cmdfpu/FSAVE" title="FSAVE - Сохранить и сбросить контекст FPU с проверкой отложенных исключений">FSAVE</a> и <a href="http://www.club155.ru/x86cmdfpu/FRSTOR" title="FRSTOR - Восстановить контекст FPU">FRSTOR</a>. После выполнения команд <a href="http://www.club155.ru/x86cmdfpu/FINIT" title="FINIT - Инициализировать FPU с проверкой отложенных исключений">FINIT</a> и <a href="http://www.club155.ru/x86cmdfpu/FSAVE" title="FSAVE - Сохранить и сбросить контекст FPU с проверкой отложенных исключений">FSAVE</a> указанные регистры очищаются.</p> <p style="text-align: justify;">При записи в память указатели команды и данных могут представляться в четырех различных форматах в зависимости от режима работы процессора и атрибута размера адреса команды. На рис. 1.15. ... 1.18. представлены эти форматы при использовании команд <a href="http://www.club155.ru/x86cmdfpu/FSTENV" title="FSTENV - Сохранить среду FPU с проверкой отложенных исключений">FSTENV</a>, <a href="http://www.club155.ru/x86cmdfpu/FLDENV" title="FLDENV - Загрузить среду FPU">FLDENV</a>. На рисунке 1.19. показано, как процессор формирует из двухбайтного (без учета префиксов) кода команды FPU 11‑разрядный код для сохранения в регистре кода операции.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-15_FPU-FSTENV-32P.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-15_FPU-FSTENV-32P.svgz" width="500" height="343" alt="Формат данных FSTENV, FLDENV в 32-битном защищенном режиме для сопроцессоров Intel387, Intel486 …"/> </p> <p align="center"><strong><em>Рис. 1.15. Формат данных FSTENV, FLDENV в 32-битном защищенном режиме для сопроцессоров Intel387, Intel486 …</em></strong></p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-16_FPU-FSTENV-32R.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-16_FPU-FSTENV-32R.svgz" width="500" height="343" alt="Формат данных FSTENV, FLDENV в 32-битном режиме реальной адресации для сопроцессоров Intel387, Intel486 …"/> </p> <p align="center"><strong><em>Рис. 1.16. Формат данных FSTENV, FLDENV в 32-битном режиме реальной адресации для сопроцессоров Intel387, Intel486 …</em></strong></p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-17_FPU-FSTENV-16P.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-17_FPU-FSTENV-16P.svgz" width="300" height="374" alt="Формат данных FSTENV, FLDENV в 16-битном защищенном режиме для сопроцессоров Intel287, Intel387, Intel486 …"/> </p> <p align="center"><strong><em>Рис. 1.17. Формат данных FSTENV, FLDENV в 16-битном защищенном режиме для сопроцессоров Intel287, Intel387, Intel486 …</em></strong></p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-18_FPU-FSTENV-16R.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-18_FPU-FSTENV-16R.svgz" width="300" height="374" alt="Формат данных FSTENV, FLDENV в 16-битном режиме реальной адресации для всех сопроцессоров и в режиме V86 для сопроцессоров Intel387, Intel486 …"/> </p> <p align="center"><strong><em>Рис. 1.18. Формат данных FSTENV, FLDENV в 16-битном режиме реальной адресации для всех сопроцессоров и в режиме V86 для сопроцессоров Intel387, Intel486 …</em></strong></p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-19_FPU-OPCODE-REG.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-19_FPU-OPCODE-REG.svgz" width="450" height="173" alt="Формирование содержимого регистра кода операции"/> </p> <p align="center"><strong><em>Рис. 1.19. Формирование содержимого регистра кода операции</em></strong></p> <p> </p> <p style="text-align: justify;">Во всех сопроцессорах кроме 8087 адрес команды учитывает наличие префиксов. В 8087 префиксы не учитываются.</p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> <p> </p> <p style="text-align: justify;"><strong><em>Регистр указателя команд</em></strong> (FIP), <strong><em>регистр указателя данных</em></strong> (FDP) и <strong><em>регистр кода операции</em></strong> (Opcode Register) предназначены для использования обработчиком исключений. Всегда при приходе команды <a href="http://www.club155.ru//x86cmdfpu" title="Система команд FPU">ESC</a> (кроме <a href="http://www.club155.ru/x86cmdfpu/FINIT" title="FINIT - Инициализировать FPU с проверкой отложенных исключений">FINIT</a>, <a href="http://www.club155.ru/x86cmdfpu/FCLEX" title="FCLEX - Сбросить флаги исключений с обработкой отложенных исключений">FCLEX</a>, <a href="http://www.club155.ru/x86cmdfpu/FLDCW" title="FLDCW - Загрузить регистр управления CW">FLDCW</a>, <a href="http://www.club155.ru/x86cmdfpu/FSTCW" title="FSTCW - Сохранить регистр управления CW с проверкой отложенных исключений">FSTCW</a>, <a href="http://www.club155.ru/x86cmdfpu/FSTSW" title="FSTSW - Сохранить регистр SW с проверкой отложенных исключений">FSTSW</a>, <a href="http://www.club155.ru/x86cmdfpu/FSTSW" title="FSTSW - Сохранить регистр SW с проверкой отложенных исключений">FSTSW AX</a>, <a href="http://www.club155.ru/x86cmdfpu/FSTENV" title="FSTENV - Сохранить среду FPU с проверкой отложенных исключений">FSTENV</a>, <a href="http://www.club155.ru/x86cmdfpu/FLDENV" title="FLDENV - Загрузить среду FPU">FLDENV</a>, <a href="http://www.club155.ru/x86cmdfpu/FSAVE" title="FSAVE - Сохранить и сбросить контекст FPU с проверкой отложенных исключений">FSAVE</a>, <a href="http://www.club155.ru/x86cmdfpu/FRSTOR" title="FRSTOR - Восстановить контекст FPU">FRSTOR</a> и <a href="http://www.club155.ru/x86cmdfpu/FWAIT" title="FWAIT - Ожидать">FWAIT</a>) процессор сохраняет адрес команды, адрес операнда (если присутствует) и код операции в названных регистрах указателях. Содержимое этих регистров не изменяется при выполнении последующих управляющих команд (перечислены выше).</p> <p style="text-align: justify;">Доступ к этим регистрам осуществляется с помощью команд <a href="http://www.club155.ru/x86cmdfpu/FSTENV" title="FSTENV - Сохранить среду FPU с проверкой отложенных исключений">FSTENV</a>, <a href="http://www.club155.ru/x86cmdfpu/FLDENV" title="FLDENV - Загрузить среду FPU">FLDENV</a>, <a href="http://www.club155.ru/x86cmdfpu/FSAVE" title="FSAVE - Сохранить и сбросить контекст FPU с проверкой отложенных исключений">FSAVE</a> и <a href="http://www.club155.ru/x86cmdfpu/FRSTOR" title="FRSTOR - Восстановить контекст FPU">FRSTOR</a>. После выполнения команд <a href="http://www.club155.ru/x86cmdfpu/FINIT" title="FINIT - Инициализировать FPU с проверкой отложенных исключений">FINIT</a> и <a href="http://www.club155.ru/x86cmdfpu/FSAVE" title="FSAVE - Сохранить и сбросить контекст FPU с проверкой отложенных исключений">FSAVE</a> указанные регистры очищаются.</p> <p style="text-align: justify;">При записи в память указатели команды и данных могут представляться в четырех различных форматах в зависимости от режима работы процессора и атрибута размера адреса команды. На рис. 1.15. ... 1.18. представлены эти форматы при использовании команд <a href="http://www.club155.ru/x86cmdfpu/FSTENV" title="FSTENV - Сохранить среду FPU с проверкой отложенных исключений">FSTENV</a>, <a href="http://www.club155.ru/x86cmdfpu/FLDENV" title="FLDENV - Загрузить среду FPU">FLDENV</a>. На рисунке 1.19. показано, как процессор формирует из двухбайтного (без учета префиксов) кода команды FPU 11‑разрядный код для сохранения в регистре кода операции.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-15_FPU-FSTENV-32P.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-15_FPU-FSTENV-32P.svgz" width="500" height="343" alt="Формат данных FSTENV, FLDENV в 32-битном защищенном режиме для сопроцессоров Intel387, Intel486 …"/> </p> <p align="center"><strong><em>Рис. 1.15. Формат данных FSTENV, FLDENV в 32-битном защищенном режиме для сопроцессоров Intel387, Intel486 …</em></strong></p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-16_FPU-FSTENV-32R.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-16_FPU-FSTENV-32R.svgz" width="500" height="343" alt="Формат данных FSTENV, FLDENV в 32-битном режиме реальной адресации для сопроцессоров Intel387, Intel486 …"/> </p> <p align="center"><strong><em>Рис. 1.16. Формат данных FSTENV, FLDENV в 32-битном режиме реальной адресации для сопроцессоров Intel387, Intel486 …</em></strong></p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-17_FPU-FSTENV-16P.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-17_FPU-FSTENV-16P.svgz" width="300" height="374" alt="Формат данных FSTENV, FLDENV в 16-битном защищенном режиме для сопроцессоров Intel287, Intel387, Intel486 …"/> </p> <p align="center"><strong><em>Рис. 1.17. Формат данных FSTENV, FLDENV в 16-битном защищенном режиме для сопроцессоров Intel287, Intel387, Intel486 …</em></strong></p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-18_FPU-FSTENV-16R.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-18_FPU-FSTENV-16R.svgz" width="300" height="374" alt="Формат данных FSTENV, FLDENV в 16-битном режиме реальной адресации для всех сопроцессоров и в режиме V86 для сопроцессоров Intel387, Intel486 …"/> </p> <p align="center"><strong><em>Рис. 1.18. Формат данных FSTENV, FLDENV в 16-битном режиме реальной адресации для всех сопроцессоров и в режиме V86 для сопроцессоров Intel387, Intel486 …</em></strong></p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-19_FPU-OPCODE-REG.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-19_FPU-OPCODE-REG.svgz" width="450" height="173" alt="Формирование содержимого регистра кода операции"/> </p> <p align="center"><strong><em>Рис. 1.19. Формирование содержимого регистра кода операции</em></strong></p> <p> </p> <p style="text-align: justify;">Во всех сопроцессорах кроме 8087 адрес команды учитывает наличие префиксов. В 8087 префиксы не учитываются.</p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> Внутренние регистры: Регистры MMX и 3DNow! 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86internalreg-mmx3dnow Administrator admin@club155.ru <p> </p> <p style="text-align: justify;">Технологии <strong><em>MMX</em></strong> фирмы Intel и <strong><em>3DNow!</em></strong> фирмы AMD построены на основе структурного расширения процессора. По сути технология <em>3DNow!</em> является расширением технологии <em>MMX</em>. Обе они включают:</p> <ul> <li>дополнительные наборы команд для обработки мультимедийной информации,</li> <li>дополнительные режимы работы процессора при обработке прерываний/исключений/особых ситуаций,</li> <li>отладке и мониторинге производительности программ, </li> <li>дополнительные логические регистры, отображаемые на регистры FPU.</li> </ul> <p></p> <p style="text-align: justify;"><strong><em>MMX-регистры</em></strong> (они же <strong><em>3DNow!-регистры</em></strong>) — это восемь 64-разрядных регистров (<strong>MM0 … MM7</strong>), которые отображены на младшие 64 бита <a href="http://www.club155.ru/index.php?Itemid=247" title="Регистры общего назначения FPU">регистров общего назначения FPU</a> (<strong>R0 … R7</strong>). То есть регистры <em>MMX</em> по сути являются логическими регистрами, физически совмещенными с регистрами <strong>R0 … R7</strong>. Это значит, что при записи информации в <em>MMX</em>-регистр, записываемое значение автоматически появляется в младших битах соотвествующего регистра FPU, и наоборот, при записи в регистровый стек FPU значения младших 64 бит записываемой величины окажутся в соответствующем <em>MMX</em>-регистре (см. рис. 1.20.).</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-20_MMX-REG.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-20_MMX-REG.svgz" width="400" height="370" alt="Отображение MMX-регистров на регистры FPU"/> </p> <p align="center"><strong><em>Рис. 1.20. Отображение MMX-регистров на регистры FPU</em></strong></p> <p> </p> <p style="text-align: justify;">Поскольку <a href="http://www.club155.ru/index.php?Itemid=247" title="Регистры общего назначения FPU">регистры FPU</a> (<strong>R0 … R7</strong>) организуют так называемый <a href="http://www.club155.ru/index.php?Itemid=247" title="Регистры общего назначения FPU">регистровый стек</a> (<strong>ST0 … ST7</strong>), то в зависимости от текущего значения поля <a href="http://www.club155.ru//x86internalreg-fpusw#TOP" title="Внутренние регистры: Регистр состояния FPU - TOP (Указатель вершины стека FPU, биты 13, 12, 11)">TOP</a> <a href="http://www.club155.ru/index.php?Itemid=249" title="Регистр состояния FPU">регистра состояния FPU (SW)</a> будет меняться соответствие регистров стека и <em>MMX</em>-регистров.</p> <p style="text-align: justify;">Например, при <a href="http://www.club155.ru//x86internalreg-fpusw#TOP" title="Внутренние регистры: Регистр состояния FPU - TOP (Указатель вершины стека FPU, биты 13, 12, 11)">SW.TOP</a> = 0:</p> <ul style="list-style-type:none;"> <li><strong>MM0</strong> отображается на <strong>ST0</strong>,</li> <li><strong>MM1</strong> — на <strong>ST1</strong> и т.д.;</li> </ul> <p style="text-align: justify;">при <a href="http://www.club155.ru//x86internalreg-fpusw#TOP" title="Внутренние регистры: Регистр состояния FPU - TOP (Указатель вершины стека FPU, биты 13, 12, 11)">SW.TOP</a> = 2:</p> <ul style="list-style-type:none;"> <li><strong>MM0</strong> отображается на <strong>ST6</strong>,</li> <li><strong>MM1</strong> — на <strong>ST7</strong>,</li> <li><strong>MM2</strong> — на <strong>ST0</strong> и т.д.</li> </ul> <p></p> <p style="text-align: justify;">FPU располагает своим механизмом отслеживания типов данных, находящихся в регистрах <strong>R0 … R7</strong>. Это <a href="http://www.club155.ru//x86internalreg-fputag" title="Внутренние регистры: Регистр тэгов FPU">поля тэгов</a>, поставленные в соответствие каждому регистру. Однако технологии <em>MMX</em> и <em>3DNow!</em> вводят новые типы данных, которые не могут быть корректно обработаны FPU. Поэтому при выполнении команд <a href="http://www.club155.ru/x86cmd?sid=10:--MMX" title="Набор команд MMX">MMX</a> и <a href="http://www.club155.ru/x86cmd?sid=11:--3DNow" title="Набор команд 3DNow!">3DNow!</a> (кроме <a href="http://www.club155.ru/x86cmdmmx/EMMS" title="EMMS - Очистить контекст MMX">EMMS</a>, <a href="http://www.club155.ru/x86cmd3dnow/FEMMS" title="FEMMS - Очистить контекст MMX/3DNow!">FEMMS</a>, <a href="http://www.club155.ru/x86cmd3dnow/PREFETCH" title="PREFETCH - Выбрать из памяти в КЭШ строку данных">PREFETCH</a>) все поля тэгов устанавливаются в 00b (<em>действительный</em>). (Команды <a href="http://www.club155.ru/x86cmdmmx/EMMS" title="EMMS - Очистить контекст MMX">EMMS</a> и <a href="http://www.club155.ru/x86cmd3dnow/FEMMS" title="FEMMS - Очистить контекст MMX/3DNow!">FEMMS</a> заполняют все <a href="http://www.club155.ru//x86internalreg-fputag" title="Внутренние регистры: Регистр тэгов FPU">поля тэгов</a> значениями 11b (<em>пустой</em>). Команда <a href="http://www.club155.ru/x86cmd3dnow/PREFETCH" title="PREFETCH - Выбрать из памяти в КЭШ строку данных">PREFETCH</a> не изменяет значения тэгов.)</p> <p> </p> <p style="text-align: center;"><strong><em>Таблица 1.3. Влияние MMX- и 3DNow!- команд на контекст FPU</em></strong></p> <p style="text-align: center;">{loadposition custom_position_T1-3}</p> <p style="text-align: justify;">Так как <a href="http://www.club155.ru/x86cmd?sid=10:--MMX" title="Набор команд MMX">команды MMX</a>, <a href="http://www.club155.ru/x86cmd?sid=11:--3DNow" title="Набор команд 3DNow!">3DNow!</a> и <a href="http://www.club155.ru/x86cmd?sid=9:--FPU" title="Система команд FPU ">команды FPU</a> используют физически одни и те же регистры, для сохранения и восстановления контекста <em>MMX</em>, <em>3DNow!</em> используются команды FPU — <a href="http://www.club155.ru/x86cmdfpu/FSAVE" title="FSAVE - Сохранить и сбросить контекст FPU с проверкой отложенных исключений">FSAVE</a> и <a href="http://www.club155.ru/x86cmdfpu/FRSTOR" title="FRSTOR - Восстановить контекст FPU">FRSTOR</a>.</p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> <p> </p> <p style="text-align: justify;">Технологии <strong><em>MMX</em></strong> фирмы Intel и <strong><em>3DNow!</em></strong> фирмы AMD построены на основе структурного расширения процессора. По сути технология <em>3DNow!</em> является расширением технологии <em>MMX</em>. Обе они включают:</p> <ul> <li>дополнительные наборы команд для обработки мультимедийной информации,</li> <li>дополнительные режимы работы процессора при обработке прерываний/исключений/особых ситуаций,</li> <li>отладке и мониторинге производительности программ, </li> <li>дополнительные логические регистры, отображаемые на регистры FPU.</li> </ul> <p></p> <p style="text-align: justify;"><strong><em>MMX-регистры</em></strong> (они же <strong><em>3DNow!-регистры</em></strong>) — это восемь 64-разрядных регистров (<strong>MM0 … MM7</strong>), которые отображены на младшие 64 бита <a href="http://www.club155.ru/index.php?Itemid=247" title="Регистры общего назначения FPU">регистров общего назначения FPU</a> (<strong>R0 … R7</strong>). То есть регистры <em>MMX</em> по сути являются логическими регистрами, физически совмещенными с регистрами <strong>R0 … R7</strong>. Это значит, что при записи информации в <em>MMX</em>-регистр, записываемое значение автоматически появляется в младших битах соотвествующего регистра FPU, и наоборот, при записи в регистровый стек FPU значения младших 64 бит записываемой величины окажутся в соответствующем <em>MMX</em>-регистре (см. рис. 1.20.).</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-20_MMX-REG.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-20_MMX-REG.svgz" width="400" height="370" alt="Отображение MMX-регистров на регистры FPU"/> </p> <p align="center"><strong><em>Рис. 1.20. Отображение MMX-регистров на регистры FPU</em></strong></p> <p> </p> <p style="text-align: justify;">Поскольку <a href="http://www.club155.ru/index.php?Itemid=247" title="Регистры общего назначения FPU">регистры FPU</a> (<strong>R0 … R7</strong>) организуют так называемый <a href="http://www.club155.ru/index.php?Itemid=247" title="Регистры общего назначения FPU">регистровый стек</a> (<strong>ST0 … ST7</strong>), то в зависимости от текущего значения поля <a href="http://www.club155.ru//x86internalreg-fpusw#TOP" title="Внутренние регистры: Регистр состояния FPU - TOP (Указатель вершины стека FPU, биты 13, 12, 11)">TOP</a> <a href="http://www.club155.ru/index.php?Itemid=249" title="Регистр состояния FPU">регистра состояния FPU (SW)</a> будет меняться соответствие регистров стека и <em>MMX</em>-регистров.</p> <p style="text-align: justify;">Например, при <a href="http://www.club155.ru//x86internalreg-fpusw#TOP" title="Внутренние регистры: Регистр состояния FPU - TOP (Указатель вершины стека FPU, биты 13, 12, 11)">SW.TOP</a> = 0:</p> <ul style="list-style-type:none;"> <li><strong>MM0</strong> отображается на <strong>ST0</strong>,</li> <li><strong>MM1</strong> — на <strong>ST1</strong> и т.д.;</li> </ul> <p style="text-align: justify;">при <a href="http://www.club155.ru//x86internalreg-fpusw#TOP" title="Внутренние регистры: Регистр состояния FPU - TOP (Указатель вершины стека FPU, биты 13, 12, 11)">SW.TOP</a> = 2:</p> <ul style="list-style-type:none;"> <li><strong>MM0</strong> отображается на <strong>ST6</strong>,</li> <li><strong>MM1</strong> — на <strong>ST7</strong>,</li> <li><strong>MM2</strong> — на <strong>ST0</strong> и т.д.</li> </ul> <p></p> <p style="text-align: justify;">FPU располагает своим механизмом отслеживания типов данных, находящихся в регистрах <strong>R0 … R7</strong>. Это <a href="http://www.club155.ru//x86internalreg-fputag" title="Внутренние регистры: Регистр тэгов FPU">поля тэгов</a>, поставленные в соответствие каждому регистру. Однако технологии <em>MMX</em> и <em>3DNow!</em> вводят новые типы данных, которые не могут быть корректно обработаны FPU. Поэтому при выполнении команд <a href="http://www.club155.ru/x86cmd?sid=10:--MMX" title="Набор команд MMX">MMX</a> и <a href="http://www.club155.ru/x86cmd?sid=11:--3DNow" title="Набор команд 3DNow!">3DNow!</a> (кроме <a href="http://www.club155.ru/x86cmdmmx/EMMS" title="EMMS - Очистить контекст MMX">EMMS</a>, <a href="http://www.club155.ru/x86cmd3dnow/FEMMS" title="FEMMS - Очистить контекст MMX/3DNow!">FEMMS</a>, <a href="http://www.club155.ru/x86cmd3dnow/PREFETCH" title="PREFETCH - Выбрать из памяти в КЭШ строку данных">PREFETCH</a>) все поля тэгов устанавливаются в 00b (<em>действительный</em>). (Команды <a href="http://www.club155.ru/x86cmdmmx/EMMS" title="EMMS - Очистить контекст MMX">EMMS</a> и <a href="http://www.club155.ru/x86cmd3dnow/FEMMS" title="FEMMS - Очистить контекст MMX/3DNow!">FEMMS</a> заполняют все <a href="http://www.club155.ru//x86internalreg-fputag" title="Внутренние регистры: Регистр тэгов FPU">поля тэгов</a> значениями 11b (<em>пустой</em>). Команда <a href="http://www.club155.ru/x86cmd3dnow/PREFETCH" title="PREFETCH - Выбрать из памяти в КЭШ строку данных">PREFETCH</a> не изменяет значения тэгов.)</p> <p> </p> <p style="text-align: center;"><strong><em>Таблица 1.3. Влияние MMX- и 3DNow!- команд на контекст FPU</em></strong></p> <p style="text-align: center;">{loadposition custom_position_T1-3}</p> <p style="text-align: justify;">Так как <a href="http://www.club155.ru/x86cmd?sid=10:--MMX" title="Набор команд MMX">команды MMX</a>, <a href="http://www.club155.ru/x86cmd?sid=11:--3DNow" title="Набор команд 3DNow!">3DNow!</a> и <a href="http://www.club155.ru/x86cmd?sid=9:--FPU" title="Система команд FPU ">команды FPU</a> используют физически одни и те же регистры, для сохранения и восстановления контекста <em>MMX</em>, <em>3DNow!</em> используются команды FPU — <a href="http://www.club155.ru/x86cmdfpu/FSAVE" title="FSAVE - Сохранить и сбросить контекст FPU с проверкой отложенных исключений">FSAVE</a> и <a href="http://www.club155.ru/x86cmdfpu/FRSTOR" title="FRSTOR - Восстановить контекст FPU">FRSTOR</a>.</p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> Прерывания и особые ситуации: Защищенный режим 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86exceptions-protectedmode Administrator admin@club155.ru <p>&nbsp;</p> <p style="text-align: justify;">Работа механизма реакции на <em>прерывания</em> и <em>особые ситуации</em> в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a> базируется на специальной <strong><em>таблице дескрипторов прерываний</em></strong> (<em>Protected-Mode Interrupt Descriptor Table &ndash; IDT</em>). <em>Базовый адрес</em> (<strong>BASE</strong>) этой таблицы и ее <em>предел</em> (<strong>LIMIT</strong>) заносятся в <a href="http://www.club155.ru/x86internalreg-system#IDTR" title="Системные регистры - Регистр таблицы дескрипторов прерываний IDTR">регистр IDTR</a> с помощью команды <a href="http://www.club155.ru/x86cmd/LIDT" title="LIDT - Загрузить регистр таблицы дескрипторов прерываний IDTR">LIDT</a>&nbsp;(см. <a href="http://www.club155.ru//x86exceptions-protectedmode#fig3-3" title="Рис. 3.3. Таблица дескрипторов прерываний (IDT) в защищенном режиме работы">рис.&nbsp;3.3</a>).</p> <p style="text-align: justify;">Таблица<em> </em><strong>IDT </strong>содержит до 256 специальных <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескрипторов</a>, каждый из которых соответствует своему <em>прерыванию</em>. Эти <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескрипторы</a> занимают по 8 байт каждый и располагаются в таблице последовательно без каких-либо промежутков. Самый первый <em>дескриптор</em>, расположенный по самому младшему адресу в начале таблицы соответствует прерыванию 0, а самый последний <em>дескриптор</em>, расположенный по самому старшему адресу в таблице, соответствует прерыванию 255.</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/3-3_IDT-Prot.pdf|500|354}</p> --> <p align="center"><a name="fig3-3"></a><img src="http://www.club155.ru/images/x86_images/3-3_IDT-Prot.svgz" alt="Таблица дескрипторов прерываний (IDT) в защищенном режиме работы" width="450" height="345" /></p> <p align="center"><strong><em>Рис. 3.3. Таблица дескрипторов прерываний (IDT) в защищенном режиме работы</em></strong></p> <p>&nbsp;</p> <p style="text-align: justify;">В качестве <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескрипторов</a> таблицы <strong>IDT</strong> могут использоваться дескрипторы разного <a href="http://www.club155.ru//x86addr-descriptors#TYPE" title="Адресация и многозадачность: Дескрипторы - TYPE (Тип, биты 11..8 старшего двойного слова дескриптора: Intel286 &hellip;)">типа</a> &ndash; <em>шлюза прерывания</em>, <em>шлюза ловушки</em> и <em>шлюза задачи</em>. Поведение процессора при поступлении запроса на прерывание зависит, как от типа применяемого для данного прерывания <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескрипторов</a>, так и от текущего <a href="http://www.club155.ru/index.php?Itemid=487" title="Механизм защиты">уровня привилегий задачи</a>.</p> <p style="text-align: justify;">В случае, если в качестве <em>дескриптора прерывания</em> используется <em>шлюз задачи</em>, процессор при поступлении запроса на прерывание выполняет все действия по <a href="http://www.club155.ru//x86addr-multitasking#switching" title="Адресация и многозадачность: Средства поддержки мультизадачности - Переключение задач">переключению на новую задачу</a>, сохраняя текущее состояние в <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> старой задачи и загружая новые значения в регистры из <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> задачи обработчика прерывания. Применение такого шлюза оправдано для обработки ошибок и сбоев, которые не могут быть обработаны в рамках текущей задачи (например, ошибки, возникающие при переключении задач).</p> <p style="text-align: justify;">Если в качестве <em>дескриптора прерывания</em> используется <em>шлюз ловушки</em> или <em>шлюз прерывания</em>, то переключения задач не происходит и программа обработчик функционирует в рамках той же задачи, что и прерванный код. Отличие <em>шлюза прерывания</em> состот лишь в том, что процессор автоматически сбрасывает флаг <a href="http://www.club155.ru/x86internalreg-eflags#IF" title="Внутренние регистры: Регистр флагов - IF (Флаг разрешения прерываний, бит 9)">EFLAGS.IF</a>&nbsp;при передаче управления в обработчик, чем обеспечивается маскирование <a href="http://www.club155.ru//x86exceptions-types#INTR" title="Прерывания и особые ситуации: Типы прерываний - Внешние маскируемые прерывания">внешних прерываний</a>. В последующем, при возврате из процедуры обработчика прежнее значение <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">регистра EFLAGS</a> восстанавливается из стека.</p> <p>&nbsp;</p> <h3><a name="handler"></a>Особенности работы процессора при передаче управления обработчику прерываний защищенного режима</h3> <p style="text-align: justify;"><a href="http://www.club155.ru/index.php?Itemid=487" title="Механизм защиты">Механизм защиты</a> для <em>прерываний</em> в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a> функционирует практически таким же образом, как это происходит при выполнении команды вызова подпрограммы <a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>. Некоторые особенности его работы заключаются в следующем:</p> <ul> <li style="text-align: justify;">процессор не проверяет <em>текущий уровень привилегий</em> <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">CPL</a> для <a href="http://www.club155.ru//x86exceptions-types#INTR" title="Прерывания и особые ситуации: Типы прерываний - Внешние маскируемые прерывания">внешних прерываний</a>;</li> <li style="text-align: justify;">поскольку для <em>прерываний</em> не существует отдельного <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектора</a>, то все правила для <em>запрашиваемого уровня привилегий селектора</em> (<a href="http://www.club155.ru//x86addr-selectors#RPL" title="Адресация и многозадачность: Селекторы - RPL (Запрашиваемый уровень привилегий, биты 1, 0)">RPL</a>) игнорируются;</li> <li style="text-align: justify;">процессор проверяет <em>уровень привилегий</em> <a href="http://www.club155.ru//x86addr-descriptors#DPL" title="Адресация и многозадачность: Дескрипторы - DPL (Уровень привилегий дескриптора: Intel286 &hellip;)">DPL</a> <em>шлюза </em>только для <a href="http://www.club155.ru//x86exceptions-types#soft" title="Прерывания и особые ситуации: Типы прерываний - Программные прерывания">программных прерываний</a>, генерируемых командами <a href="http://www.club155.ru/x86cmd/INTn" title="INT n - Вызов процедуры прерывания">INT n</a>, <a href="http://www.club155.ru/x86cmd/INT3" title="INT 3 - Вызов процедуры прерывания отладки 3">INT 3</a>, <a href="http://www.club155.ru/x86cmd/INTO" title="INTO - Вызов процедуры прерывания 4 при переполнении">INTO</a>, с тем, чтобы предотвратить генерацию таких <em>прерываний</em>, если <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">CPL</a> &gt; <a href="http://www.club155.ru//x86addr-descriptors#DPL" title="Адресация и многозадачность: Дескрипторы - DPL (Уровень привилегий дескриптора: Intel286 &hellip;)">DPL</a>.</li> </ul> <p style="text-align: justify;">Если <strong><em>обработчик прерывания защищенного режима</em></strong>&nbsp;(<em>Protected-mode Exception and Interrupt Handler</em>) будет расположен в <a href="http://www.club155.ru//x86addr-descriptors#C" title="Адресация и многозадачность: Дескрипторы - C (Согласование: Intel286 &hellip;)">согласованном кодовом сегменте</a>, то ему при получении управления будет доступен только <em>сегмент стека</em> и те сегменты, <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">привилегии</a> которых позволяют это. Если же <em>обработчик</em> будет размещен в <a href="http://www.club155.ru//x86addr-descriptors#C" title="Адресация и многозадачность: Дескрипторы - C (Согласование: Intel286 &hellip;)">несогласованном кодовом сегменте</a> с нулевым <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">уровнем привилегий</a>, то независимо от <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">CPL</a> прерванной программы ему будут доступны все сегменты.</p> <p style="text-align: justify;">При поступлении <em>запроса на прерывание</em> процессор сохраняет текущие значения <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">EFLAGS</a>, <a href="http://www.club155.ru//x86internalreg-segment" title="Внутренние регистры: Сегментные регистры">CS</a> и <a href="http://www.club155.ru//x86internalreg-common" title="Внутренние регистры: Регистры общего назначения">EIP</a> в стеке. Если для обрабатываемого прерывания предусмотрена генерация <a href="http://www.club155.ru//x86exceptions-errorcode" title="Прерывания и особые ситуации: Код ошибки">кода ошибки</a>, то этот код сохраняется в стеке сразу после значения&nbsp;<a href="http://www.club155.ru//x86internalreg-common" title="Внутренние регистры: Регистры общего назначения">EIP</a>.</p> <p style="text-align: justify;">Когда передача управления в обработчик связана с изменением <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">уровня привилегий</a> на более высокий (меньшее числовое значение), это сопровождается переключением стека. Новые значения для <a href="http://www.club155.ru//x86internalreg-segment" title="Внутренние регистры: Сегментные регистры">SS</a> и <a href="http://www.club155.ru//x86internalreg-common" title="Внутренние регистры: Регистры общего назначения">ESP</a> берутся из <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> задачи в соответствии с <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">уровнем привилегий</a> обработчика. Переключение стека производится до сохранения указанных выше регистров, причем в новом стеке в первую очередь сохраняются значения <a href="http://www.club155.ru//x86internalreg-segment" title="Внутренние регистры: Сегментные регистры">SS</a> и <a href="http://www.club155.ru//x86internalreg-common" title="Внутренние регистры: Регистры общего назначения">ESP</a>, указывающие на старый стек (см. <a href="http://www.club155.ru//x86exceptions-protectedmode#fig3-4" title="Рис. 3.4. Стек после вызова прерывания или особой ситуации в защищенном режиме">рис. 3.4.</a>).</p> <p style="text-align: justify;">При передаче управления в обработчик через <em>шлюз прерывания</em> или <em>шлюз ловушки</em> процессор сбрасывает флаги <a href="http://www.club155.ru/x86internalreg-eflags#TF" title="Внутренние регистры: Регистр флагов - TF (Флаг трассировки, бит 8)">EFLAGS.TF</a>, <a href="http://www.club155.ru/x86internalreg-eflags#RF" title="Внутренние регистры: Регистр флагов - RF (Флаг возобновления, бит 16: Intel386 &hellip;)">EFLAGS.RF</a> и <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">EFLAGS.NT</a>, чтобы отключить <em>трассировку прерываний</em> и некоторые особенности обработки <a href="http://www.club155.ru//x86addr-multitasking#linked" title="Адресация и многозадачность: Средства поддержки мультизадачности - Вложенные задачи">вложенных задач</a>. Кроме того, при использовании <em>шлюза прерывания</em> сбрасывается также и <em>флаг разрешения прерываний</em> <a href="http://www.club155.ru/x86internalreg-eflags#IF" title="Внутренние регистры: Регистр флагов - IF (Флаг разрешения прерываний, бит 9)">EFLAGS.IF</a>.</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/3-4_Stack-IntProt.pdf|500|354}</p> --> <p align="center"><a name="fig3-4"></a><img src="http://www.club155.ru/images/x86_images/3-4_Stack-IntProt.svgz" alt="Стек после вызова прерывания или особой ситуации в защищенном режиме" width="540" height="296" /></p> <p align="center"><strong><em>Рис. 3.4. Стек после вызова прерывания или особой ситуации в защищенном режиме</em></strong></p> <p>&nbsp;</p> <p style="text-align: justify;">Стек процессора Intel286 после вызова прерывания или особой ситуации заполняется аналогично, за исключением того, что сохраняемые значения 16-битные.</p> <p style="text-align: justify;">Процессоры Intel386 и Intel486 сохраняют код ошибки в стеке как 16-битное значение, а процессоры, начиная с Pentium &ndash; сохраняют его как 32-битное значение с нулевыми старшими битами.</p> <p>&nbsp;</p> <h3><a name="pvi"></a>Режим с поддержкой виртуальных флагов прерываний</h3> <p style="text-align: justify;">В процессорах, начиная с Pentium, возможен специальный подвид <strong><em>защищенного режима с поддержкой виртуальных флагов прерываний</em></strong> (<em>Protected-mode Virtual Interrupts</em>), который включается установкой флага <a href="http://www.club155.ru/x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a>. В этом режиме процессор обеспечивает автоматическую поддержку отслеживания запросов от <a href="http://www.club155.ru/x86exceptions-types#INTR" title="Прерывания и особые ситуации: Типы прерываний - Внешние маскируемые прерывания">внешних маскируемых источников прерываний</a>&nbsp;для задач, выполняемых на <em>уровне привилегий</em> <a href="http://www.club155.ru/x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">CPL</a>&nbsp;=&nbsp;3 при <a href="http://www.club155.ru/x86internalreg-eflags#IOPL" title="Внутренние регистры: Регистр флагов - IOPL (Уровень привилегий ввода/вывода, биты 13 и 12: Intel286 &hellip;)">EFLAGS.IOPL</a>&nbsp;&lt;&nbsp;3. Для обеспечения такой поддержки применяются специальные флаги <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">VIF</a> и <a href="http://www.club155.ru/x86internalreg-eflags#VIP" title="Внутренние регистры: Регистр флагов - VIP (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)">VIP</a> в регистре <a href="http://www.club155.ru/index.php?Itemid=239" title="Внутренние регистры: Регистр флагов">EFLAGS</a>. Этот механизм во многом похож на <a href="http://www.club155.ru//x86exceptions-v86mode#vme" title="Прерывания и особые ситуации: Режим V86 - Виртуальные прерывания в режиме V86 (режим EV86)">режим EV86</a>, который, в свою очередь, предназначен для работаты с <em>виртуальными прерываниями</em> в <a href="http://www.club155.ru/x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Режим V86">режиме V86</a>.</p> <p style="text-align: justify;">В обычном <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a> (<a href="http://www.club155.ru/x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a>&nbsp;=&nbsp;0), когда <a href="http://www.club155.ru/x86internalreg-eflags#IOPL" title="Внутренние регистры: Регистр флагов - IOPL (Уровень привилегий ввода/вывода, биты 13 и 12: Intel286 &hellip;)">EFLAGS.IOPL</a> &lt; <a href="http://www.club155.ru/x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">CPL</a>, все попытки изменения флага <a href="http://www.club155.ru/x86internalreg-eflags#IF" title="Внутренние регистры: Регистр флагов - IF (Флаг разрешения прерываний, бит 9)">EFLAGS.IF</a>&nbsp;командами <a href="http://www.club155.ru/x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a>, <a href="http://www.club155.ru/x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a> вызывают генерацию <a href="http://www.club155.ru/x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">ошибки общей защиты (#GP)</a>. Когда же <em>виртуальные прерывания</em> инициализированы (<a href="http://www.club155.ru/x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a>&nbsp;=&nbsp;1) команды <a href="http://www.club155.ru/x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a> и <a href="http://www.club155.ru/x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a> оказывают влияние на флаг <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a>, а флаг <a href="http://www.club155.ru/x86internalreg-eflags#IF" title="Внутренние регистры: Регистр флагов - IF (Флаг разрешения прерываний, бит 9)">EFLAGS.IF</a>&nbsp;при этом остается неизменным. При поступлении <a href="http://www.club155.ru/x86exceptions-types#INTR" title="Прерывания и особые ситуации: Типы прерываний - Внешние маскируемые прерывания">внешнего маскируемого прерывания</a> процессор производит стандартное обращение к <a href="http://www.club155.ru//x86exceptions-protectedmode#handler" title="Прерывания и особые ситуации: Защищенный режим - Особенности работы процессора при передаче управления обработчику прерываний защищенного режима">обработчику прерываний защищенного режима</a> (процедура этого обращения описана выше). <a href="http://www.club155.ru//x86exceptions-protectedmode#handler" title="Прерывания и особые ситуации: Защищенный режим - Особенности работы процессора при передаче управления обработчику прерываний защищенного режима">Обработчик прерывания</a> должен произвести анализ флага <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a> и в зависимости от его значения произвести следующие действия:</p> <ul> <li style="text-align: justify;">если в момент поступления запроса на прерывание <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a>&nbsp;=&nbsp;1, значит прерывания были разрешены в программе уровня привилегий 3 &ndash; <a href="http://www.club155.ru//x86exceptions-protectedmode#handler" title="Прерывания и особые ситуации: Защищенный режим - Особенности работы процессора при передаче управления обработчику прерываний защищенного режима">обработчик защищенного режима</a> может либо сам обработать это прерывание, либо передать управление в соответствующий обработчик в прерванной задаче, эмулируя поступление соответствующего <a href="http://www.club155.ru/x86exceptions-types#INTR" title="Прерывания и особые ситуации: Типы прерываний - Внешние маскируемые прерывания">внешнего прерывания</a>;</li> <li style="text-align: justify;">если в момент поступления запроса на прерывание <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a>&nbsp;=&nbsp;0, значит прерывания были запрещены в программе уровня привилегий 3, <a href="http://www.club155.ru//x86exceptions-protectedmode#handler" title="Прерывания и особые ситуации: Защищенный режим - Особенности работы процессора при передаче управления обработчику прерываний защищенного режима">обработчик защищенного режима</a> может сам обработать поступившее прерывание, но если это необходимо делать внутри программы уровня привилегий 3, обработчик защищенного режима устанавливает специальный <em>флаг отложенного прерывания</em> <a href="http://www.club155.ru/x86internalreg-eflags#VIP" title="Внутренние регистры: Регистр флагов - VIP (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)">EFLAGS.VIP</a> и возвращает управление в прерванную программу.</li> </ul> <p style="text-align: justify;">Если при выполнении программы уровня привилегий 3 процессор разрешает прием <a href="http://www.club155.ru/x86exceptions-types#INTR" title="Прерывания и особые ситуации: Типы прерываний - Внешние маскируемые прерывания">внешник маскируемых прерываний</a>, уставливая флаг <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a> (например, командой <a href="http://www.club155.ru/x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a>), а флаг <a href="http://www.club155.ru/x86internalreg-eflags#VIP" title="Внутренние регистры: Регистр флагов - VIP (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)">EFLAGS.VIP</a>&nbsp;=&nbsp;1, то перед установкой флага <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a> срабатывает вызов <strong><em>отложенного прерывания</em></strong> и генерируется <a href="http://www.club155.ru/x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">ошибка общей защиты (#GP)</a>. <em>Обработчик ошибки общей защиты</em> должен распознавать такие ситуации и соответствующим образом обрабатывать поступившие запросы на прерывание. Рекомендуемая последовательность его действий перед возвратом управления в прерванную программу: очистка флага <a href="http://www.club155.ru/x86internalreg-eflags#VIP" title="Внутренние регистры: Регистр флагов - VIP (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)">EFLAGS.VIP</a> и установка флага <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a> в сохраненном в стеке образе регистра <a href="http://www.club155.ru/index.php?Itemid=239" title="Внутренние регистры: Регистр флагов">EFLAGS</a>, возврат управления в прерванную программу.</p> <p style="text-align: justify;">В некоторых редких случаях флаги <a href="http://www.club155.ru/x86internalreg-eflags#VIP" title="Внутренние регистры: Регистр флагов - VIP (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)">EFLAGS.VIP</a> и <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a> могут оказаться установленными одновременно (например, командой <a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a> или на уровне привилегий. отличном от 3). Тогда перед выполнением очередной команды программы уровня привилегий 3 генерируется <a href="http://www.club155.ru/x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">ошибка общей защиты (#GP)</a>.</p> <p style="text-align: justify;">Таким образом, флаг <a href="http://www.club155.ru/x86internalreg-eflags#VIP" title="Внутренние регистры: Регистр флагов - VIP (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)">EFLAGS.VIP</a> никогда автоматически не изменяется процессором, а должен устанавливаться и сбрасываться программным обеспечением самостоятельно.</p> <p style="text-align: justify;">Текущие значения флагов&nbsp;<a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a>&nbsp;и&nbsp;<a href="http://www.club155.ru/x86internalreg-eflags#VIP" title="Внутренние регистры: Регистр флагов - VIP (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)">EFLAGS.VIP</a>&nbsp;никак не влияют на работу процессора на уровне привилегий. отличном от 3.</p> <p style="text-align: justify;">Команды&nbsp;<a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a>&nbsp;и <a href="http://www.club155.ru/x86cmd/PUSHF" title="Поместить в стек значение регистра FLAGS">PUSHF</a>/<a href="http://www.club155.ru/x86cmd/PUSHFD" title="Поместить в стек значение регистра EFLAGS">PUSHFD</a>&nbsp;выполняются при активированном механизме <em>виртуальных прерываний защищенного режима</em> (<a href="http://www.club155.ru/x86internalreg-control#CR4PVI" style="line-height: 16.8px; text-align: justify;" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a>&nbsp;=&nbsp;1) точно также, как и без него (<a href="http://www.club155.ru/x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a>&nbsp;=&nbsp;0).</p> <p>&nbsp;</p> <p style="text-align: center;">{loadposition article_footer}</p> <p>&nbsp;</p> <p>&nbsp;</p> <p style="text-align: justify;">Работа механизма реакции на <em>прерывания</em> и <em>особые ситуации</em> в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a> базируется на специальной <strong><em>таблице дескрипторов прерываний</em></strong> (<em>Protected-Mode Interrupt Descriptor Table &ndash; IDT</em>). <em>Базовый адрес</em> (<strong>BASE</strong>) этой таблицы и ее <em>предел</em> (<strong>LIMIT</strong>) заносятся в <a href="http://www.club155.ru/x86internalreg-system#IDTR" title="Системные регистры - Регистр таблицы дескрипторов прерываний IDTR">регистр IDTR</a> с помощью команды <a href="http://www.club155.ru/x86cmd/LIDT" title="LIDT - Загрузить регистр таблицы дескрипторов прерываний IDTR">LIDT</a>&nbsp;(см. <a href="http://www.club155.ru//x86exceptions-protectedmode#fig3-3" title="Рис. 3.3. Таблица дескрипторов прерываний (IDT) в защищенном режиме работы">рис.&nbsp;3.3</a>).</p> <p style="text-align: justify;">Таблица<em> </em><strong>IDT </strong>содержит до 256 специальных <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескрипторов</a>, каждый из которых соответствует своему <em>прерыванию</em>. Эти <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескрипторы</a> занимают по 8 байт каждый и располагаются в таблице последовательно без каких-либо промежутков. Самый первый <em>дескриптор</em>, расположенный по самому младшему адресу в начале таблицы соответствует прерыванию 0, а самый последний <em>дескриптор</em>, расположенный по самому старшему адресу в таблице, соответствует прерыванию 255.</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/3-3_IDT-Prot.pdf|500|354}</p> --> <p align="center"><a name="fig3-3"></a><img src="http://www.club155.ru/images/x86_images/3-3_IDT-Prot.svgz" alt="Таблица дескрипторов прерываний (IDT) в защищенном режиме работы" width="450" height="345" /></p> <p align="center"><strong><em>Рис. 3.3. Таблица дескрипторов прерываний (IDT) в защищенном режиме работы</em></strong></p> <p>&nbsp;</p> <p style="text-align: justify;">В качестве <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескрипторов</a> таблицы <strong>IDT</strong> могут использоваться дескрипторы разного <a href="http://www.club155.ru//x86addr-descriptors#TYPE" title="Адресация и многозадачность: Дескрипторы - TYPE (Тип, биты 11..8 старшего двойного слова дескриптора: Intel286 &hellip;)">типа</a> &ndash; <em>шлюза прерывания</em>, <em>шлюза ловушки</em> и <em>шлюза задачи</em>. Поведение процессора при поступлении запроса на прерывание зависит, как от типа применяемого для данного прерывания <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескрипторов</a>, так и от текущего <a href="http://www.club155.ru/index.php?Itemid=487" title="Механизм защиты">уровня привилегий задачи</a>.</p> <p style="text-align: justify;">В случае, если в качестве <em>дескриптора прерывания</em> используется <em>шлюз задачи</em>, процессор при поступлении запроса на прерывание выполняет все действия по <a href="http://www.club155.ru//x86addr-multitasking#switching" title="Адресация и многозадачность: Средства поддержки мультизадачности - Переключение задач">переключению на новую задачу</a>, сохраняя текущее состояние в <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> старой задачи и загружая новые значения в регистры из <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> задачи обработчика прерывания. Применение такого шлюза оправдано для обработки ошибок и сбоев, которые не могут быть обработаны в рамках текущей задачи (например, ошибки, возникающие при переключении задач).</p> <p style="text-align: justify;">Если в качестве <em>дескриптора прерывания</em> используется <em>шлюз ловушки</em> или <em>шлюз прерывания</em>, то переключения задач не происходит и программа обработчик функционирует в рамках той же задачи, что и прерванный код. Отличие <em>шлюза прерывания</em> состот лишь в том, что процессор автоматически сбрасывает флаг <a href="http://www.club155.ru/x86internalreg-eflags#IF" title="Внутренние регистры: Регистр флагов - IF (Флаг разрешения прерываний, бит 9)">EFLAGS.IF</a>&nbsp;при передаче управления в обработчик, чем обеспечивается маскирование <a href="http://www.club155.ru//x86exceptions-types#INTR" title="Прерывания и особые ситуации: Типы прерываний - Внешние маскируемые прерывания">внешних прерываний</a>. В последующем, при возврате из процедуры обработчика прежнее значение <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">регистра EFLAGS</a> восстанавливается из стека.</p> <p>&nbsp;</p> <h3><a name="handler"></a>Особенности работы процессора при передаче управления обработчику прерываний защищенного режима</h3> <p style="text-align: justify;"><a href="http://www.club155.ru/index.php?Itemid=487" title="Механизм защиты">Механизм защиты</a> для <em>прерываний</em> в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a> функционирует практически таким же образом, как это происходит при выполнении команды вызова подпрограммы <a href="http://www.club155.ru/x86cmd/CALL" title="CALL - Вызов процедуры">CALL</a>. Некоторые особенности его работы заключаются в следующем:</p> <ul> <li style="text-align: justify;">процессор не проверяет <em>текущий уровень привилегий</em> <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">CPL</a> для <a href="http://www.club155.ru//x86exceptions-types#INTR" title="Прерывания и особые ситуации: Типы прерываний - Внешние маскируемые прерывания">внешних прерываний</a>;</li> <li style="text-align: justify;">поскольку для <em>прерываний</em> не существует отдельного <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектора</a>, то все правила для <em>запрашиваемого уровня привилегий селектора</em> (<a href="http://www.club155.ru//x86addr-selectors#RPL" title="Адресация и многозадачность: Селекторы - RPL (Запрашиваемый уровень привилегий, биты 1, 0)">RPL</a>) игнорируются;</li> <li style="text-align: justify;">процессор проверяет <em>уровень привилегий</em> <a href="http://www.club155.ru//x86addr-descriptors#DPL" title="Адресация и многозадачность: Дескрипторы - DPL (Уровень привилегий дескриптора: Intel286 &hellip;)">DPL</a> <em>шлюза </em>только для <a href="http://www.club155.ru//x86exceptions-types#soft" title="Прерывания и особые ситуации: Типы прерываний - Программные прерывания">программных прерываний</a>, генерируемых командами <a href="http://www.club155.ru/x86cmd/INTn" title="INT n - Вызов процедуры прерывания">INT n</a>, <a href="http://www.club155.ru/x86cmd/INT3" title="INT 3 - Вызов процедуры прерывания отладки 3">INT 3</a>, <a href="http://www.club155.ru/x86cmd/INTO" title="INTO - Вызов процедуры прерывания 4 при переполнении">INTO</a>, с тем, чтобы предотвратить генерацию таких <em>прерываний</em>, если <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">CPL</a> &gt; <a href="http://www.club155.ru//x86addr-descriptors#DPL" title="Адресация и многозадачность: Дескрипторы - DPL (Уровень привилегий дескриптора: Intel286 &hellip;)">DPL</a>.</li> </ul> <p style="text-align: justify;">Если <strong><em>обработчик прерывания защищенного режима</em></strong>&nbsp;(<em>Protected-mode Exception and Interrupt Handler</em>) будет расположен в <a href="http://www.club155.ru//x86addr-descriptors#C" title="Адресация и многозадачность: Дескрипторы - C (Согласование: Intel286 &hellip;)">согласованном кодовом сегменте</a>, то ему при получении управления будет доступен только <em>сегмент стека</em> и те сегменты, <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">привилегии</a> которых позволяют это. Если же <em>обработчик</em> будет размещен в <a href="http://www.club155.ru//x86addr-descriptors#C" title="Адресация и многозадачность: Дескрипторы - C (Согласование: Intel286 &hellip;)">несогласованном кодовом сегменте</a> с нулевым <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">уровнем привилегий</a>, то независимо от <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">CPL</a> прерванной программы ему будут доступны все сегменты.</p> <p style="text-align: justify;">При поступлении <em>запроса на прерывание</em> процессор сохраняет текущие значения <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">EFLAGS</a>, <a href="http://www.club155.ru//x86internalreg-segment" title="Внутренние регистры: Сегментные регистры">CS</a> и <a href="http://www.club155.ru//x86internalreg-common" title="Внутренние регистры: Регистры общего назначения">EIP</a> в стеке. Если для обрабатываемого прерывания предусмотрена генерация <a href="http://www.club155.ru//x86exceptions-errorcode" title="Прерывания и особые ситуации: Код ошибки">кода ошибки</a>, то этот код сохраняется в стеке сразу после значения&nbsp;<a href="http://www.club155.ru//x86internalreg-common" title="Внутренние регистры: Регистры общего назначения">EIP</a>.</p> <p style="text-align: justify;">Когда передача управления в обработчик связана с изменением <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">уровня привилегий</a> на более высокий (меньшее числовое значение), это сопровождается переключением стека. Новые значения для <a href="http://www.club155.ru//x86internalreg-segment" title="Внутренние регистры: Сегментные регистры">SS</a> и <a href="http://www.club155.ru//x86internalreg-common" title="Внутренние регистры: Регистры общего назначения">ESP</a> берутся из <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">TSS</a> задачи в соответствии с <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">уровнем привилегий</a> обработчика. Переключение стека производится до сохранения указанных выше регистров, причем в новом стеке в первую очередь сохраняются значения <a href="http://www.club155.ru//x86internalreg-segment" title="Внутренние регистры: Сегментные регистры">SS</a> и <a href="http://www.club155.ru//x86internalreg-common" title="Внутренние регистры: Регистры общего назначения">ESP</a>, указывающие на старый стек (см. <a href="http://www.club155.ru//x86exceptions-protectedmode#fig3-4" title="Рис. 3.4. Стек после вызова прерывания или особой ситуации в защищенном режиме">рис. 3.4.</a>).</p> <p style="text-align: justify;">При передаче управления в обработчик через <em>шлюз прерывания</em> или <em>шлюз ловушки</em> процессор сбрасывает флаги <a href="http://www.club155.ru/x86internalreg-eflags#TF" title="Внутренние регистры: Регистр флагов - TF (Флаг трассировки, бит 8)">EFLAGS.TF</a>, <a href="http://www.club155.ru/x86internalreg-eflags#RF" title="Внутренние регистры: Регистр флагов - RF (Флаг возобновления, бит 16: Intel386 &hellip;)">EFLAGS.RF</a> и <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">EFLAGS.NT</a>, чтобы отключить <em>трассировку прерываний</em> и некоторые особенности обработки <a href="http://www.club155.ru//x86addr-multitasking#linked" title="Адресация и многозадачность: Средства поддержки мультизадачности - Вложенные задачи">вложенных задач</a>. Кроме того, при использовании <em>шлюза прерывания</em> сбрасывается также и <em>флаг разрешения прерываний</em> <a href="http://www.club155.ru/x86internalreg-eflags#IF" title="Внутренние регистры: Регистр флагов - IF (Флаг разрешения прерываний, бит 9)">EFLAGS.IF</a>.</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/3-4_Stack-IntProt.pdf|500|354}</p> --> <p align="center"><a name="fig3-4"></a><img src="http://www.club155.ru/images/x86_images/3-4_Stack-IntProt.svgz" alt="Стек после вызова прерывания или особой ситуации в защищенном режиме" width="540" height="296" /></p> <p align="center"><strong><em>Рис. 3.4. Стек после вызова прерывания или особой ситуации в защищенном режиме</em></strong></p> <p>&nbsp;</p> <p style="text-align: justify;">Стек процессора Intel286 после вызова прерывания или особой ситуации заполняется аналогично, за исключением того, что сохраняемые значения 16-битные.</p> <p style="text-align: justify;">Процессоры Intel386 и Intel486 сохраняют код ошибки в стеке как 16-битное значение, а процессоры, начиная с Pentium &ndash; сохраняют его как 32-битное значение с нулевыми старшими битами.</p> <p>&nbsp;</p> <h3><a name="pvi"></a>Режим с поддержкой виртуальных флагов прерываний</h3> <p style="text-align: justify;">В процессорах, начиная с Pentium, возможен специальный подвид <strong><em>защищенного режима с поддержкой виртуальных флагов прерываний</em></strong> (<em>Protected-mode Virtual Interrupts</em>), который включается установкой флага <a href="http://www.club155.ru/x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a>. В этом режиме процессор обеспечивает автоматическую поддержку отслеживания запросов от <a href="http://www.club155.ru/x86exceptions-types#INTR" title="Прерывания и особые ситуации: Типы прерываний - Внешние маскируемые прерывания">внешних маскируемых источников прерываний</a>&nbsp;для задач, выполняемых на <em>уровне привилегий</em> <a href="http://www.club155.ru/x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">CPL</a>&nbsp;=&nbsp;3 при <a href="http://www.club155.ru/x86internalreg-eflags#IOPL" title="Внутренние регистры: Регистр флагов - IOPL (Уровень привилегий ввода/вывода, биты 13 и 12: Intel286 &hellip;)">EFLAGS.IOPL</a>&nbsp;&lt;&nbsp;3. Для обеспечения такой поддержки применяются специальные флаги <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">VIF</a> и <a href="http://www.club155.ru/x86internalreg-eflags#VIP" title="Внутренние регистры: Регистр флагов - VIP (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)">VIP</a> в регистре <a href="http://www.club155.ru/index.php?Itemid=239" title="Внутренние регистры: Регистр флагов">EFLAGS</a>. Этот механизм во многом похож на <a href="http://www.club155.ru//x86exceptions-v86mode#vme" title="Прерывания и особые ситуации: Режим V86 - Виртуальные прерывания в режиме V86 (режим EV86)">режим EV86</a>, который, в свою очередь, предназначен для работаты с <em>виртуальными прерываниями</em> в <a href="http://www.club155.ru/x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Режим V86">режиме V86</a>.</p> <p style="text-align: justify;">В обычном <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a> (<a href="http://www.club155.ru/x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a>&nbsp;=&nbsp;0), когда <a href="http://www.club155.ru/x86internalreg-eflags#IOPL" title="Внутренние регистры: Регистр флагов - IOPL (Уровень привилегий ввода/вывода, биты 13 и 12: Intel286 &hellip;)">EFLAGS.IOPL</a> &lt; <a href="http://www.club155.ru/x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">CPL</a>, все попытки изменения флага <a href="http://www.club155.ru/x86internalreg-eflags#IF" title="Внутренние регистры: Регистр флагов - IF (Флаг разрешения прерываний, бит 9)">EFLAGS.IF</a>&nbsp;командами <a href="http://www.club155.ru/x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a>, <a href="http://www.club155.ru/x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a> вызывают генерацию <a href="http://www.club155.ru/x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">ошибки общей защиты (#GP)</a>. Когда же <em>виртуальные прерывания</em> инициализированы (<a href="http://www.club155.ru/x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a>&nbsp;=&nbsp;1) команды <a href="http://www.club155.ru/x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a> и <a href="http://www.club155.ru/x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a> оказывают влияние на флаг <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a>, а флаг <a href="http://www.club155.ru/x86internalreg-eflags#IF" title="Внутренние регистры: Регистр флагов - IF (Флаг разрешения прерываний, бит 9)">EFLAGS.IF</a>&nbsp;при этом остается неизменным. При поступлении <a href="http://www.club155.ru/x86exceptions-types#INTR" title="Прерывания и особые ситуации: Типы прерываний - Внешние маскируемые прерывания">внешнего маскируемого прерывания</a> процессор производит стандартное обращение к <a href="http://www.club155.ru//x86exceptions-protectedmode#handler" title="Прерывания и особые ситуации: Защищенный режим - Особенности работы процессора при передаче управления обработчику прерываний защищенного режима">обработчику прерываний защищенного режима</a> (процедура этого обращения описана выше). <a href="http://www.club155.ru//x86exceptions-protectedmode#handler" title="Прерывания и особые ситуации: Защищенный режим - Особенности работы процессора при передаче управления обработчику прерываний защищенного режима">Обработчик прерывания</a> должен произвести анализ флага <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a> и в зависимости от его значения произвести следующие действия:</p> <ul> <li style="text-align: justify;">если в момент поступления запроса на прерывание <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a>&nbsp;=&nbsp;1, значит прерывания были разрешены в программе уровня привилегий 3 &ndash; <a href="http://www.club155.ru//x86exceptions-protectedmode#handler" title="Прерывания и особые ситуации: Защищенный режим - Особенности работы процессора при передаче управления обработчику прерываний защищенного режима">обработчик защищенного режима</a> может либо сам обработать это прерывание, либо передать управление в соответствующий обработчик в прерванной задаче, эмулируя поступление соответствующего <a href="http://www.club155.ru/x86exceptions-types#INTR" title="Прерывания и особые ситуации: Типы прерываний - Внешние маскируемые прерывания">внешнего прерывания</a>;</li> <li style="text-align: justify;">если в момент поступления запроса на прерывание <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a>&nbsp;=&nbsp;0, значит прерывания были запрещены в программе уровня привилегий 3, <a href="http://www.club155.ru//x86exceptions-protectedmode#handler" title="Прерывания и особые ситуации: Защищенный режим - Особенности работы процессора при передаче управления обработчику прерываний защищенного режима">обработчик защищенного режима</a> может сам обработать поступившее прерывание, но если это необходимо делать внутри программы уровня привилегий 3, обработчик защищенного режима устанавливает специальный <em>флаг отложенного прерывания</em> <a href="http://www.club155.ru/x86internalreg-eflags#VIP" title="Внутренние регистры: Регистр флагов - VIP (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)">EFLAGS.VIP</a> и возвращает управление в прерванную программу.</li> </ul> <p style="text-align: justify;">Если при выполнении программы уровня привилегий 3 процессор разрешает прием <a href="http://www.club155.ru/x86exceptions-types#INTR" title="Прерывания и особые ситуации: Типы прерываний - Внешние маскируемые прерывания">внешник маскируемых прерываний</a>, уставливая флаг <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a> (например, командой <a href="http://www.club155.ru/x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a>), а флаг <a href="http://www.club155.ru/x86internalreg-eflags#VIP" title="Внутренние регистры: Регистр флагов - VIP (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)">EFLAGS.VIP</a>&nbsp;=&nbsp;1, то перед установкой флага <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a> срабатывает вызов <strong><em>отложенного прерывания</em></strong> и генерируется <a href="http://www.club155.ru/x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">ошибка общей защиты (#GP)</a>. <em>Обработчик ошибки общей защиты</em> должен распознавать такие ситуации и соответствующим образом обрабатывать поступившие запросы на прерывание. Рекомендуемая последовательность его действий перед возвратом управления в прерванную программу: очистка флага <a href="http://www.club155.ru/x86internalreg-eflags#VIP" title="Внутренние регистры: Регистр флагов - VIP (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)">EFLAGS.VIP</a> и установка флага <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a> в сохраненном в стеке образе регистра <a href="http://www.club155.ru/index.php?Itemid=239" title="Внутренние регистры: Регистр флагов">EFLAGS</a>, возврат управления в прерванную программу.</p> <p style="text-align: justify;">В некоторых редких случаях флаги <a href="http://www.club155.ru/x86internalreg-eflags#VIP" title="Внутренние регистры: Регистр флагов - VIP (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)">EFLAGS.VIP</a> и <a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a> могут оказаться установленными одновременно (например, командой <a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a> или на уровне привилегий. отличном от 3). Тогда перед выполнением очередной команды программы уровня привилегий 3 генерируется <a href="http://www.club155.ru/x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">ошибка общей защиты (#GP)</a>.</p> <p style="text-align: justify;">Таким образом, флаг <a href="http://www.club155.ru/x86internalreg-eflags#VIP" title="Внутренние регистры: Регистр флагов - VIP (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)">EFLAGS.VIP</a> никогда автоматически не изменяется процессором, а должен устанавливаться и сбрасываться программным обеспечением самостоятельно.</p> <p style="text-align: justify;">Текущие значения флагов&nbsp;<a href="http://www.club155.ru/x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a>&nbsp;и&nbsp;<a href="http://www.club155.ru/x86internalreg-eflags#VIP" title="Внутренние регистры: Регистр флагов - VIP (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)">EFLAGS.VIP</a>&nbsp;никак не влияют на работу процессора на уровне привилегий. отличном от 3.</p> <p style="text-align: justify;">Команды&nbsp;<a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a>&nbsp;и <a href="http://www.club155.ru/x86cmd/PUSHF" title="Поместить в стек значение регистра FLAGS">PUSHF</a>/<a href="http://www.club155.ru/x86cmd/PUSHFD" title="Поместить в стек значение регистра EFLAGS">PUSHFD</a>&nbsp;выполняются при активированном механизме <em>виртуальных прерываний защищенного режима</em> (<a href="http://www.club155.ru/x86internalreg-control#CR4PVI" style="line-height: 16.8px; text-align: justify;" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a>&nbsp;=&nbsp;1) точно также, как и без него (<a href="http://www.club155.ru/x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a>&nbsp;=&nbsp;0).</p> <p>&nbsp;</p> <p style="text-align: center;">{loadposition article_footer}</p> <p>&nbsp;</p>