
Формат дескриптора tss
Дескриптор TSS определяет сегмент состояния задачи. Этот дескриптор описывает системный объект, т.к. бит S в нём равен 0 (это 44-й бит дескриптора или 4-й бит прав доступа). То, что дескриптор описывает системный объект означает, что непосредственно пользоваться этим объектом может только процессор, но не программа - любая попытка загрузки селектора этого дескриптора в сегментный регистр вызовет генерацию исключения общей защиты (#GP - прерывание 0Dh).
Как уже говорилось в предыдущей главе, в локальной дескрипторной таблице LDT нельзя использовать некоторые системные объекты. Т.к. дескрипторы LDT и TSS являются такими объектами, то их нельзя применять в LDT, иначе при обращении к ним будет генерироваться исключения. Смысл такого ограничения состоит в том, что задаче запрещено определять задачи внутри себя и устанавливать дополнительные дескрипторные таблицы и таким образом, эти действия может выполнять только ядро ОС.
Обратите внимание на то, что в сегменте состояния задачи нет полей для регистров модулей FPU, MMX и XMM. Дело в том, что не всякая задача работает с каким-либо из этих модулей и наличие дополнительных полей замедлило бы переключение задачи. Сегмент TSS и так достаточно большой, к тому же поля из него загружаются по одному - процессор выполняет проверку параметров значений каждого сегментного и системного регистра.
Если в системе несколько задач использует FPU, MMX и/или XMM, то при смене задач необходимо менять контекст соответствующего модуля. Процессор автоматически этого не делает, зато он создаёт условия для операционной системы, позволяя ей дополнить контекст задачи, например, сохранить состояние FPU, используемое старой задачей и загрузить в FPU значения, используемые новой задачей.
Порты ввода-вывода. Первое, что надо знать: стандартный диапазон адресов используемых портов ввода-вывода для IBM PC – совместимых компьютеров (исключение составляют компьютеры с шиной EISA) составляет от 1 до 3FFh включительно. Сюда входят порты контроллеров клавиатуры, жестких и гибких дисков,EGA/VGA, последовательных и параллельных портов и т.д.
Распределение адресов портов ввода-вывода
Диапазон адресов |
Использование | |
АТ |
ХТ | |
00 – 01F |
000 – 01F |
Контроллер DMA №1 |
020 – 03F |
020 – 021 |
Контроллер прерываний №1 |
040 – 05F |
040 – 043 |
Таймер |
— |
069 – 063 |
Программируемы или периферийный интерфейс,PPI |
060 – 06F |
— |
Контроллер клавиатуры 8042 |
070 – 07F |
— |
RTC, CMOS, RAM |
080 – 09F |
080 – 083 |
Порты DMA (регистры страниц) |
0A0 – DBF |
— |
Контроллер прерываний №2 |
0C0 – 0DF |
— |
Контроллер DMA №2 |
0F0 – 0FF |
— |
Математический сопроцессор |
170 – 177 |
— |
Жесткий диск (вторичный) |
1F0 – 1F7 |
— |
Жесткий диск |
200 – 207 |
200 – 20F |
Игровой порт |
278 – 27F |
278 – 27F |
Параллельный порт №2 |
2C0 – 2DF |
2C0 – 2DF |
Адаптер EGA №2 |
2F8 – 2FF |
2F8 – 2FF |
Последовательный порт №2 |
300 – 31F |
— |
Платы прототипов |
— |
320 – 32F |
Жесткий диск |
370 – 377 |
— |
Контроллер флоппи (вторичный) |
378 – 37F |
378 – 37F |
Параллельный порт №1 |
3B0 – 3DF |
3B0 – 3DF |
Адаптер VGA |
3C0 – 3CF |
3C0 – 3CF |
Адаптер EGA №1 |
3D0 – 3DF |
3D0 – 3DF |
Адаптеры CGA и EGA |
3F0 – 3F7 |
3F0 – 3F7 |
Контроллер флоппи |
3F8 – 3FF |
3F8 – 3FF |
Последовательный порт №1 |
Диапазон адресов портов ввода-вывода с 300h по 31 Fh предназначается для так называемых плат-прототипов (proto-type card), которые могут быть разработаны независимыми производителями. Об этом следует помнить, поскольку большое количество плат различных существующих адаптеров действительно используют этот диапазон адресов.
Напомним, что поры ввода-вывода, как правило, используются блоками. Иначе говоря, всегда имеется некий базовый адрес порта (часто указываемый в документации), а непосредственно за ним может последовать еще несколько адресов, также используемых для регистров данного устройства. Проще всего «по умолчанию» предположить, что адаптер после базового занимает еще 15 адресов, хотя на практике число последовательно задействованных портов для одного устройства обычно меньше.
Самый простой пример, на котором можно проиллюстрировать сказанное, — это адаптер параллельного интерфейса. Как известно, чаще всего этот адаптер используется для подключения принтера (принтер-порт). Так вот, начиная с базового, каждый такой адаптер реально занимает всего три адреса. Первый соответствует регистру данных, посылаемых от компьютера, второй (базовый адрес плюс 1) — регистру статуса и третий (базовый адрес плюс 2) — регистру управления. Таким образом, например, для LPT1, базовый адрес которого 370h, используются также порты 371h и 372h. Следует отметить, что, вообще говоря, для адаптера параллельного интерфейса в адресном пространстве портов резервируется 16 адресов: от 370h до 37F.