Содержание

Дескрипторы

    Принцип   использования   процессора   80386   для	 простых
защищенных 32-битных систем был раскрыт в части 3. Затем в части
4 описан новый и полезный режим виртуального 8086. Но кроме того
процессор  80386  предоставляет  еще  дополнительные  интересные
возможности.
   Этот  раздел  раскрывает  наиболее  интересные  и   наиболее
запутанные возможности 80386, включая
   p Полное описание таблицы дискрипторов и их содержимого.
   p Встроенную поддержку многозадачности и переключение задач.
   p Полное об`яснение работы с прерываниями и	исключительными
ситуациями.
   p  Расширенные  возможности	отладки,  встроенные  в  каждый
процессор 80386.
   Эти особенности дополняют  картину  архитектуры  процессора.
Более глубокий взгляд на таблицы дескрипторов  и  их  содержимое
раскрывает встроенные возможности многозадачной  работы.  Глава,
посвященная исключительным ситуациям  и  прерываниям,  является,
в- основном, информацией для понимания всех операций  процессора
80386. Наконец,  особенности  отладки  для  16	и  32  -  битных
программ, как в реальном, так и  в  защищенном	режиме	являются
предметом интереса для всех программистов.
	     

Таблицы дескрипторов и их содержимое

Эта глава содержит полное описание таблиц дескрипторов процессора 80386 и их содержимого. Глава 8 дала вводную информацию по дескрипторам, переключателям и таблицам дескрипторов простой защищенной 32 - битной системы. Были также рассмотреныи некоторые другие типы дескрипторов, переключателей и таблиц дескрипторов. Эта глава резюмирует и всесторонне описывает назначение и формат всех дескрипторов и переключателей.

Назначение дескрипторов сегментов

Дескрипторы сегментов для команд и данных описывают, в компактной форме,воспринимаемой процессором 80386, исключительно сегменты, существующие в памяти - т.е. code и data сегменты. Сегменты code и data задаются различными типами дескрипторов т.к. только code сегмент является исполняемым, а с целью обеспечеия надлежащей защиты системы, для исполняемого кода требуется другой набор атрибутов, нежели для данных. Предусмотренные дескрипторы сегментов состояния задачи (TSS) позволяют умножать TSS-ы. Эта особенность позволяет процессору 80386 поддерживать многозадачность. Активная в данный момент задача индицируется селектором в регистре задач (TR) и TSS дескрипторе, описываемым соответствующим значением селектора. Это будет описано ниже в главе 15. Таким же образом, предусмотренные дескрипторы таблиц локальных дескрипторов (LDT) позволяют умножать LDT-ы. Это позволяет каждой задаче в многозадачной архитектуре 80386 иметь свое личное локальное адресное пространство. Активное в настоящий момент локальное адресное пространство, указываемое селектором в LDT регистре (LDTR),а LDT дескриптор указывается соответствующим значением селектора.

Назначение переключателей

Переключатели обеспечивают только передачу управления в адресном пространстве, как к определенному сегменту code или определенной задаче. Вызывающие переключатели, отладочные (trap) переключатели, и переключатели прерываний описывают точку входа в сегмент code; переключатели задач указывают задачу. Указывая переключатель как операнд результата выполнения инструкции, управление будет на некоторое время передаваться принимающему операнду, описываемому переключателем. Необходимо отдать должное функции перенаправления, т.к. часто существует необходимость создавать множественные точки входа, соответствующие данному сегменту или данной задаче. Переключатели, расположенные в IDT позволяют описывать точки входа как через механизм аппаратных прерываний процессора, так и через инструкции программных прерываний INTn, INTO, BOUND и исключительные ситуации. Для этих целей отладочный переключатель (trap gate) и переключатель прерываний (interrupt gate) указывают на code сегмент внутри текущей задачи, используя GDT и текущую LDT. Переключатель задач (task gate) указывает на сегмент состояния задачи и требует от процессора 80386 выполнения автоматического переключения задач для получения доступа к задаче-приемнику (см. главу 15).

Типы и форматы дескриптора сегментов

Дескрипторы сегментов - специальные 8-байтовые типы данных, необходимые для защищенного режима. Они описывают базовый адрес, размер и атрибуты сегментов. Существуют четыре типа дескрипторов сегментов дескрипторы code сегментов, дескрипторы data сегментов, дескрипторы сегментов состояния задач и дескрипторы таблиц локальных дескрипторов. Описание каждого типа дескрипторов будет приведено ниже. Все дескрипторы имеют определенное сходство друг с другом. Внутренний формат всех дескрипторов включает базовый адрес, значение предела, а также другую информацию об атрибутах. Сами сегменты как 16-битные, так и 32-битные используются для code сегментов, data сегментов и сегментов состояния задач. Дескрипторы code сегментов содержат бит умолчания D (Default), указывающий на то является данный сегмент 16-битным (D=0) или 32-битным (D=1) сегментом. Когда D=0 целое старшее слово дескриптора должно быть 0, в соответствии с определением формата для 16-битного дескриптора. Дескрипторы code и data сегментов имеют B (Big) бит, который может быть установлен для индикации величины размера сегмента; 32-битный дескриптор данных обычно имеет B=1, индицируя поддержку размеров сегментов вплоть до 4 гигабайт. Дескрипторы для сегментов состояния задач различают 32- битные TSS от 16- битных TSS.

Дескриптор имеет следующие поля

1. Базовый адрес сегмента - 32- битное значение, определяющее базовый адрес сегмента в линейном адресном пространстве. 2. Граница сегмента - 20- битное поле, определяющее максимальное смещение (offset) сегмента. Эта граница может иметь либо байтовую либо страничную гранулярность (4096-byte- granular). О бите гранулярности см. ниже. 3. G (Granularity) показывает гранулярность границы сегмента. (G=0)- байтовая гранулярность, (G=1)- страничная гранулярность. Если гранулярность байтовая, то граница может быть определена с точностью до байта, т.к. поле представляющее биты 19..10 разрешает максимально возможное смещение вплоть до 1 мегабайта. В случае страничной гранулярности граница может быть определена с точностью до страницы, т.к. поле представляющее биты 31..12 разрешает максимально возможное смещение до 4 гигабайт. 4. D (Derfault) указывает является ли сегмент 32- битным (D=1) или 16 битным (D=0). Если D=1 формат дескриптора для code и data сегментов будет таким,как показано на рис. 8.2 и рис. 8.3 соответственно. В случае D=0 формат дескриптора соответствует используемому процессором 80286 в защищенном режиме для 16-битных сегментов, как сказано в главе 14. По умолчанию, 32- битные коды операций используют 32- битные размеры данных в операндах и 32- битные адреса. По умолчанию, 16- битные коды операций используют 16- битные размеры данных в операндах и 16- битные адреса. (Совместимо с защищенным режимом 80286). 5. E (Expansion Direction), только для data сегментов указывает где содержится сегмент в диапазоне адресов от базы сегмента вверх до его границы включительно (E=0), или от максимального смещения (offset) вниз до границы не включая ее (E=1). Большинство сегментов данных содержат 0 в этом бите для "расширения вверх". Сегмент данных, который поддерживает динамически расширяемый стек, должен быть установлен в 1 для "расширения вниз". Стек данных наращивается вниз в направлении младших адресов. 6. B (Big) Только для сегментов данных. Влияет только на сегменты, расширяемые вниз. B показывает максимальное смещение (offset) сегмента. Максимальное смещение (offset) расширяемого вниз сегмента данных индицируется как FFFFFFFFh (B=1) или как 0000FFFFh (B=0). B не влияет на расширяемые вверх сегменты данных. 7. Право доступа. Показывает доступные формы доступа к сегментам, включая требования уровня привилегий и защиты от записи или чтения. Если использование операнда внутри сегмента не совместимо с допустимыми формами доступа, процессор 80386 генерирует исключительную ситуацию общей защиты (13) или исключительную ситуацию потери стека (12) в случае если это произошло с сегментом stack. 7а. P (Present) показывает присутствует сегмент в физической памяти (P=1) или отсутствует (P=0). Этот бит позволяет об`являть много больших сегментов, только часть из которых является полностью или частично присутствующими в физической памяти одновременно. Страничная система позволяет любому сегменту быть загруженным в базис страницы. Даже если P=1, сегменту не обязательно присутствовать полностью. Многие страницы виртуально присутствующего сегмента могут в действительности находиться на диске. 7b. DPL (Descriptor Privilege Level) показывает уровень привилегий сегмента в виде номера от 0 до 3 в следующем порядке Поле DPL Описание 00 Уровень 0 наиболее привилегированный (супервизор, ядро) 01 Уровень 1 10 Уровень 2 11 Уровень 3 наименее привилегированный (пользователь) Уровень привилегий DPL текущего сегмента code показывает текущий уровень привилегии (CPL) операции. Например, если процессор исполняет сегмент code, имеющий DPL 0, то он исполняется с CPL 0, на наиболее привилегированном уровне, уровне супервизора. 7с. A (Accessed) показывает может быть доступен сегмент (A=1) или нет (A=0). Системы, использующие межсегментные обмены могут использовать этот бит для определения использования сегмента. Типичные простейшие системы обмениваются страницами, ане сегментами, и для таких систем этот бит не будет представлять интереса. 7d. R (Readable), для сегментов code только. Показывает, является ли сегмент читаемым (R=1) или нет (R=0). Сегменты code являются всегда исполняемыми. Аттрибут R может обеспечить дополнительную безопасность страшным программным обеспечением читать из сегмента code используя префикс смены сегмента CS. Это может предотвратить "пиратство" по отношению к обьектному коду, находящемуся в памяти. 7e. C (Conforming), только для сегментов code. Указывает происходили ли изменения в CPL когда сегмент был вызван с уровня более низкой привилегии (C=0) или нет (C=1). Если C=1, то сегмент code считается конформным сегментом, т.к. значение CPL не изменялось когда вызывался этот сегмент. Конформные code сегменты являются, возможно, наиболее абстрактной концепцией архитектуры защищенного режима. В простой 32- битной системе все code сегменты являются регулярными, т.е. неконформными. 7f. W (Writable), только для сегментов данных. Показывает разрешена запись в сегмент (W=1) или нет (W=0). Сегменты данных всегда читаемы. Атрибут W обеспечивает безопасность, предотвращая любые изменения в данных. Эта специальная особенность применяется, например, для сегментов содержащих важную информацию о статусе системы или для общедоступной базы данных. В простой защищенной 32- битной системе сегмент данных является многоцелевым и кроме всего прочего содержит стек; в очень простой системе он должен, таким образом, быть доступным для записи.

Типы переключателей и форматы

Переключатели - это специальные восьмибайтовые структуры данных, необходимые в защищенном режиме в качестве перенаправляющих или векторных устройств. Существует четыре типа переключателей. С каждым типом выполняются несколько различные формы перенаправления. Эти четыре типа называются вызывающие переключатели (call gates), отладочные переключатели (trap gates), переключатели прерываний (interrupt gates) и переключатели задач (task gates). Предназначение каждого из них, которое будет об`яснено ниже, в- основном ясно из названий. Общий формат всех типов переключателей идентичен и в любом случае содержит селектор, указывающий или на дескриптор code сегмента или на TSS дескриптор, значение смещения (offset value), определяющее точку входа (исходное значение регистра EIP) в выбранный сегмент и информацию об использовании. Заметим, что переключатель задач содержит поле смещения (offset field), которое не используется с тех пор как указанный TSS не получит значение EIP. В случаях вызывающих, отладочных переключателей и переключателей прерываний, делаются различия между 16- битными и 32- битными переключателями. В этих случаях два типа переключателей имеют различные поля атрибутов. Принимая во внимание различные типы переключателей, 16- битные и 32- битные размеры, существует семь форматов переключателей 32- битные вызывающие переключатели 16- битные вызывающие переключатели 32- битные отладочные переключатели 16- битные отладочные переключатели 32- битные переключатели прерываний 16- битные переключатели прерываний Переключатели задач. Содержимое полей вызывающего переключателя, отладочного переключателя и переключателя прерываний следующее 1. Селектор принимающего code сегмента указывает на сегмент, содержащий принимающую программу. Этот селектор должен указывать на code сегмент. 2. Смещение (offset) точки входа в code сегмент определяет точку входа в принимающую программу. 3. Право доступа - несколько бит, показывающих разрешенные формы доступа к переключателю, включая требования уровня привилегий. Если использование переключателя не совместимо с требованиями, то процессор 80386 генерирует исключительную ситуацию общей защиты (13) или стековую исключительную ситуацию (12), если отсутствует stack сегмент. 3a. P (Present-присутствие), показывает доступен ли переключатель для использования (P=1) или нет (P=0). Для успешного переключения переключатель должен присутствовать. 3b. DPL (Descriptor Privilege Level - дескриптор уровня привилегий) показывает уровень привилегий переключателя. Аппаратное прерывание может осуществляться через отладочный переключатель или переключатель прерываний, если он помечен как присутствующий, независимо от DPL переключателя. DPL используется только для инструкций CALL для вызывающего переключателя и для программных прерываний (инструкции INTn, INTO, BOUND и исключительные ситуации) для отладочных переключателей или переключателей прерываний. DPL показывает уровень привилегий преключателя числом от 0 до 3 следующим образом Поле DPL Описание 00 Уровень 0 наиболее привилегированный (супервизор, ядро) 01 Уровень 1 10 Уровень 2 11 Уровень 3 наименее привилегированный (пользователь) Для инструкции CALL, программного прерывания, или исключительной ситуации, инструкция, использующая переключатель должна иметь CPL меньший, чем DPL переключателя. Например, если процессор исполняет code сегмент с DPL=3 (т.е. на уровне текущей привилегии 3), то инструкция CALL в этом случае может использовать только вызывающие переключатели с DPL=3, и программные прерывания могут использовать только отладочные переключатели и переключатели прерываний с DPL=3. Любое иное значение DPL (т.е. 2,1, или 0) переключателя укажет более высокий уровень привилегий и успешного переключения не произойдет. В этом случае будет сгенерирована исключительная ситуация общей защиты (13).

Содержимое полей переключателя задач следующее

1. Селектор принимающего сегмента состояния задачи указывает на сегмент состояния задачи содержащий принимающую программу. Этот селектор должен указывать на сегмент состояния задачи (либо 32- либо 16- битный TSS). Переключатель задач не содержит поля смещения (offset), с того времени как TSS сам содержит значение EIP для последующего использования. 2. Право доступа - несколько бит, показывающих разрешенные формы доступа к переключателю, включая требования уровня привилегий. Если использование переключателя не совместимо с требованиями, то процессор 80386 генерирует исключительную ситуацию общей защиты (13) или стековую исключительную ситуацию (12), если отсутствует stack сегмент. Если сам сегмент состояния задачи некорректен, процессор генерирует исключительную ситуацию 10. 2a. P (Present-присутствие), показывает доступен ли переключатель для использования (P=1) или нет (P=0). Для успешного переключения переключатель должен присутствовать. 2b. DPL (Descriptor Privilege Level - дескриптор уровня привилегий) показывает уровень привилегий переключателя. Аппаратное прерывание может осуществляться через отладочный переключатель или переключатель прерываний, если он помечен как присутствующий, независимо от DPL переключателя. DPL используется только для программных прерываний (инструкции INTn, INTO, BOUND и исключительные ситуации) DPL показывает уровень привилегий преключателя числом от 0 до 3 следующим образом Поле DPL Описание 00 Уровень 0 наиболее привилегированный (супервизор, ядро) 01 Уровень 1 10 Уровень 2 11 Уровень 3 наименее привилегированный (пользователь) Для программного прерывания, или исключительной ситуации, инструкция, использующая прерывание, должна иметь CPL меньший, чем DPL переключателя. Например, если процессор исполняет code сегмент с DPL=3 (т.е. на уровне текущей привилегии 3), то программное прерывание в этом случае может использовать только переключатели задач с DPL=3, и программные прерывания могут использовать только отладочные переключатели и переключатели прерываний с DPL=3. Любое иное значение DPL (т.е. 2,1, или 0) укажет более высокий уровень привилегий и успешного переключения в задачу не произойдет. В этом случае будет сгенерирована исключительная ситуация общей защиты (13).

Таблицы дескрипторов

Таблицы дескрипторов (descriptor tables) - это расположенные в памяти матрицы, содержащие в качестве элемента дескриптор или переключатель. Процессор 80386 поддерживает три типа таблиц дескрипторов таблица глобальных дескрипторов (GDT), таблица локальных дескрипторов (LDT), таблица дескрипторов прерываний (IDT). Две из этих таблиц, GDT и LDT содержат дескрипторы и переключатели, описывающие адресное пространство; они описывают, например, существующие сегменты и задачи. На дескрипторы и переключатели, расположенные в этих таблицах, можно ссылаться с использованием селекторов. Напомним, что GDT устанавливалась простой 32-битной защищенной системой. LDT не использовались для простой системы, т.к. они целиком связаны с многозадачностью процессора 80386 и служат для обеспечения локальным адресным пространством индивидуальной задачи, как описано в главе 15. Третья таблица, IDT, содержит только переключатели; они служат для перенаправления исключительных ситуаций и прерываний на соответствующие им программы обслуживания. Переключатели в этой таблице указывают на номера прерываний от 0 до 255. Данное большое число дескрипторов, переключателей, таблиц и размещение каждого из них должно быть выполнено исключительно аккуратно. Для этого существует таблица 14.1, которая резюмирует разрешаемое содержимое каждой таблицы дескрипторов. Как GDT, так и LDT могут содержать дескрипторы code и data сегментов и могут содержать вызывающие переключатели или переключатели задач. Тем не менее в то время какLDT создана только для обеспечения локального адресного пространства задач, GDT является только таблицей, позволяющей содержать специальные дескрипторы для сегментов состояния задач и таблиц локальных дескрипторов. IDT может содержать только переключатели для целей перенаправления исключительных ситуаций и прерываний. Переключателями, которые она может содержать, являются переключатели прерываний, задач, отладочные переключатели, но не вызывающие переключатели. Таблица 14.1. Разрешенное содержимое таблиц дескрипторов
GDT LDT IDT (Таблица глобальных (Таблица локальных (Таблица дескрипторов дескрипторов) дескрипторов) прерываний)
Дес- Дескрипторы Code Дескрипторы Code крип- сегмента (32и16) сегмента (32и16) торы Дескрипторы Data Дескрипторы Data сегмента (32и16) сегмента (32и16) Дескрипторы Code Дескрипторы Code сегмента (32и16) сегмента (32и16) Дескрипторы сег- мента состояния задач (32и16бит) Дескриптор таб- лицы локальных дескрипторов
Пере- Вызывающий пере- Вызывающий пере- клю- ключатель в 32- и ключатель в 32- и чате- 16- битные Code 16- битные Code ли сегменты сегменты Переключ. задач Переключ. задач Переключ. задач Переключатель задач в 32- и 16- битные Code сегменты Переключ.прерываний в 32- и 16- битные Code сегменты

Системные регистры, содержащие таблицу дескрипторов

В области памяти, как известно, содержится таблица дескрипторов, в то время как один из регистров защищенного режима процессора 80386, показанный в таблице 14.2 устанавливается на базовый адрес и границу, описываемую как область памяти.

Инициализация GDTR и IDTR

GDTR и IDTR являются регистрами только защищенного режима, загружаемые линейными адресами. Таким образом эти регистры служат в качестве привязки структуры таблицы дескрипторов защищенного режима. GDTR и IDTR инициализируются сходным образом. Линейный базовый адрес и граница записываются в каждый регистр с использованием LGDT и LIDT инструкций соответственно. Эти инструкции описывают 16-битное значение границы, позволяющее иметь размер таблицы вплоть до 64 Кбайт, и 32-битный базобый адрес, разрешающий располагать базу в любом месте внутри линейного адресного пространства. GDT может содержать следующее: -переключатели прерываний -переключатели ловушек -переключатели задач IDT может содержать следующее: -переключатели прерываний -переключатели ловущек -переключатели задач

Инициализация LDTR

LDTR иницициализируется путем записи значения селектора в регистр с использованием инструкции LLDT. Селектор должен указывать на LDT дескриптор такой, как показано на рис.14.4, который содержит необходимый базовый адрес и границу. Регистр кэш дескриптора, соответствующий регистру LDTR сохраняет внутреннюю копию полей LDT дескриптора как показано на рисунке 14.11. Использованием инструкции LLDT для загрузки LDT дескриптора, LDT может быть бомещен в любом месте линейного адресного пространства и может достигать 64 Кбайт, как показано на рис.14.12. LDT дескриптор содержится в GDT. Таким образом, необходимо создать образ GDT и инициализировать GDTR сначала. С установленной GDT инструкция LLDT может быть выполнена для загрузки LDTR посредством размещения LDT.

Использование переключателей для перенаправления

Перенаправление посредством вызывающих переключателей Вызывающие переключатели могут быть помещены только в GDT и LDT. Перенаправление через вызывающий переключатель (call gate) выполняется с любой межсегментной инструкцией CALL (код операции 9Ah), которая описывает вызывающий переключатель как принимающий операнд. Селектор вызывающего переключателя используется как принимающий операнд инструкции. Такая инструкция CALL может передать управление либо в другой сегмент code с таким же текущим уровнем привилегий, либо в другой code сегмент с более высоким уровнем привилегий. Таким образом, вызывающий переключатель может расширить возможности межсегментной инструкции CALL для доступа к сегментам на более высоком уровне привилегий. Инструкции CALL всегда оставляют адрес следующей инструкции в стеке, таким образом, чтобы инструкция RET могла продолжить исполнение основной программы. Эта концепция остается в силе даже если инструкция CALL указывает вызывающий переключатель. Когда вызывающий переключатель передает управление сегменту на текущем уровне привилегий, CS и EIP сохраняются в стек на текущем уровне. Когда вызывающий переключатель передает управление на уровень более высокой привилегии, то как адрес стека, так и адрес инструкции сохраняются в стек на принимающем (с большей привилегией) уровне. Перенаправление через вызывающий переключатель с параметром самокопирования (Autocopy) Предположим, что вызывающая программа помещает значения параметров в свой стек перед исполнением межсегментной инструкции CALL, указывающей на вызывающий переключатель. Если управляющий переключатель передает управление на более высокий уровень, то параметры не находятся в стеке вызванной программы. Вызванной программе может оказаться затруднительным прочитать параметры из стека низшего уровня. Наиболее приемлемым решением является активизирование опциона параметра самокопирования (parameter autocopy) с каждым вызывающим переключателем. Вызывающий переключатель, как показывает рис.14.5, включает поле счетчика слов (word count field), которое принимает значения от 0 до 31. Счетчик слов, n, тридцатидвухбитного вызывающего переключателя указывает процессору 80386, если переход из привилегии в привилегию происходит благодаря перенаправлению вызывающего переключателя, копировать n двойных слов из стека низшего уровня в стек более высокого уровня. С этого времени вызванная программа находит соответствующее число параметров в своем стеке. Рис.14.14 иллюстрирует самокопирование параметров из стека низкого уровня в принимающий стек более высокого уровня. В конце исполнения вызванной программы она должна отработать инструкцию RETn, где n,число байт, которые должны быть удалены из стека. Оно должно соответствовать числу байт, скопированных вызывающим переключателем. Указанное число байт удаляется из стека низшего уровня, когда появляется команда RET. Стек высшего уровня предполагается пустым после возврата (RET) на низшем уровне. Таким образом, после возврата, исходное состояние SS:ESP сохраняется в TSS, определяя верхушку стека верхнего уровня для следующего раза, когда потребуется стек. Возможность параметра самокопирования не работает, если счетчик слов равен 0. Запишите нули в поле счетчика слов, если параметр самокопирования не требуется с каким- либо вызывающим переключателем. Перенаправление через отладочные переключатели (trap gates) и переключатели прерываний (interrupt gates) Отладочные переключатели и переключатели прерываний могут быть помещены только в IDT. Перенаправление с помощью этих переключателей может быть выполнено с помощью любой инструкции программного прерывания (INTn,INTO,BOUND), исключительной ситуации или с помощью аппаратных прерываний. Перенаправление для прерывания или исключительной ситуации n происходит через переключатель в численной позиции n IDT. Такой переключатель ведет в другой code сегмент либо на текущем уровне привилегий, либо на более высоком. Таким образом отладочный переключатель или переключатель прерываний расширяет возможности инструкций программных прерываний для доступа к сегментам с большим уровнем привилегий. Отладочный переключатель и переключатель прерываний имеют те же самые стековые эффекты, что и вызывающий переключатель. Когда вызывающий переключатель передает управление на уровень более высокой привилегии, то как адрес стека, так и адрес инструкции сохраняются в стек на принимающем (с большей привилегией) уровне, как показано на рис. 14.15. Однако, возможность использования параметра самокопирования не обеспечивается. Перенаправление через переключатели задач Переключатели задач могут располагаться в GDT,LDT, или в IDT. В случае GDT или LDT, переключатель задач может быть указан межсегментной инструкцией CALL. В случае размещения в IDT он может указываться инструкцией программного прерывания, исключительной ситуацией или аппаратным прерыванием. Таким же способом как описано выше, где бы ни указывался переключатель задач, он заставляет процессор автоматически выполнить переключение задач (см. главу 15).
Содержание Вперед
Сайт создан в системе uCoz