8. Инициализация микропроцессора    
 СОДЕРЖАНИЕ
 Введение
 1. Развитие архитектуры
 2. Структура МП
 3. Ресурсы МП
 4. Управление памятью
 5. Защита
 6. Многозадачность
 7. Прерывания и исключения
 8. Инициализация МП
 9. Эмуляция 8086
 Глоссарий
 ПРАКТИКА
 1. Семантический разрыв
 2. CPUID
 3. Защищенный режим
 Вопросы и задания

Аппаратный сброс

Аппаратный сброс (hardware reset) выполняется процессором при включении питания и по сигналу RESET#. По низкому уровню сигнала RESET# процессор прекращает выполнение инструкций и перестает управлять системной шиной. В момент окончания сигнала аппаратного сброса процессор воспринимает уровни сигналов на определенных линиях шины управления. Таким образом устанавливаются: коэффициент умножения тактовой частоты, режим работы кэша (write-back / write-through), роль процессора в многопроцессорных системах, способ подачи сигналов прерываний (для процессоров, имеющих АРIC) и некоторые другие параметры. Эти уровни задаются чипсетом системной платы в соответствии с ролью процессора и установками переключателей (перемычек) или CMOS Setup.

В микропроцессоре предусмотрены средства проверки функционирования трех основных программируемых логических матриц - точки входа, управления и тестирования, а также содержимого управляющего ПЗУ (CROM). Самотестирование запускается, когда в процессе инициализации становится активным вход BUSY#. Результат тестирования заносится в регистр ЕАХ. Если соответствующий элемент процессора успешно проходит тестирование, содержимое ЕАХ равно нулю. Если в ЕАХ не ноль, это значит, что самотестирование обнаружило неисправность.

Для МП 80386 при частоте 16 МГц на самотестирование уходит около 219 тактов или приблизительно 33 мс.

Сигнал RESET# формируется генератором тактовых сигналов. Для обеспечения инициализации уровень сигнала RESET# на входе микропроцессора должен оставаться высоким примерно в течение 15 периодов, в случае самотестирования - в течение 80 периодов. Аппаратный сброс аннулирует строки кэш-памяти, буферов ассоциативной трансляции (TLB) и таблиц переходов (BTB). После сброса процессор начинает выполнение инструкции, считанной по физическому адресу FFFFFFF0. Обычно по этому адресу расположена команда JMP, осуществляющая переход на программу начальной загрузки. Исполняемый программный код должен обеспечить инициализацию системы (регистров процессора, структур данных в памяти). Из этого следует, что, по крайней мере, на начальный период времени после сигнала RESET# компьютер должен иметь образ BIOS в адресах FFFFFFF0-FFFFFFFF, в то время как в компьютерах на основе 8086/88 ROM BIOS располагалась под границей первого мегабайта (FFFFF), а в AT-286 - под границей 16-го мегабайта (FFFFFF). Процессоры Р6 допускают смену положения вектора начального запуска на 0FFFF0h, правда, эта возможность практически нигде не используется (в Pentium 4 этой возможности уже нет).

Процессоры Pentium+ имеют дополнительный вход INIT#, по которому выполняются примерно те же действия, но не очищается внутренняя кэш-память, не изменяется состояние FPU и регистров MSR. Этот сигнал может использоваться для перевода процессора в реальный режим (в стиле 80286) с сохранением данных в кэше. Такой же "мягкий" сброс возможен и по сообщению, получаемому процессором по шине APIC.

Сброс переводит процессор в реальный режим и устанавливает ряд регистров в определенное состояние. Содержимое регистра ЕАХ зависит от результатов выполнения процедуры самотестирования при включении питания. В регистре DX размещаются идентификатор изделия и номер модификации. Поле DH содержит число, указывающее на тип процессора: 3 - 80386, 4 - i486, 5 - Pentium, 6 - P6, 15 - Pentium 4. В поле DL заносится номер модификации.

Состояние регистров процессора после инициализации:

РегистрСостояние (hex)
EFLAGSxxx00002
CR060000010
CR2, CR3, CR400000000
EIP0000FFF0
CS (селектор)
 База
 Передел
F000
FFFF0000
FFFF
SS,DS,ES,FS,GS
 База
 Передел
0000
00000000
FFFF
EAX00000000
EDX00000mmm
 mmm - модель CPU
EBX,ECX,ESI,EDI,EBP,ESP00000000
GDTR,IDTR
 База
 Передел

0000000
FFFF
LDTR,TR (селектор)
 База
 Передел
0000
0000000
FFFF
DR0-DR300000000
DR6FFFF0FF0
DR700000400

Подготовка к работе в реальном режиме

Перед тем как запускать программы в реальном режиме, следует инициализировать некоторые структуры. Для того, чтобы можно было выполнять команды с обращением к стеку, надо загрузить регистр сегмента стека SS. Он должен указывать на область оперативной памяти.

Сигнал RESET# автоматически устанавливает на адресных линиях А20-31 высокий уровень. Это позволяет инициализировать систему с помощью ПЗУ, расположенного в конце адресного пространства. Автоматическая установка адресных линий вместе с начальным значением CS:IP приводит к выполнению команды с физическим адресом FFFFFFF0h. С помощью внутрисегментных (ближних) форм команд передачи управления можно осуществить переход на другие адреса, принадлежащие верхним 64Кбайт адресного пространства. Первая же межсегментная команда JMP или CALL снимает высокий уровень с линий А31-20, после чего МП продолжает выполнять команды в нижнем мегабайте физической памяти.

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

Подготовка к работе в защищенном режиме

Переключение процессора в защищенный режим из реального осуществляется загрузкой в системный регистр CR0 слова с установленным битом РЕ (Protect Enable).

Как правило, большая часть действий по инициализации защищенного режима выполняется либо перед переключением в этот режим, либо непосредственно после переключения. Если инициализация осуществляется после переключения, выполняемые затем процедуры не должны использовать не инициализированные еще средства защищенного режима.

Процедура инициализации может выполняться в защищенном режиме перед инициализацией регистра задачи. Однако перед первым переключением задачи необходимо обеспечить следующее:

Регистр сегмента стека (SS) можно загружать и в защищенном режиме, и в реальном режимах. Если SS загрузить в реальном режиме, он и после переключения в защищенный режим продолжает указывать на тот же самый линейный базовый адрес.

Форматы таблицы прерываний отличаются в защищенном и реальном режимах. Поскольку невозможно одновременно переключить режим и изменить формат таблицы прерываний, неизбежно, что в течение некоторого времени IDTR будет определять таблицу прерываний с неправильным форматом. Прерывание или исключение в течение этого времени приведут к непредсказуемым результатам. Чтобы избежать этого, следует запретить прерывания до тех пор, пока не будут размещены все программы обработки прерываний и не будет создана правильная таблица дескрипторов прерываний IDT в защищенном режиме.

Таблицы страниц и регистр базы каталога страниц (PDBR) в CR3 можно инициализировать и в защищенном режиме, и в реальном режимах. Бит PG в CR0 нельзя устанавливать, пока МП 80386 не переключился в защищенный режим. Перед установкой бита PG инициализируйте PDBR в CR3 физическим адресом достоверного каталога страниц. Выберите один из двух способов обеспечения согласованной адресации до и после включения разбиения на страницы:

Регистр GDTR должен указывать на достоверную таблицу GDT перед тем, как содержимое какого-либо регистра изменяется в защищенном режиме. Таблицы GDT и LDT следует размещать в оперативной памяти, потому что МП модифицирует бит доступа в дескрипторах. Инициализацию GDT и GDTR можно провести в реальном режиме.

Переключение процессора из защищенного режима в реальный возможно не только через аппаратный сброс, как это было у 80286, но и с помощью сброса бита РЕ в CR0. до этого переключения также необходимо загрузить в сегментные регистры селекторы дескрипторов, описывающие свойства сегментов стандартного реального режима. Однако вместо этого можно создать и так называемый "нереальный" режим, отличающийся от реального возможностью доступа к сегментам большого (до 4 Гбайт) размера. Правда, у процессоров 80286 и 80386 лимит кодового сегмента принудительно ограничивается размером 64 Кбайт, но у более новых процессоров большой размер допустим для всех сегментов. "Нереальный режим" часто используется менеджерами памяти для DOS и игровыми программами, требующими большого объема памяти.